import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
import { Transform } from 'class-transformer';
import { IsBoolean, IsInt, IsNotEmpty, IsNumber, IsOptional, IsString, Length, MaxLength, Min } from 'class-validator';
import { CreatePersonaDto } from 'src/personas/dto/create-persona.dto';

export class CreateClienteDto extends CreatePersonaDto {
  @ApiProperty({ example: 'cd88ac6a-2b0e-41bc-afd9-24b594cb8daf' })
  @IsNotEmpty({ message: 'Tipo operación es obligatoria' })
  tipo_operacion_id: string;

  @ApiProperty({ example: 'Nombre fantasia' })
  @IsString({ message: 'Nombre fantasia debe ser un string' })
  @Length(4, 255, {
    message: 'Nombre fantasia debe tener entre 4 y 255 caracteres',
  })
  @IsOptional()
  nombre_fantasia?: string;

  @ApiProperty({ example: '001' })
  @IsString({ message: 'Código cliente debe ser un string' })
  @Length(3, 15, {
    message: 'Código cliente debe tener entre 3 y 15 caracteres',
  })
  @IsOptional()
  cod_cliente?: string;

  @ApiProperty({
    example: 'minorista',
    description: 'Tipo de cliente: minorista, mayorista, distribuidor',
  })
  @IsString()
  @IsOptional()
  tipo_cliente?: string;

  @ApiProperty({
    example: 'uuid',
    description: 'ID de la lista de precios asignada',
  })
  @IsString()
  @IsOptional()
  lista_precios_id?: string;

  @ApiProperty({
    example: 'Zona Centro',
    description: 'Zona geográfica/comercial del cliente',
  })
  @IsString()
  @IsOptional()
  zona?: string;

  @ApiPropertyOptional({
    description: 'Referencia libre de domicilio (ej: cerca de la planta de mango, casa azul)',
  })
  @IsString()
  @IsOptional()
  @MaxLength(500)
  referencia_domicilio?: string;

  @ApiPropertyOptional({ description: 'ID del cobrador por defecto asignado al cliente' })
  @IsString()
  @IsOptional()
  cobrador_id?: string;

  @ApiPropertyOptional({
    description: 'Si true, el cliente es agente de retención (IVA + Renta). Activa wizard de retenciones en recibos.',
    default: false,
  })
  @IsBoolean()
  @IsOptional()
  es_agente_retencion?: boolean;

  // ── Crédito ────────────────────────────────────────────────────────────────
  // Mismos campos que expone PATCH /clientes/:id/credito. Viajan también acá
  // para que el formulario de clientes guarde todo en una sola llamada y no
  // quede un cliente recién creado sin su configuración de crédito.

  @ApiPropertyOptional({
    description: 'Habilita la venta a crédito al cliente. Los clientes nuevos arrancan habilitados.',
    example: true,
    default: true,
  })
  @IsOptional()
  @IsBoolean()
  credito_habilitado?: boolean;

  @ApiPropertyOptional({
    description: 'Tope de crédito. Vacío o 0 = sin tope (el control queda en la mora y el bloqueo).',
    example: 5000000,
  })
  @IsOptional()
  @Transform(({ value }) => (value === '' || value === null || value === undefined ? undefined : Number(value)))
  @IsNumber({}, { message: 'Límite de crédito debe ser numérico' })
  @Min(0, { message: 'Límite de crédito no puede ser negativo' })
  limite_credito?: number;

  @ApiPropertyOptional({ description: 'Moneda del límite de crédito (ISO)', example: 'PYG' })
  @IsOptional()
  @IsString()
  @Length(3, 3, { message: 'Moneda del crédito debe tener 3 caracteres' })
  moneda_credito?: string;

  @ApiPropertyOptional({ description: 'Días de mora tolerados antes de bloquear el crédito', example: 30 })
  @IsOptional()
  @Transform(({ value }) => (value === '' || value === null || value === undefined ? undefined : Number(value)))
  @IsInt({ message: 'Días de mora máximo debe ser un entero' })
  @Min(0)
  dias_mora_maximo?: number;

  @ApiPropertyOptional({ description: 'Bloquea la venta a crédito a este cliente', default: false })
  @IsOptional()
  @IsBoolean()
  bloqueado_credito?: boolean;
}
