import { IsString, IsEnum, IsOptional } from 'class-validator'; import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; import { PaymentIntentStatus } from '@prisma/client'; export enum PaymentMethodTypeEnum { TELEBIRR = 'TELEBIRR', // Ethiopia CBE_BIRR = 'CBE_BIRR', // Ethiopia EBIRR = 'EBIRR', // Ethiopia WAAFI = 'WAAFI', // Djibouti CARD = 'CARD', // International WALLET = 'WALLET' // Internal } export class InitiatePaymentDto { @ApiProperty({ example: 'booking-uuid' }) @IsString() bookingId: string; @ApiProperty({ enum: PaymentMethodTypeEnum, description: 'Payment method: TELEBIRR/CBE_BIRR/EBIRR (Ethiopia), WAAFI (Djibouti), CARD (International), WALLET (Internal)', example: 'TELEBIRR' }) @IsEnum(PaymentMethodTypeEnum) method: PaymentMethodTypeEnum; @ApiPropertyOptional({ description: 'Saved payment method ID (optional)' }) @IsOptional() @IsString() paymentMethodId?: string; } export class RefundDto { @ApiProperty() @IsString() bookingId: string; @ApiPropertyOptional() @IsOptional() @IsString() reason?: string; } export class AddPaymentMethodDto { @ApiProperty() @IsString() userId: string; @ApiProperty({ enum: PaymentMethodTypeEnum }) @IsEnum(PaymentMethodTypeEnum) type: PaymentMethodTypeEnum; @ApiProperty() @IsString() displayName: string; @ApiPropertyOptional() @IsOptional() @IsString() maskedHint?: string; } export class ClientActionDto { @ApiProperty({ enum: ['REDIRECT'] }) type: 'REDIRECT'; @ApiProperty() url: string; } export class InitiateResponseDto { @ApiProperty() intentId: string; @ApiProperty({ enum: PaymentIntentStatus }) status: PaymentIntentStatus; @ApiPropertyOptional({ type: ClientActionDto }) clientAction?: ClientActionDto; @ApiPropertyOptional() merchantOrderId?: string; } export class IntentStatusDto { @ApiProperty() intentId: string; @ApiProperty({ enum: PaymentIntentStatus }) status: PaymentIntentStatus; @ApiPropertyOptional({ type: ClientActionDto }) clientAction?: ClientActionDto; @ApiPropertyOptional() merchantOrderId?: string; @ApiPropertyOptional() paidAt?: string; @ApiPropertyOptional() failureCode?: string; @ApiPropertyOptional() failureMessage?: string; }