import {
  IsArray,
  IsEnum,
  IsInt,
  IsOptional,
  IsString,
  ValidateNested,
  IsDateString,
} from 'class-validator';
import { Type } from 'class-transformer';

class UpdatePreviousNcCoreDto {
  @IsOptional()
  @IsString()
  auditee_name?: string | null;

  @IsOptional()
  @IsString()
  audit_type?: string | null;

  @IsOptional()
  @IsString()
  nc_type?: string | null;

  @IsOptional()
  @IsEnum(['open', 'closed'])
  status?: 'open' | 'closed';

  @IsOptional()
  @IsString()
  follow_up_date?: string | null;

  @IsOptional()
  @IsString()
  follow_up_notes?: string | null;

  @IsOptional()
  @IsString()
  remark?: string | null;

  @IsOptional()
  @IsString()
  due_date?: string | null;
}

class UpdatePreviousNcEntryDto {
  @IsInt()
  id!: number;

  @IsOptional()
  @IsString()
  nc_type?: string;

  @IsOptional()
  @IsString()
  ncr_statement?: string;

  @IsOptional()
  @IsString()
  criteria_clause?: string;

  @IsOptional()
  @IsString()
  corrective_action?: string;

  @IsOptional()
  @IsEnum(['open', 'closed', 'pending'])
  status?: 'open' | 'closed' | 'pending';
}

// 🆕 Brand-new findings added while editing an existing NC.
// Same shape as UpdatePreviousNcEntryDto but WITHOUT a required `id`
// (these rows don't exist yet) and `ncr_statement` is required.
class NewPreviousNcFindingDto {
  @IsString()
  ncr_statement!: string;

  @IsOptional()
  @IsString()
  nc_type?: string;

  @IsOptional()
  @IsString()
  criteria_clause?: string;

  @IsOptional()
  @IsString()
  corrective_action?: string;

  @IsOptional()
  @IsEnum(['open', 'closed', 'pending'])
  status?: 'open' | 'closed' | 'pending';
}

export class UpdatePreviousNcDto {
  @IsOptional()
  @ValidateNested()
  @Type(() => UpdatePreviousNcCoreDto)
  nc?: UpdatePreviousNcCoreDto;

  @IsOptional()
  @IsArray()
  @ValidateNested({ each: true })
  @Type(() => UpdatePreviousNcEntryDto)
  entries?: UpdatePreviousNcEntryDto[];

  @IsOptional()
  @IsString()
  new_remark?: string;

  // 🆕 New findings to INSERT into ncr_entries during an edit.
  @IsOptional()
  @IsArray()
  @ValidateNested({ each: true })
  @Type(() => NewPreviousNcFindingDto)
  new_findings?: NewPreviousNcFindingDto[];
}