import {
  Entity, PrimaryGeneratedColumn, Column, ManyToOne, JoinColumn, CreateDateColumn, UpdateDateColumn, Unique,
} from 'typeorm';
import { AuditReport } from './audit-report.entity';
import type { GroupKey } from './clause-library.entity';

export type FindingStatus = 'C' | 'NC' | 'OFI' | 'NA';

/**
 * The auditor's answer for one checkpoint. heading / title / requirement are COPIED from
 * clause_library when the report is created, so editing the library later never changes
 * an existing report.
 */
@Entity({ name: 'audit_report_clauses' })
@Unique('uq_report_clause', ['report_id', 'group_key', 'code'])
export class AuditReportClause {
  @PrimaryGeneratedColumn() id: number;

  @Column({ type: 'int' }) report_id: number;
  @ManyToOne(() => AuditReport, (r) => r.clauses, { onDelete: 'CASCADE' })
  @JoinColumn({ name: 'report_id' })
  report: AuditReport;

  @Column({ type: 'enum', enum: ['clause', 'performance', 'risk', 'feedback', 'statutory'], default: 'clause' })
  group_key: GroupKey;
  @Column({ type: 'varchar', length: 40 }) code: string;
  @Column({ type: 'varchar', length: 200, default: '' }) heading: string;
  @Column({ type: 'varchar', length: 255, default: '' }) title: string;
  @Column({ type: 'text', nullable: true }) requirement: string | null;

  @Column({ type: 'enum', enum: ['C', 'NC', 'OFI', 'NA'], nullable: true }) status: FindingStatus | null;
  @Column({ type: 'text', nullable: true }) evidence_text: string | null;
  /** Original (standard) wording copied from clause_library.default_evidence. Shown/printed when the row is C and the auditor wrote nothing. */
  @Column({ type: 'text', nullable: true }) default_evidence: string | null;
  @Column({ type: 'json', nullable: true }) docs_reviewed: string[] | null;

  /** Set when an NC / observation was raised from this row (links to nc__ncs / ncr_entries). */
  @Column({ type: 'int', nullable: true }) nc_id: number | null;
  @Column({ type: 'int', nullable: true }) ncr_entry_id: number | null;

  @Column({ type: 'int', default: 0 }) sort_order: number;

  @CreateDateColumn() created_at: Date;
  @UpdateDateColumn() updated_at: Date;
}
