import { ApiPropertyOptional } from "@nestjs/swagger";
import {
  IsEnum,
  IsIn,
  IsInt,
  IsOptional,
  IsPositive,
  IsString,
} from "class-validator";
import {
  PaymentEventType,
  PaymentReferenceType,
  PaymentService,
  ProviderMethod,
} from "@edr/types";

/**
 * Body for the dev-only POST /test/payment-event endpoint. Every field is optional — the
 * controller fills sensible defaults so an empty `{}` publishes a `payment.succeeded` to the
 * passenger queue. Set `referenceId` to a real bookingId to exercise the consumer's side effects
 * (seat confirm / ticket issue); leave it blank to only prove RabbitMQ delivery.
 */
export class TestPaymentEventDto {
  @ApiPropertyOptional({
    enum: ["payment.succeeded", "payment.failed"],
    default: "payment.succeeded",
  })
  @IsOptional()
  @IsIn(["payment.succeeded", "payment.failed"])
  eventType?: PaymentEventType;

  @ApiPropertyOptional({ enum: PaymentService, default: PaymentService.PASSENGER })
  @IsOptional()
  @IsEnum(PaymentService)
  service?: PaymentService;

  @ApiPropertyOptional({
    enum: PaymentReferenceType,
    default: PaymentReferenceType.BOOKING,
  })
  @IsOptional()
  @IsEnum(PaymentReferenceType)
  referenceType?: PaymentReferenceType;

  @ApiPropertyOptional({
    description: "Domain order id (e.g. bookingId). Defaults to a random uuid.",
  })
  @IsOptional()
  @IsString()
  referenceId?: string;

  @ApiPropertyOptional({ description: "Defaults to a random uuid." })
  @IsOptional()
  @IsString()
  intentId?: string;

  @ApiPropertyOptional({ description: "Defaults to test-<random>." })
  @IsOptional()
  @IsString()
  merchantOrderId?: string;

  @ApiPropertyOptional({ enum: ProviderMethod, default: ProviderMethod.WAAFI })
  @IsOptional()
  @IsEnum(ProviderMethod)
  provider?: ProviderMethod;

  @ApiPropertyOptional({ default: 10000, description: "Amount in minor units." })
  @IsOptional()
  @IsInt()
  @IsPositive()
  amountMinor?: number;

  @ApiPropertyOptional({ default: "ETB" })
  @IsOptional()
  @IsString()
  currency?: string;

  @ApiPropertyOptional({ description: "Only used for payment.succeeded." })
  @IsOptional()
  @IsString()
  providerTxnId?: string;

  @ApiPropertyOptional({ description: "Only used for payment.failed." })
  @IsOptional()
  @IsString()
  failureCode?: string;

  @ApiPropertyOptional({ description: "Only used for payment.failed." })
  @IsOptional()
  @IsString()
  failureMessage?: string;
}
