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

export const TIPOS_FECHA = ['cumpleanos', 'aniversario', 'otra'] as const;
export const CANALES_FECHA = ['whatsapp', 'email', 'llamada', 'visita'] as const;

export class CreateFechaEspecialDto {
  @ApiPropertyOptional({ description: 'Cliente dueño de la fecha. Excluyente con lead_id.' })
  @IsUUID()
  @IsOptional()
  cliente_id?: string;

  @ApiPropertyOptional({ description: 'Lead dueño de la fecha. Excluyente con cliente_id.' })
  @IsUUID()
  @IsOptional()
  lead_id?: string;

  @ApiProperty({ enum: TIPOS_FECHA })
  @IsIn(TIPOS_FECHA as unknown as string[])
  tipo: string;

  @ApiPropertyOptional({ example: 'Cumpleaños de la hija' })
  @IsString()
  @MaxLength(150)
  @IsOptional()
  descripcion?: string;

  @ApiPropertyOptional({ description: 'A quién saludar si no es el titular', example: 'Sofía' })
  @IsString()
  @MaxLength(150)
  @IsOptional()
  destinatario_nombre?: string;

  @ApiProperty({ example: 15, description: 'Día del mes (1–31)' })
  @IsInt()
  @Min(1)
  @Max(31)
  dia: number;

  @ApiProperty({ example: 5, description: 'Mes (1–12)' })
  @IsInt()
  @Min(1)
  @Max(12)
  mes: number;

  @ApiPropertyOptional({ example: 1985, description: 'Opcional: de un cumpleaños casi nunca se sabe' })
  @IsInt()
  @Min(1900)
  @Max(2200)
  @IsOptional()
  anio?: number;

  @ApiPropertyOptional({ example: 7, default: 7 })
  @IsInt()
  @Min(0)
  @Max(90)
  @IsOptional()
  recordar_dias_antes?: number;

  @ApiPropertyOptional({ enum: CANALES_FECHA })
  @IsIn(CANALES_FECHA as unknown as string[])
  @IsOptional()
  canal_preferido?: string;
}

export class UpdateFechaEspecialDto {
  @ApiPropertyOptional({ enum: TIPOS_FECHA })
  @IsIn(TIPOS_FECHA as unknown as string[])
  @IsOptional()
  tipo?: string;

  @ApiPropertyOptional()
  @IsString()
  @MaxLength(150)
  @IsOptional()
  descripcion?: string;

  @ApiPropertyOptional()
  @IsString()
  @MaxLength(150)
  @IsOptional()
  destinatario_nombre?: string;

  @ApiPropertyOptional()
  @IsInt()
  @Min(1)
  @Max(31)
  @IsOptional()
  dia?: number;

  @ApiPropertyOptional()
  @IsInt()
  @Min(1)
  @Max(12)
  @IsOptional()
  mes?: number;

  @ApiPropertyOptional()
  @IsInt()
  @Min(1900)
  @Max(2200)
  @IsOptional()
  anio?: number;

  @ApiPropertyOptional()
  @IsInt()
  @Min(0)
  @Max(90)
  @IsOptional()
  recordar_dias_antes?: number;

  @ApiPropertyOptional({ enum: CANALES_FECHA })
  @IsIn(CANALES_FECHA as unknown as string[])
  @IsOptional()
  canal_preferido?: string;

  @ApiPropertyOptional()
  @IsBoolean()
  @IsOptional()
  activo?: boolean;
}

export class FechaComercialDto {
  @ApiProperty({ example: 'Día de la Madre (PY)' })
  @IsString()
  @MaxLength(100)
  nombre: string;

  @ApiProperty({ example: 15 })
  @IsInt()
  @Min(1)
  @Max(31)
  dia: number;

  @ApiProperty({ example: 5 })
  @IsInt()
  @Min(1)
  @Max(12)
  mes: number;

  @ApiPropertyOptional({ example: 21, default: 14 })
  @IsInt()
  @Min(0)
  @Max(90)
  @IsOptional()
  recordar_dias_antes?: number;

  @ApiPropertyOptional()
  @IsBoolean()
  @IsOptional()
  activo?: boolean;
}
