import {
  Column,
  CreateDateColumn,
  Entity,
  JoinColumn,
  ManyToOne,
  PrimaryGeneratedColumn,
  type Relation,
} from 'typeorm';
import { User } from '../../user/entities/user.entity';
import { Task } from './task.entity';
import { TaskCheckpoint } from './task-checkpoint.entity';
import type {
  ChecklistCategory,
  ChecklistWorkStatus,
} from './checklist-item.entity';

// 보고 스냅샷의 항목 단위(보고 시점의 항목별 진행 상태를 동결 보관)
export interface ReportItemSnapshot {
  itemId: string;
  text: string;
  category: ChecklistCategory;
  workStatus: ChecklistWorkStatus;
}

// 중간 점검 보고 — 작업자가 점검일에 현재 진행 상태를 지시자에게 보낸 기록(스냅샷).
@Entity('checkpoint_reports')
export class CheckpointReport {
  @PrimaryGeneratedColumn('uuid')
  id!: string;

  // 소속 업무 (업무 삭제 시 함께 삭제)
  @ManyToOne(() => Task, { onDelete: 'CASCADE' })
  @JoinColumn({ name: 'task_id' })
  task!: Relation<Task>;

  // 대상 체크포인트 (점검일 삭제 시 보고도 함께 삭제)
  @ManyToOne(() => TaskCheckpoint, { onDelete: 'CASCADE' })
  @JoinColumn({ name: 'checkpoint_id' })
  checkpoint!: Relation<TaskCheckpoint>;

  // 보고한 작업자 (사용자 삭제 시에도 보고는 유지 — SET NULL)
  @ManyToOne(() => User, { onDelete: 'SET NULL', nullable: true })
  @JoinColumn({ name: 'reporter_id' })
  reporter!: User | null;

  // 보고 메모(선택)
  @Column({ type: 'text', nullable: true })
  note!: string | null;

  // 보고 시점의 항목별 진행 상태 스냅샷
  @Column({ name: 'items_snapshot', type: 'jsonb', default: () => "'[]'" })
  itemsSnapshot!: ReportItemSnapshot[];

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