import { ApiProperty } from "@nestjs/swagger";
import { Type } from "class-transformer";
import {
  IsEmail,
  IsOptional,
  IsString,
  Length,
  MaxLength,
  ValidateNested,
} from "class-validator";

export class PublicCheckoutCustomerDto {
  @ApiProperty({ required: false, example: "comprador@example.com" })
  @IsOptional()
  @IsEmail()
  @MaxLength(254)
  email?: string;

  @ApiProperty({ required: false, example: "Juan Pérez" })
  @IsOptional()
  @IsString()
  @MaxLength(120)
  name?: string;

  @ApiProperty({ required: false, example: "80012345-6" })
  @IsOptional()
  @IsString()
  @MaxLength(30)
  docNumber?: string;

  @ApiProperty({ required: false, example: "+595981000000" })
  @IsOptional()
  @IsString()
  @MaxLength(30)
  phone?: string;

  @ApiProperty({ required: false, example: "PY" })
  @IsOptional()
  @IsString()
  @Length(2, 2)
  country?: string;
}

export class ConfirmPublicCheckoutSessionDto {
  @ApiProperty({ required: false, type: PublicCheckoutCustomerDto })
  @IsOptional()
  @ValidateNested()
  @Type(() => PublicCheckoutCustomerDto)
  customer?: PublicCheckoutCustomerDto;

  @ApiProperty({
    required: false,
    description:
      "Token opaco emitido por el SDK de tokenización del provider (ej. dLocal SmartFields). El backend nunca recibe PAN.",
    example: "tok_abc123…",
  })
  @IsOptional()
  @IsString()
  @MaxLength(512)
  providerToken?: string;

  @ApiProperty({
    required: false,
    example: "18",
    description:
      "Medio de pago elegido por el comprador, en el código del provider (ej. `platformId` de Dpago). " +
      "Los valores válidos salen del endpoint público de métodos de la sesión.",
  })
  @IsOptional()
  @IsString()
  @MaxLength(20)
  platformId?: string;
}

export class PublicCheckoutConfirmResultDto {
  @ApiProperty({ example: "pending", description: "Estado del intent tras la confirmación." })
  status!: string;

  @ApiProperty({
    required: false,
    nullable: true,
    description:
      "URL a la que redirigir/compartir para completar el pago (hosted del provider, página de QR o link nativo).",
    example: "https://pago.dpago.com/upay/qr?code=eyJ0cmFuc2FjdGlvbklkIjox…",
  })
  redirectUrl!: string | null;

  @ApiProperty({
    required: false,
    nullable: true,
    type: String,
    description:
      "Payload EMV del QR a renderizar inline cuando el medio elegido devuelve QR (ej. `qrInformation` de Dpago) " +
      "en vez de redirección. Generá el QR a partir de este string. `null` si no aplica.",
    example: "00020101021220265898125204739953036005406100.05802PY5907UPAY...6304ABCD",
  })
  qr!: unknown | null;

  @ApiProperty({
    required: false,
    nullable: true,
    description: "URL del merchant a la que volver si el pago terminó aprobado.",
    example: "https://merchant.com/orders/123/success",
  })
  returnUrl!: string | null;

  @ApiProperty({
    required: false,
    nullable: true,
    description: "URL del merchant a la que volver si el comprador cancela.",
    example: "https://merchant.com/orders/123/cancel",
  })
  cancelUrl!: string | null;
}
