import {
  IsString,
  IsDateString,
  IsOptional,
  IsEnum,
  IsInt,
  IsArray,
  ArrayMinSize,
  IsNotEmpty,
} from 'class-validator';
import { Type } from 'class-transformer';
import {
  AuditType,
  AuditMode,
  CancellationReason,
  RowStatus,
} from '../entities/audit-schedule-row.entity';

export class UpdateAuditRowDto {
  @IsOptional()
  @IsEnum(AuditType)
  audit_type?: AuditType;

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

  @IsOptional()
  @IsEnum(AuditMode)
  audit_mode?: AuditMode;

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

  @IsOptional()
  @IsInt()
  company_id?: number;

  @IsOptional()
  @IsInt()
  lead_auditor_id?: number;

  // 🆕 Replace the co-auditor list (send [] to clear)
  @IsOptional()
  @IsArray()
  @IsInt({ each: true })
  @Type(() => Number)
  co_auditor_ids?: number[];

  @IsOptional()
  @IsArray()
  @ArrayMinSize(1)
  @IsInt({ each: true })
  standard_ids?: number[];

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

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

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

  @IsOptional()
  @IsEnum(RowStatus)
  status?: RowStatus;
}

// ─── Cancel a row ──────────────────────────────────────────────
export class CancelAuditRowDto {
  @IsEnum(CancellationReason)
  cancellation_reason: CancellationReason;

  @IsString()
  @IsNotEmpty()
  cancellation_notes: string;
}

// ─── Reschedule a row (audit_code preserved) ───────────────────
export class RescheduleAuditRowDto {
  @IsDateString()
  new_audit_date: string;

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

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

  @IsString()
  @IsNotEmpty()
  reschedule_reason: string;

  // Optionally re-assign the auditor(s) on the new date
  @IsOptional()
  @IsInt()
  new_lead_auditor_id?: number;

  @IsOptional()
  @IsArray()
  @IsInt({ each: true })
  @Type(() => Number)
  new_co_auditor_ids?: number[];
}

// ─── Bulk cancel (all rows in a schedule) ─────────────────────
export class BulkCancelDto {
  @IsEnum(CancellationReason)
  cancellation_reason: CancellationReason;

  @IsString()
  @IsNotEmpty()
  cancellation_notes: string;
}
