import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
import { Transform } from 'class-transformer';
import {
  IsBoolean,
  IsDateString,
  IsIn,
  IsInt,
  IsOptional,
  IsString,
  IsUUID,
  Max,
  Min,
} from 'class-validator';

export const SOLICITUD_TIPOS = [
  'VACACION',
  'PERMISO',
  'LICENCIA_MEDICA',
  'LICENCIA_MATERNIDAD',
] as const;
export const SOLICITUD_ESTADOS = [
  'SOLICITADO',
  'APROBADO',
  'RECHAZADO',
  'CANCELADO',
] as const;

export class CreateSolicitudVacacionesDto {
  @ApiProperty()
  @IsUUID()
  empleado_id!: string;

  @ApiProperty()
  @IsDateString()
  fecha_inicio!: string;

  @ApiProperty()
  @IsDateString()
  fecha_fin!: string;

  @ApiProperty({ enum: SOLICITUD_TIPOS })
  @IsString()
  @IsIn(SOLICITUD_TIPOS as unknown as string[])
  tipo!: (typeof SOLICITUD_TIPOS)[number];

  @ApiPropertyOptional({ default: false })
  @IsOptional()
  @IsBoolean()
  afecta_salario?: boolean;

  @ApiPropertyOptional()
  @IsOptional()
  @IsString()
  observacion?: string;
}

export class UpdateSolicitudVacacionesDto {
  @ApiPropertyOptional()
  @IsOptional()
  @IsDateString()
  fecha_inicio?: string;

  @ApiPropertyOptional()
  @IsOptional()
  @IsDateString()
  fecha_fin?: string;

  @ApiPropertyOptional({ enum: SOLICITUD_TIPOS })
  @IsOptional()
  @IsString()
  @IsIn(SOLICITUD_TIPOS as unknown as string[])
  tipo?: (typeof SOLICITUD_TIPOS)[number];

  @ApiPropertyOptional()
  @IsOptional()
  @IsBoolean()
  afecta_salario?: boolean;

  @ApiPropertyOptional()
  @IsOptional()
  @IsString()
  observacion?: string;
}

export class AccionSolicitudDto {
  @ApiPropertyOptional()
  @IsOptional()
  @IsString()
  comentario?: string;
}

export class QuerySolicitudesDto {
  @ApiPropertyOptional({ default: 1 })
  @IsOptional()
  @Transform(({ value }) => parseInt(String(value), 10) || 1)
  @IsInt()
  @Min(1)
  page?: number = 1;

  @ApiPropertyOptional({ default: 20 })
  @IsOptional()
  @Transform(({ value }) => parseInt(String(value), 10) || 20)
  @IsInt()
  @Min(1)
  @Max(200)
  limit?: number = 20;

  @ApiPropertyOptional({ enum: SOLICITUD_ESTADOS })
  @IsOptional()
  @IsString()
  @IsIn(SOLICITUD_ESTADOS as unknown as string[])
  estado?: string;

  @ApiPropertyOptional({ enum: SOLICITUD_TIPOS })
  @IsOptional()
  @IsString()
  @IsIn(SOLICITUD_TIPOS as unknown as string[])
  tipo?: string;

  @ApiPropertyOptional()
  @IsOptional()
  @IsUUID()
  empleado_id?: string;
}

export class QuerySaldosDto {
  @ApiPropertyOptional({ description: 'Año del saldo. Por defecto, el actual.' })
  @IsOptional()
  @Transform(({ value }) => (value ? parseInt(String(value), 10) : undefined))
  @IsInt()
  @Min(2000)
  @Max(2100)
  anio?: number;

  @ApiPropertyOptional()
  @IsOptional()
  @IsUUID()
  empleado_id?: string;
}

export class RecalcularSaldosDto {
  @ApiPropertyOptional({ description: 'Año a recalcular. Por defecto, el actual.' })
  @IsOptional()
  @IsInt()
  @Min(2000)
  @Max(2100)
  anio?: number;

  @ApiPropertyOptional({ description: 'Si se especifica, recalcula solo ese empleado' })
  @IsOptional()
  @IsUUID()
  empleado_id?: string;
}
