import {
  Column,
  CreateDateColumn,
  Entity,
  Index,
  JoinColumn,
  ManyToOne,
  PrimaryGeneratedColumn,
  type Relation,
} from 'typeorm';
import { User } from '../../user/entities/user.entity';

// 화상회의 방 — 방 이름과 진행자(생성자)를 보관한다.
// 단계 2(경량): 방 이름으로 토큰을 처음 발급받은 사용자가 진행자(host)가 되고,
//   이후 입장자는 일반 참여자가 된다. (방 목록/예약/참여 제한 UI 는 단계 4)
@Entity('meeting_rooms')
export class MeetingRoom {
  @PrimaryGeneratedColumn('uuid')
  id!: string;

  // 방 입장 코드(고유·불변) — 입장 URL·LiveKit 방 식별자·초대 링크의 기준.
  // 이름과 분리해, 이름을 바꿔도 링크/세션이 유지된다.
  @Index({ unique: true })
  @Column()
  code!: string;

  // 방 이름(표시용 라벨) — 고유하지 않으며 진행자가 자유롭게 변경할 수 있다.
  @Column()
  name!: string;

  // 진행자(생성자). 사용자 삭제 시에도 방 기록은 유지(SET NULL)
  @ManyToOne(() => User, { onDelete: 'SET NULL', nullable: true })
  @JoinColumn({ name: 'host_id' })
  host!: Relation<User> | null;

  // 예약 시각(선택) — 표시용. 현재는 시간 전 입장을 막지 않는다.
  @Column({ name: 'scheduled_at', type: 'timestamp', nullable: true })
  scheduledAt!: Date | null;

  // 참여 허용 사용자 ID 목록(선택) — 비어있으면(null) 전체 공개.
  // 값이 있으면 진행자 + 목록에 포함된 사용자만 입장 가능.
  @Column({ name: 'allowed_user_ids', type: 'simple-array', nullable: true })
  allowedUserIds!: string[] | null;

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