import {
  Entity,
  PrimaryGeneratedColumn,
  Column,
  ManyToOne,
  ManyToMany,
  JoinTable,
  CreateDateColumn,
  UpdateDateColumn,
  JoinColumn,
} from 'typeorm';
import { Company } from '../../companies/entities/company.entity';
import { Standard } from '../../standards/entities/standard.entity';
import { User } from './../../user/entities/user.entity';

export enum InquiryType {
  SURVEILLANCE = 'SURVEILLANCE',
  RE_CERTIFICATION = 'RE_CERTIFICATION',
  INITIAL = 'INITIAL',
}

// ✅ NEW — Certification body (QRS, TQS)
export enum CertBody {
  QRS = 'QRS',
  TQS = 'TQS',
}

// ✅ NEW — Audit stage (Stage 1 / Stage 2 / Surveillance / Recertification)
export enum AuditStage {
  STAGE_1 = 'Stage 1',
  STAGE_2 = 'Stage 2',
  SURVEILLANCE = 'Surveillance',
  RECERTIFICATION = 'Recertification',
}

export enum InquiryStatus {
  PENDING = 'PENDING',
  IN_REVIEW = 'IN_REVIEW',
  DRAFT_READY = 'DRAFT_READY',
  CHANGES_REQUESTED = 'CHANGES_REQUESTED',
  CLIENT_CONFIRMED = 'CLIENT_CONFIRMED',
  FINAL_ISSUED = 'FINAL_ISSUED',
}

// ── Document attachment types ───────────────────────────────
export type InquiryDocumentType =
  | 'trade_license'
  | 'previous_certificate'
  | 'audit_report'
  | 'scope_letter'
  | 'other';

export interface InquiryDocument {
  type: InquiryDocumentType;
  path: string; // e.g. "uploads/inquiries/123/trade_lic.pdf"
  filename: string; // original filename
  uploaded_at: string; // ISO timestamp
  uploaded_by?: number; // user id who uploaded
}

@Entity('inquiries')
export class Inquiry {
  @PrimaryGeneratedColumn()
  id!: number;

  @Column({ unique: true })
  inquiry_ref!: string;

  // ── Marketing fills ──────────────────────────────────────────
  @Column({ type: 'enum', enum: InquiryType })
  inquiry_type!: InquiryType;

  @Column({ type: 'date' })
  audit_date!: string;

  @Column()
  auditor_name!: string;

  @Column({ nullable: true })
  previous_cert_no?: string;

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

  @Column({ nullable: true, type: 'simple-json' })
  documents?: InquiryDocument[];

  // ── Scheme fills ─────────────────────────────────────────────
  @Column({ nullable: true })
  certificate_number?: string;

  @Column({ nullable: true, type: 'date' })
  issue_date?: string;

  @Column({ nullable: true, type: 'date' })
  expiry_date?: string;

  @Column({ nullable: true })
  accreditation_body?: string;

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

  @Column({ nullable: true })
  draft_certificate_path?: string;

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

  // ── Status ───────────────────────────────────────────────────
  @Column({ type: 'enum', enum: InquiryStatus, default: InquiryStatus.PENDING })
  status!: InquiryStatus;

  // ── Relations ────────────────────────────────────────────────
  @ManyToOne(() => Company, { eager: false, nullable: false })
  @JoinColumn({ name: 'company_id' })
  company!: Company;

  @ManyToMany(() => Standard, { eager: true })
  @JoinTable({
    name: 'inquiry_standards',
    joinColumn: {
      name: 'inquiry_id',
      referencedColumnName: 'id',
    },
    inverseJoinColumn: {
      name: 'standard_id',
      referencedColumnName: 'id',
    },
  })
  standards!: Standard[];

  @ManyToOne(() => User, { eager: true, nullable: true })
  @JoinColumn({ name: 'submitted_by_id' })
  submitted_by?: User;

  @ManyToOne(() => User, { eager: true, nullable: true })
  @JoinColumn({ name: 'assigned_to_id' })
  assigned_to?: User;

  // ✅ NEW — Which certification body this inquiry belongs to
  @Column({ type: 'enum', enum: CertBody, nullable: true })
  cert_body?: CertBody;

  // ✅ NEW — Audit stage (Stage 1 / Stage 2 / Surveillance / Recertification)
  @Column({ type: 'enum', enum: AuditStage, nullable: true })
  audit_stage?: AuditStage;

  @CreateDateColumn()
  created_at!: Date;

  // Add this alongside draft_certificate_path
  @Column({ nullable: true })
  draft_docx_path?: string;

  @Column({ nullable: true })
  draft_pdf_path?: string;

  // ✅ tracks when the draft was last regenerated (for cache-busting)
  @Column({ type: 'datetime', nullable: true })
  draft_generated_at: Date | null;

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

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

  @UpdateDateColumn()
  updated_at!: Date;
}