import {
  Entity,
  Column,
  PrimaryGeneratedColumn,
  ManyToOne,
  JoinColumn,
  CreateDateColumn,
  UpdateDateColumn,
  JoinTable,
  ManyToMany,
} from 'typeorm';
import { Company } from '../../companies/entities/company.entity';
import { CompanyAuditStage } from '../../company-audit-stages/entities/company-audit-stage.entity';
import { User } from '../../user/entities/user.entity';
import { Standard } from '../../standards/entities/standard.entity';
import { Template } from 'src/template/entities/template.entity';

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

export enum RiskLevel {
  LOW = 'Low',
  MEDIUM = 'Medium',
  HIGH = 'High',
}

@Entity('jobs')
export class Job {
  @PrimaryGeneratedColumn()
  id: number;

  @Column({ unique: true, length: 255 })
  jobCode: string;

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

  @Column({ type: 'json', nullable: true })
  templateSnapshot: {
    id: number;
    name: string;
    stageName: string;
    version: string;
    filePath: string;
    isActive: boolean;
    contents: any[];
  };
  @Column({ type: 'varchar', length: 255, nullable: true })
  companyName: string;

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

  @Column({ type: 'text', nullable: true })
  companyScope: string;
  @Column({ type: 'json', nullable: true })
  companySnapshot: any;

  @Column({ default: false })
  isPdfGenerated: boolean;

  @Column({ nullable: true })
  pdfPath: string;

  @ManyToOne(() => CompanyAuditStage)
  @JoinColumn({ name: 'audit_stage_id' })
  auditStage: CompanyAuditStage;

  @Column({
    type: 'enum',
    enum: StageEnum,
  })
  stage: StageEnum;

  @ManyToOne(() => User)
  @JoinColumn({ name: 'lead_auditor_id' })
  leadAuditor: User;

  @ManyToMany(() => Standard)
  @JoinTable({
    name: 'job_standards',
    joinColumn: { name: 'job_id', referencedColumnName: 'id' },
    inverseJoinColumn: { name: 'standard_id', referencedColumnName: 'id' },
  })
  standards: Standard[];

  @ManyToOne(() => Template, { eager: true })
  @JoinColumn({ name: 'template_id' })
  template: Template;

  @Column({ type: 'date' })
  date: Date;

  @Column({ type: 'date', nullable: true })
  docReview?: Date;

  @Column({ type: 'int', nullable: true })
  numEmployees: number;

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

  @Column({ type: 'varchar', nullable: true })
  md: string;

  @Column({
    type: 'enum',
    enum: RiskLevel,
    default: RiskLevel.LOW,
  })
  mdRisk: RiskLevel;

  @Column({
    type: 'enum',
    enum: ['MORNING', 'AFTERNOON'],
    default: 'MORNING',
  })
  @Column({ nullable: true })
  scheduleSlot: 'MORNING' | 'AFTERNOON' | 'FULL';

  @Column({ nullable: true })
  expectedSurveillanceDate: Date;

  @Column({ nullable: true })
  expectedIADate: Date;

  @Column({ nullable: true })
  expectedMRMDate: Date;

  @Column({ nullable: true })
  expectedInitialInquiryDate: Date;

   @Column({ nullable: true })
  expectedInitial_Stage1_Date: Date;

  @Column({ nullable: true })
  prepareDate: Date;

  @Column({ nullable: true })
  approvedDate: Date;

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

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