import {
  Column,
  CreateDateColumn,
  Entity,
  Index,
  JoinColumn,
  JoinTable,
  ManyToMany,
  ManyToOne,
  PrimaryGeneratedColumn,
  UpdateDateColumn,
  type Relation,
} from 'typeorm';
import { User } from '../../user/entities/user.entity';
import { ScheduleCategory } from './schedule-category.entity';

// 일정(이벤트) — 전사 공유 캘린더의 단일 항목. 종일 기준, 다중일(start≠end) 지원.
@Entity('schedule_events')
// 주간 범위 조회(겹침 검색)에 사용되는 복합 인덱스
@Index(['startDate', 'endDate'])
export class ScheduleEvent {
  @PrimaryGeneratedColumn('uuid')
  id!: string;

  // 소속 카테고리(레인) — 카테고리 삭제 시 일정도 함께 삭제
  // Relation<> 래퍼: 엔티티 순환참조 회피
  @Index()
  @ManyToOne(() => ScheduleCategory, { onDelete: 'CASCADE', eager: true })
  @JoinColumn({ name: 'category_id' })
  category!: Relation<ScheduleCategory>;

  @Column({ type: 'varchar' })
  title!: string;

  // 시작·종료일(YYYY-MM-DD, 종일 기준). date 타입이라 문자열로 다룬다.
  @Column({ name: 'start_date', type: 'date' })
  startDate!: string;

  @Column({ name: 'end_date', type: 'date' })
  endDate!: string;

  // 표시용 시간 텍스트(예: "09:30 – 10:00", "종일") — 프론트 모달이 조립
  @Column({ type: 'varchar', default: '' })
  time!: string;

  @Column({ type: 'varchar', nullable: true })
  place!: string | null;

  @Column({ type: 'text', nullable: true })
  description!: string | null;

  // 전 직원 대상 여부 — true 면 개별 참석자 대신 "전 직원"으로 표시
  @Column({ name: 'all_hands', type: 'boolean', default: false })
  allHands!: boolean;

  // 개별 참석자(전 직원이 아닐 때). 조인 테이블로 다대다 매핑.
  @ManyToMany(() => User)
  @JoinTable({
    name: 'schedule_event_attendees',
    joinColumn: { name: 'event_id', referencedColumnName: 'id' },
    inverseJoinColumn: { name: 'user_id', referencedColumnName: 'id' },
  })
  attendees!: User[];

  // 작성자 — 사용자 삭제 시에도 일정은 유지(SET NULL)
  @ManyToOne(() => User, { onDelete: 'SET NULL', nullable: true })
  @JoinColumn({ name: 'created_by' })
  createdBy!: User | null;

  @CreateDateColumn({ name: 'created_at' })
  createdAt!: Date;

  @UpdateDateColumn({ name: 'updated_at' })
  updatedAt!: Date;
}
