import { ApiPropertyOptional } from '@nestjs/swagger';
import { Transform, Type } from 'class-transformer';
import { IsBooleanString, IsInt, IsOptional, IsString, IsUUID, Min } from 'class-validator';

export class QueryMesaGestionDto {
  @ApiPropertyOptional({ description: 'Zona de cobranza (substring)' })
  @IsOptional()
  @IsString()
  zona?: string;

  @ApiPropertyOptional({ description: 'Filtrar por cobrador asignado' })
  @IsOptional()
  @IsUUID()
  cobrador_id?: string;

  @ApiPropertyOptional({ description: 'Mínimo de días vencido (oldest cuota)' })
  @IsOptional()
  @Type(() => Number)
  @IsInt()
  @Min(0)
  min_dias_vencido?: number;

  @ApiPropertyOptional({ description: 'Solo clientes sin gestión hace al menos N días (incluye nunca gestionados)' })
  @IsOptional()
  @Type(() => Number)
  @IsInt()
  @Min(0)
  sin_gestion_dias?: number;

  @ApiPropertyOptional({ description: 'Solo clientes con promesas incumplidas' })
  @IsOptional()
  @IsBooleanString()
  solo_promesas_vencidas?: string;

  @ApiPropertyOptional({
    description: 'Filtro por estado de gestión',
    enum: ['todos', 'por_contactar', 'en_gestion', 'con_promesa_vigente'],
  })
  @IsOptional()
  @IsString()
  estado_gestion?: 'todos' | 'por_contactar' | 'en_gestion' | 'con_promesa_vigente';

  @ApiPropertyOptional({ description: 'Solo gestiones registradas por el usuario actual' })
  @IsOptional()
  @IsBooleanString()
  solo_mis_gestiones?: string;

  @ApiPropertyOptional({
    description:
      'Solo clientes cuya política de cobro coincide con HOY (día fijo del mes / día semanal) o con cuotas venciendo dentro del período de gracia.',
  })
  @IsOptional()
  @IsBooleanString()
  solo_agenda_hoy?: string;

  @ApiPropertyOptional({ description: 'Búsqueda libre (razón social, RUC, nombre fantasía)' })
  @IsOptional()
  @IsString()
  search?: string;

  @ApiPropertyOptional({ description: 'Criterio de orden', enum: ['prioridad', 'vencimiento', 'saldo', 'sin_gestion'] })
  @IsOptional()
  @IsString()
  orden?: 'prioridad' | 'vencimiento' | 'saldo' | 'sin_gestion';

  @ApiPropertyOptional({ default: 1 })
  @IsOptional()
  @Type(() => Number)
  @IsInt()
  @Min(1)
  page?: number;

  @ApiPropertyOptional({ default: 50 })
  @IsOptional()
  @Type(() => Number)
  @IsInt()
  @Min(1)
  limit?: number;
}
