/**
 * Employee DTOs
 * @module HR
 */

import {
  IsString,
  IsOptional,
  IsBoolean,
  IsEmail,
  IsNumber,
  IsUUID,
  MaxLength,
  IsDateString,
  IsEnum,
  Min,
} from 'class-validator';
import { EstadoEmpleado, Genero } from '../entities/employee.entity';

export class CreateEmployeeDto {
  @IsString()
  @MaxLength(20)
  codigo: string;

  @IsString()
  @MaxLength(100)
  nombre: string;

  @IsString()
  @MaxLength(100)
  apellidoPaterno: string;

  @IsOptional()
  @IsString()
  @MaxLength(100)
  apellidoMaterno?: string;

  @IsOptional()
  @IsString()
  @MaxLength(18)
  curp?: string;

  @IsOptional()
  @IsString()
  @MaxLength(13)
  rfc?: string;

  @IsOptional()
  @IsString()
  @MaxLength(11)
  nss?: string;

  @IsOptional()
  @IsDateString()
  fechaNacimiento?: string;

  @IsOptional()
  @IsEnum(['M', 'F'])
  genero?: Genero;

  @IsOptional()
  @IsEmail()
  @MaxLength(255)
  email?: string;

  @IsOptional()
  @IsString()
  @MaxLength(20)
  telefono?: string;

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

  @IsDateString()
  fechaIngreso: string;

  @IsOptional()
  @IsDateString()
  fechaBaja?: string;

  @IsOptional()
  @IsUUID()
  puestoId?: string;

  @IsOptional()
  @IsString()
  @MaxLength(100)
  departamento?: string;

  @IsOptional()
  @IsString()
  @MaxLength(50)
  tipoContrato?: string;

  @IsOptional()
  @IsNumber()
  @Min(0)
  salarioDiario?: number;

  @IsOptional()
  @IsEnum(['activo', 'inactivo', 'baja'])
  estado?: EstadoEmpleado;

  @IsOptional()
  @IsString()
  @MaxLength(500)
  fotoUrl?: string;
}

export class UpdateEmployeeDto {
  @IsOptional()
  @IsString()
  @MaxLength(20)
  codigo?: string;

  @IsOptional()
  @IsString()
  @MaxLength(100)
  nombre?: string;

  @IsOptional()
  @IsString()
  @MaxLength(100)
  apellidoPaterno?: string;

  @IsOptional()
  @IsString()
  @MaxLength(100)
  apellidoMaterno?: string;

  @IsOptional()
  @IsString()
  @MaxLength(18)
  curp?: string;

  @IsOptional()
  @IsString()
  @MaxLength(13)
  rfc?: string;

  @IsOptional()
  @IsString()
  @MaxLength(11)
  nss?: string;

  @IsOptional()
  @IsDateString()
  fechaNacimiento?: string;

  @IsOptional()
  @IsEnum(['M', 'F'])
  genero?: Genero;

  @IsOptional()
  @IsEmail()
  @MaxLength(255)
  email?: string;

  @IsOptional()
  @IsString()
  @MaxLength(20)
  telefono?: string;

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

  @IsOptional()
  @IsDateString()
  fechaIngreso?: string;

  @IsOptional()
  @IsDateString()
  fechaBaja?: string;

  @IsOptional()
  @IsUUID()
  puestoId?: string;

  @IsOptional()
  @IsString()
  @MaxLength(100)
  departamento?: string;

  @IsOptional()
  @IsString()
  @MaxLength(50)
  tipoContrato?: string;

  @IsOptional()
  @IsNumber()
  @Min(0)
  salarioDiario?: number;

  @IsOptional()
  @IsEnum(['activo', 'inactivo', 'baja'])
  estado?: EstadoEmpleado;

  @IsOptional()
  @IsString()
  @MaxLength(500)
  fotoUrl?: string;
}
