/**
 * CreateIncidenteDto - DTO para crear incidentes de seguridad
 *
 * @module HSE
 * @rf RF-MAA017-001
 */

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

/**
 * DTO para persona involucrada en el incidente
 */
export class InvolucradoDto {
  /**
   * ID del empleado involucrado
   */
  @IsUUID('4', { message: 'empleadoId debe ser un UUID valido' })
  @IsNotEmpty()
  empleadoId: string;

  /**
   * Tipo de involucramiento
   */
  @IsEnum(['lesionado', 'testigo', 'responsable'], {
    message: 'Tipo de involucramiento invalido',
  })
  tipoInvolucramiento: string;

  /**
   * Descripcion de lesiones (si aplica)
   */
  @IsOptional()
  @IsString()
  descripcionLesiones?: string;
}

/**
 * DTO para crear un incidente de seguridad
 */
export class CreateIncidenteDto {
  /**
   * Fecha y hora del incidente (ISO 8601)
   * @example '2026-02-03T14:30:00Z'
   */
  @IsDateString({}, { message: 'Formato de fecha invalido' })
  @IsNotEmpty({ message: 'La fecha y hora son requeridas' })
  fechaHora: string;

  /**
   * ID del fraccionamiento/obra donde ocurrio
   */
  @IsUUID('4', { message: 'fraccionamientoId debe ser un UUID valido' })
  @IsNotEmpty({ message: 'El fraccionamiento es requerido' })
  fraccionamientoId: string;

  /**
   * Descripcion de la ubicacion especifica
   * @example 'Zona de excavacion, frente 3'
   */
  @IsOptional()
  @IsString()
  ubicacionDescripcion?: string;

  /**
   * Coordenadas geograficas (formato WKT)
   * @example 'POINT(-100.3899 25.6866)'
   */
  @IsOptional()
  @IsString()
  ubicacionGeo?: string;

  /**
   * Tipo de incidente
   */
  @IsEnum(['accidente', 'incidente', 'casi_accidente'], {
    message: 'Tipo de incidente invalido',
  })
  @IsNotEmpty({ message: 'El tipo es requerido' })
  tipo: string;

  /**
   * Gravedad del incidente
   */
  @IsEnum(['leve', 'moderado', 'grave', 'fatal'], {
    message: 'Gravedad invalida',
  })
  @IsNotEmpty({ message: 'La gravedad es requerida' })
  gravedad: string;

  /**
   * Descripcion detallada del incidente
   * @example 'Trabajador sufrio corte menor en mano izquierda al manipular lamina'
   */
  @IsString()
  @IsNotEmpty({ message: 'La descripcion es requerida' })
  descripcion: string;

  /**
   * Causa inmediata identificada
   * @example 'Falta de uso de guantes de proteccion'
   */
  @IsOptional()
  @IsString()
  causaInmediata?: string;

  /**
   * Causa basica/raiz identificada
   * @example 'Falta de capacitacion en manejo de materiales'
   */
  @IsOptional()
  @IsString()
  causaBasica?: string;

  /**
   * Estado inicial del incidente
   * @default 'abierto'
   */
  @IsOptional()
  @IsEnum(['abierto', 'en_investigacion', 'cerrado'], {
    message: 'Estado invalido',
  })
  estado?: string;

  /**
   * Lista de personas involucradas
   */
  @IsOptional()
  @IsArray()
  @ValidateNested({ each: true })
  @Type(() => InvolucradoDto)
  involucrados?: InvolucradoDto[];
}
