import {
  Entity,
  PrimaryGeneratedColumn,
  Column,
  ManyToOne,
  OneToMany,
  JoinColumn,
  CreateDateColumn,
  UpdateDateColumn,
  Index,
} from 'typeorm';
import { User } from '../../user/entities/user.entity';
import { AuditScheduleRow } from './audit-schedule-row.entity';

export enum ScheduleStatus {
  DRAFT = 'DRAFT',
  PUBLISHED = 'PUBLISHED',
  COMPLETED = 'COMPLETED',
  CANCELLED = 'CANCELLED',
}

@Entity({ name: 'audit_schedules' })
export class AuditSchedule {
  @PrimaryGeneratedColumn()
  id: number;

  @Index()
  @Column({ type: 'date' })
  schedule_date: string;

  @Column({ type: 'varchar', length: 255, nullable: true })
  title: string;

  @Column({ type: 'varchar', length: 50, nullable: true })
  client_group: string;

  // Coordinator who owns this schedule
  @Column({ type: 'int', nullable: true })
  coordinator_id: number;

  @ManyToOne(() => User, { nullable: true })
  @JoinColumn({ name: 'coordinator_id' })
  coordinator: User;

  @Column({ type: 'varchar', length: 255, nullable: true })
  source_email: string;

  @Index()
  @Column({
    type: 'enum',
    enum: ScheduleStatus,
    default: ScheduleStatus.DRAFT,
  })
  status: ScheduleStatus;

  @Column({ type: 'text', nullable: true })
  notes: string;

  // Who created the schedule (often = coordinator, but kept separate)
  @Column({ type: 'int', nullable: true })
  created_by_id: number;

  @ManyToOne(() => User, { nullable: true })
  @JoinColumn({ name: 'created_by_id' })
  created_by: User;

  @CreateDateColumn()
  created_at: Date;

  @UpdateDateColumn()
  updated_at: Date;

  // Audit rows inside this schedule
  @OneToMany(() => AuditScheduleRow, (row) => row.schedule, {
    cascade: ['insert', 'update'],
  })
  rows: AuditScheduleRow[];
}
