import { ApiProperty, ApiPropertyOptional, PartialType } from '@nestjs/swagger';
import { inm_comision_rol } from '@prisma/client';
import { Type } from 'class-transformer';
import {
  ArrayMaxSize,
  ArrayMinSize,
  IsArray,
  IsBoolean,
  IsIn,
  IsInt,
  IsNotEmpty,
  IsNumber,
  IsOptional,
  IsString,
  IsUUID,
  Max,
  MaxLength,
  Min,
  ValidateNested,
} from 'class-validator';

export const EVENTOS_COMISION = ['RESERVA', 'BOLETO', 'COBRADO', 'ESCRITURA', 'ENTREGA'] as const;
export type EventoComision = (typeof EVENTOS_COMISION)[number];

export class HitoComisionDto {
  @ApiProperty({ enum: EVENTOS_COMISION, description: 'Cuándo se devenga esta parte de la comisión' })
  @IsIn(EVENTOS_COMISION as unknown as string[])
  evento: EventoComision;

  @ApiPropertyOptional({ example: 30, description: 'Sólo COBRADO: % del precio cobrado que dispara el devengo' })
  @IsOptional()
  @IsNumber()
  @Min(1)
  @Max(100)
  umbral?: number;

  @ApiProperty({ example: 50, description: 'Parte de la comisión que se devenga en este hito, en %' })
  @IsNumber({ maxDecimalPlaces: 2 })
  @Min(0.01)
  @Max(100)
  porcion: number;
}

export class CreateEsquemaDto {
  @ApiPropertyOptional({ description: 'Proyecto; vacío = aplica a toda la empresa' })
  @IsOptional()
  @IsUUID()
  proyecto_id?: string | null;
  @ApiProperty({ example: 'Vendedores Torre Sol' }) @IsString() @IsNotEmpty() @MaxLength(100) nombre: string;
  @ApiProperty({ enum: inm_comision_rol }) @IsIn(Object.values(inm_comision_rol)) rol: inm_comision_rol;
  @ApiProperty({ example: 3, description: 'Comisión total, en % del precio final' })
  @IsNumber({ maxDecimalPlaces: 2 })
  @Min(0.01)
  @Max(100)
  pct: number;

  @ApiProperty({ type: [HitoComisionDto] })
  @IsArray()
  @ArrayMinSize(1)
  @ArrayMaxSize(6)
  @ValidateNested({ each: true })
  @Type(() => HitoComisionDto)
  hitos: HitoComisionDto[];

  @ApiPropertyOptional({
    default: true,
    description: 'Si la venta se rescinde, las comisiones devengadas y no liquidadas se revierten',
  })
  @IsOptional()
  @IsBoolean()
  revertir_si_rescinde?: boolean;
}

export class UpdateEsquemaDto extends PartialType(CreateEsquemaDto) {}

export class LiquidarComisionesDto {
  @ApiProperty({ type: [String] })
  @IsArray()
  @ArrayMinSize(1)
  @ArrayMaxSize(500)
  @IsUUID('4', { each: true })
  ids: string[];
  @ApiProperty({ example: 'Planilla de octubre / OP 0001-123' })
  @IsString()
  @IsNotEmpty()
  @MaxLength(150)
  referencia: string;
}

export class AsignarBrokerDto {
  @ApiPropertyOptional({ description: 'Proveedor (inmobiliaria externa); null para quitarlo' })
  @IsOptional()
  @IsUUID()
  proveedor_id?: string | null;
}

export class FiltroComisionesDto {
  @IsOptional() @IsUUID() proyecto_id?: string;
  @IsOptional() @IsString() estado?: string;
  @IsOptional() @IsInt() limite?: number;
}
