import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
import { Type } from 'class-transformer';
import {
  ArrayMinSize,
  IsArray,
  IsDateString,
  IsEnum,
  IsIn,
  IsNumber,
  IsOptional,
  IsString,
  IsUUID,
  Min,
  ValidateNested,
} from 'class-validator';
import { CobResultadoGestion, CobTipoGestion } from '@prisma/client';

const TIPOS_EVIDENCIA = ['VERBAL', 'WHATSAPP', 'EMAIL', 'DOCUMENTO_FIRMADO'] as const;
const PAGADOR_TIPOS = ['CLIENTE', 'GARANTE', 'TERCERO'] as const;

class GeoMobileDto {
  @ApiProperty()
  @IsNumber()
  lat!: number;

  @ApiProperty()
  @IsNumber()
  lng!: number;

  @ApiPropertyOptional()
  @IsOptional()
  @IsNumber()
  accuracy?: number;
}

export class CrearGestionMobileDto {
  @ApiProperty()
  @IsUUID()
  cliente_id!: string;

  @ApiPropertyOptional()
  @IsOptional()
  @IsUUID()
  factura_cab_id?: string;

  @ApiProperty({ enum: CobTipoGestion })
  @IsEnum(CobTipoGestion)
  tipo_gestion!: CobTipoGestion;

  @ApiProperty({ enum: CobResultadoGestion })
  @IsEnum(CobResultadoGestion)
  resultado!: CobResultadoGestion;

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

  @ApiPropertyOptional()
  @IsOptional()
  @IsString()
  proxima_accion?: string;

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

  @ApiPropertyOptional({ type: GeoMobileDto })
  @IsOptional()
  @ValidateNested()
  @Type(() => GeoMobileDto)
  geo?: GeoMobileDto;

  // ── Promesa enriquecida (solo si resultado === PROMESA_PAGO) ──────────────
  @ApiPropertyOptional()
  @IsOptional()
  @IsDateString()
  promesa_fecha?: string;

  @ApiPropertyOptional()
  @IsOptional()
  @IsNumber()
  @Min(0)
  promesa_monto?: number;

  @ApiPropertyOptional({ type: [String] })
  @IsOptional()
  @IsArray()
  @ArrayMinSize(1)
  @IsUUID('all', { each: true })
  promesa_cuota_ids?: string[];

  @ApiPropertyOptional({ enum: TIPOS_EVIDENCIA })
  @IsOptional()
  @IsIn(TIPOS_EVIDENCIA as unknown as string[])
  promesa_tipo_evidencia?: (typeof TIPOS_EVIDENCIA)[number];

  @ApiPropertyOptional({ enum: PAGADOR_TIPOS })
  @IsOptional()
  @IsIn(PAGADOR_TIPOS as unknown as string[])
  promesa_pagador_tipo?: (typeof PAGADOR_TIPOS)[number];

  @ApiPropertyOptional()
  @IsOptional()
  @IsUUID()
  promesa_pagador_cliente_id?: string;

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