import { ApiProperty } from "@nestjs/swagger";
import { FxStrategy, Provider, ProviderMode } from "@prisma/client";
import {
  IsBoolean,
  IsEnum,
  IsInt,
  IsObject,
  IsOptional,
  IsString,
  Matches,
  Max,
  Min,
} from "class-validator";

export class CreateProviderConfigDto {
  @ApiProperty({ enum: Provider, example: Provider.dlocal })
  @IsEnum(Provider)
  provider!: Provider;

  @ApiProperty({ enum: ProviderMode, example: ProviderMode.sandbox })
  @IsEnum(ProviderMode)
  mode!: ProviderMode;

  @ApiProperty({ example: "PY", description: "ISO 3166-1 alpha-2 en mayúsculas." })
  @IsString()
  @Matches(/^[A-Z]{2}$/, { message: "country must be uppercase ISO 3166-1 alpha-2" })
  country!: string;

  @ApiProperty({
    description:
      "Credenciales del provider en texto plano. Se almacenan **encriptadas con AES-256-GCM** y nunca se devuelven. " +
      "El shape depende del provider (ej. dLocal Go: `{ apiKey, secretKey }`).",
    example: { apiKey: "demo_api_key", secretKey: "demo_secret_key" },
  })
  @IsObject()
  credentials!: Record<string, unknown>;

  @ApiProperty({
    required: false,
    enum: FxStrategy,
    example: FxStrategy.delegate_provider,
    description:
      "Manejo de monedas distintas a la base. `reject_others`: rechazar. `delegate_provider`: dejar al provider. `freeze_own`: fijar tipo de cambio propio.",
  })
  @IsOptional()
  @IsEnum(FxStrategy)
  fxStrategy?: FxStrategy;

  @ApiProperty({
    required: false,
    example: 0,
    description: "Prioridad de ruteo si hay múltiples configs aptas. Mayor = preferido.",
  })
  @IsOptional()
  @IsInt()
  @Min(0)
  @Max(1000)
  priority?: number;

  @ApiProperty({ required: false, example: true })
  @IsOptional()
  @IsBoolean()
  active?: boolean;
}
