import { Type } from 'class-transformer';
import {
  IsEmail,
  IsIn,
  IsInt,
  IsOptional,
  IsString,
  Length,
  Matches,
  Min,
  ValidateNested,
} from 'class-validator';

class CompradorDto {
  @IsOptional()
  @IsString()
  @Length(1, 120)
  nombre?: string;

  @IsOptional()
  @IsEmail()
  email?: string;

  @IsOptional()
  @IsString()
  @Length(1, 40)
  documento?: string;

  @IsOptional()
  @IsString()
  @Length(1, 40)
  telefono?: string;
}

export class CrearNovasisPayCobroDto {
  /**
   * Monto en unidad principal de la moneda (ej. PYG: 50000 = Gs. 50.000;
   * USD: 1500 = $15.00 — pasamos centavos a la pasarela en la conversión).
   */
  @Type(() => Number)
  @IsInt({ message: 'monto debe ser un entero (sub-unidades de la moneda)' })
  @Min(1)
  monto!: number;

  @IsOptional()
  @IsString()
  @Matches(/^[A-Z]{3}$/, { message: 'currency debe ser ISO 4217 en mayúsculas' })
  currency?: string;

  @IsOptional()
  @IsString()
  @Matches(/^[A-Z]{2}$/, { message: 'country debe ser ISO 3166-1 alpha-2 en mayúsculas' })
  country?: string;

  @IsOptional()
  @IsString()
  @Length(1, 255)
  descripcion?: string;

  @IsOptional()
  @ValidateNested()
  @Type(() => CompradorDto)
  comprador?: CompradorDto;

  /**
   * Modalidad del cobro:
   *  - 'link' (default): genera un checkout hospedado para compartir.
   *  - 'directo': confirma en el acto con `platform_id` (ej. QR directo) y
   *    devuelve el QR / redirect al toque.
   */
  @IsOptional()
  @IsIn(['link', 'directo'], { message: "modo debe ser 'link' o 'directo'" })
  modo?: 'link' | 'directo';

  /**
   * Medio de pago del provider (ej. platformId de Dpago: 18=QR Ueno, 14=Pix).
   * Obligatorio cuando modo='directo'.
   */
  @IsOptional()
  @IsString()
  @Length(1, 20)
  platform_id?: string;

  /** Referencia del comercio (factura, pedido, etc.). Útil para idempotencia. */
  @IsOptional()
  @IsString()
  @Length(1, 120)
  external_reference?: string;

  /** Opcional: provider preferido (override sobre el default de la config). */
  @IsOptional()
  @IsString()
  @Length(2, 40)
  requested_provider?: string;

  @IsOptional()
  @IsString()
  @Matches(/^https?:\/\/\S+$/, { message: 'return_url debe ser una URL http(s)' })
  return_url?: string;

  @IsOptional()
  @IsString()
  @Matches(/^https?:\/\/\S+$/, { message: 'cancel_url debe ser una URL http(s)' })
  cancel_url?: string;
}
