import {
  Entity,
  PrimaryGeneratedColumn,
  Column,
  ManyToOne,
  OneToMany,
  JoinColumn,
  CreateDateColumn,
  UpdateDateColumn,
  Index,
  Unique,
} from 'typeorm';
import { AuditChecklist } from './audit-checklist.entity';
import { ChecklistTemplateItem } from './checklist-template-item.entity';
import { User } from '../../user/entities/user.entity';
import { ChecklistItemHistory } from './checklist-item-history.entity';

export enum ChecklistItemStatus {
  MISSING = 'missing',
  UPLOADED = 'uploaded',
  APPROVED = 'approved',
  REJECTED = 'rejected',
}

@Entity({ name: 'audit_checklist_items' })
@Unique('uq_checklist_item_per_audit', ['audit_checklist_id', 'template_item_id'])
export class AuditChecklistItem {
  @PrimaryGeneratedColumn()
  id: number;

  @Index()
  @Column({ type: 'int' })
  audit_checklist_id: number;

  @ManyToOne(() => AuditChecklist, (checklist) => checklist.items, {
    onDelete: 'CASCADE',
  })
  @JoinColumn({ name: 'audit_checklist_id' })
  audit_checklist: AuditChecklist;

  @Column({ type: 'int' })
  template_item_id: number;

  @ManyToOne(() => ChecklistTemplateItem, { nullable: false })
  @JoinColumn({ name: 'template_item_id' })
  template_item: ChecklistTemplateItem;

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

  @Column({ type: 'varchar', length: 500, nullable: true })
  document_path: string | null;

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

  @Column({ type: 'int', nullable: true })
  uploaded_by: number | null;

  @ManyToOne(() => User, { nullable: true })
  @JoinColumn({ name: 'uploaded_by' })
  uploaded_by_user: User | null;

  @Column({ type: 'timestamp', nullable: true })
  uploaded_at: Date | null;

  @Column({ type: 'int', nullable: true })
  reviewed_by: number | null;

  @ManyToOne(() => User, { nullable: true })
  @JoinColumn({ name: 'reviewed_by' })
  reviewed_by_user: User | null;

  @Column({ type: 'timestamp', nullable: true })
  reviewed_at: Date | null;

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

  @OneToMany(() => ChecklistItemHistory, (h) => h.audit_checklist_item)
  history: ChecklistItemHistory[];

  @CreateDateColumn()
  created_at: Date;

  @UpdateDateColumn()
  updated_at: Date;
}
