import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
import { inm_inusual_estado, inm_legajo_doc_tipo, inm_nivel_riesgo, inm_tipo_persona } from '@prisma/client';
import { Type } from 'class-transformer';
import {
  ArrayMaxSize,
  IsArray,
  IsBoolean,
  IsDateString,
  IsEnum,
  IsIn,
  IsNotEmpty,
  IsNumber,
  IsOptional,
  IsString,
  IsUUID,
  Max,
  MaxLength,
  Min,
  ValidateNested,
} from 'class-validator';

export class BeneficiarioFinalDto {
  @ApiProperty({ example: 'María Benítez' }) @IsString() @IsNotEmpty() @MaxLength(150) nombre: string;
  @ApiPropertyOptional({ example: '1234567' }) @IsOptional() @IsString() @MaxLength(30) documento?: string;
  @ApiProperty({ example: 60, description: 'Participación en la sociedad, en %' })
  @IsNumber({ maxDecimalPlaces: 2 })
  @Min(0)
  @Max(100)
  pct: number;
  @ApiPropertyOptional() @IsOptional() @IsBoolean() pep?: boolean;
}

export class GuardarLegajoDto {
  @ApiPropertyOptional({ enum: inm_tipo_persona })
  @IsOptional()
  @IsEnum(inm_tipo_persona)
  tipo_persona?: inm_tipo_persona;
  @ApiPropertyOptional({ example: 'Médico' }) @IsOptional() @IsString() @MaxLength(150) actividad?: string | null;
  @ApiPropertyOptional({ example: 25000000 })
  @IsOptional()
  @IsNumber({ maxDecimalPlaces: 2 })
  @Min(0)
  ingreso_mensual?: number | null;
  @ApiPropertyOptional({ example: 'PYG' }) @IsOptional() @IsIn(['PYG', 'USD']) ingreso_moneda?: string | null;
  @ApiPropertyOptional({ example: 'Ahorros de honorarios profesionales y venta de un vehículo' })
  @IsOptional()
  @IsString()
  @MaxLength(1000)
  origen_fondos?: string | null;
  @ApiPropertyOptional() @IsOptional() @IsBoolean() pep?: boolean;
  @ApiPropertyOptional({ example: 'Concejal municipal' }) @IsOptional() @IsString() @MaxLength(150) pep_cargo?:
    | string
    | null;
  @ApiPropertyOptional({ example: 'Hermano de un viceministro' })
  @IsOptional()
  @IsString()
  @MaxLength(150)
  pep_vinculo?: string | null;
  @ApiPropertyOptional({ type: [BeneficiarioFinalDto] })
  @IsOptional()
  @IsArray()
  @ArrayMaxSize(20)
  @ValidateNested({ each: true })
  @Type(() => BeneficiarioFinalDto)
  beneficiarios_finales?: BeneficiarioFinalDto[];
  @ApiPropertyOptional({
    enum: inm_nivel_riesgo,
    nullable: true,
    description: 'Riesgo pedido a mano: sólo sube el calculado. null = quitar el pedido manual',
  })
  @IsOptional()
  @IsEnum(inm_nivel_riesgo)
  nivel_riesgo?: inm_nivel_riesgo | null;
  @ApiPropertyOptional() @IsOptional() @IsString() @MaxLength(1000) observaciones?: string | null;
}

export class SubirDocumentoLegajoDto {
  @ApiProperty({ enum: inm_legajo_doc_tipo }) @IsEnum(inm_legajo_doc_tipo) tipo: inm_legajo_doc_tipo;
  @ApiPropertyOptional({ example: '2030-05-31' }) @IsOptional() @IsDateString() vence?: string;
}

export class MotivoCumplimientoDto {
  @ApiProperty() @IsString() @IsNotEmpty({ message: 'Indicá el motivo' }) @MaxLength(255) motivo: string;
}

export class CrearInusualDto {
  @ApiPropertyOptional() @IsOptional() @IsUUID() cliente_id?: string;
  @ApiPropertyOptional() @IsOptional() @IsUUID() operacion_id?: string;
  @ApiProperty({ example: 'Pidió pagar la entrega con dinero de un tercero sin vínculo aparente' })
  @IsString()
  @IsNotEmpty({ message: 'Describí la operación inusual' })
  @MaxLength(1000)
  descripcion: string;
  @ApiPropertyOptional() @IsOptional() @IsNumber({ maxDecimalPlaces: 2 }) @Min(0) monto?: number;
  @ApiPropertyOptional({ example: 'USD' }) @IsOptional() @IsIn(['PYG', 'USD']) moneda?: string;
  @ApiPropertyOptional({ example: '2026-10-11' }) @IsOptional() @IsDateString() fecha?: string;
}

export class GestionarInusualDto {
  @ApiProperty({ enum: ['EN_ANALISIS', 'DESCARTADA', 'REPORTADA'] })
  @IsIn(['EN_ANALISIS', 'DESCARTADA', 'REPORTADA'])
  estado: Exclude<inm_inusual_estado, 'PENDIENTE'>;
  @ApiPropertyOptional({ description: 'Obligatorio al descartar o reportar' })
  @IsOptional()
  @IsString()
  @MaxLength(4000)
  analisis?: string;
  @ApiPropertyOptional({ example: 'ROS-2026-0012', description: 'Obligatorio al reportar' })
  @IsOptional()
  @IsString()
  @MaxLength(50)
  ros_numero?: string;
  @ApiPropertyOptional({ example: '2026-10-11' }) @IsOptional() @IsDateString() ros_fecha?: string;
}
