import {
  Entity,
  Column,
  PrimaryGeneratedColumn,
  ManyToOne,
  ManyToMany,
  OneToMany,
  JoinColumn,
  JoinTable,
  CreateDateColumn,
  UpdateDateColumn,
} from 'typeorm';
import { Company } from './../../companies/entities/company.entity';
import { AuditType } from './../../audit-types/entities/audit-type.entity';
import { Standard } from './../../standards/entities/standard.entity';
import { CompanyAuditStage } from './../../company-audit-stages/entities/company-audit-stage.entity';

export enum AuditMode {
  PHYSICAL = 'Physical',
  ONLINE = 'Online',
  HYBRID = 'Hybrid',
}

export enum AuditStatus {
  SCHEDULED = 'Scheduled',
  ONGOING = 'Ongoing',
  COMPLETED = 'Completed',
  CANCELLED = 'Cancelled',
}

export enum AuditPhase {
  STAGE1 = 'Stage 1',
  STAGE2 = 'Stage 2',
  SURVEILLANCE = 'Surveillance',
  RECERTIFICATION = 'Recertification',
}

@Entity('company_audits')
export class CompanyAudit {
  @PrimaryGeneratedColumn()
  id: number;

  @ManyToOne(() => Company)
  @JoinColumn({ name: 'company_id' })
  company: Company;

  @ManyToOne(() => AuditType)
  @JoinColumn({ name: 'audit_type_id' })
  auditType: AuditType;

  // Keep single standard relation for backward compatibility
  @ManyToOne(() => Standard, { nullable: true })
  @JoinColumn({ name: 'standard_id' })
  standard: Standard;

  // Support multiple standards
  @ManyToMany(() => Standard)
  @JoinTable({
    name: 'company_audits_standards', // junction table
    joinColumn: { name: 'audit_id', referencedColumnName: 'id' },
    inverseJoinColumn: { name: 'standard_id', referencedColumnName: 'id' },
  })
  standards?: Standard[];

  @Column({ unique: true, length: 150 })
  auditCode: string;

  @Column({ nullable: true, length: 50 })
  validityPeriod: string;

  @Column({
    type: 'enum',
    enum: AuditMode,
    default: AuditMode.PHYSICAL,
  })
  auditMode: AuditMode;

  @Column({
    type: 'enum',
    enum: AuditStatus,
    default: AuditStatus.SCHEDULED,
  })
  status: AuditStatus;

  @Column({
    type: 'enum',
    enum: AuditPhase,
    nullable: true,
  })
  currentStage?: AuditPhase; // Track the current stage

  @OneToMany(() => CompanyAuditStage, (stage) => stage.audit, { cascade: true })
  stages: CompanyAuditStage[];

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

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

  @UpdateDateColumn({ name: 'updated_at' })
  updatedAt: Date;

  standardId: number; // keep this for backward compatibility
}
