import 'package:dio/dio.dart'; import 'package:eatvio_app/features/chat/models/payment_model.dart'; import 'package:eatvio_app/features/chat/services/chat_service.dart'; import 'package:eatvio_app/features/payment/models/promo_applied_list_response.dart'; import 'package:eatvio_app/features/payment/models/promo_apply_response.dart'; import 'package:eatvio_app/features/payment/models/promo_code_model.dart'; import 'package:eatvio_app/features/payment/models/promo_remove_response.dart'; import 'package:eatvio_app/features/payment/models/promo_validate_response.dart'; /// Репозиторий оплаты консультаций (chosen_plan) через Alfa Bank / СБП. class PaymentRepository { final ChatService chatService; PaymentRepository({required this.chatService}); /// Запускает процесс оплаты: POST `/api/chosen_plans/{id}/start_payment_process` /// с `payment_provider: alfa-bank`. Future startPaymentProcess({required int planId}) async { return chatService.getPaymentLink( id: planId, body: const {'payment_provider': 'alfa-bank'}, ); } /// Список applied-промокодов текущего пользователя. Future listAppliedPromoCodes() { return chatService.listAppliedPromoCodes(); } /// Applied-промокод для конкретного chosen_plan, либо null (нет / ошибка сети). Future findAppliedPromoForPlan(int planId) async { try { final response = await listAppliedPromoCodes(); for (final promo in response.promoCodes) { if (promo.chosenPlanId == planId && promo.state == 'applied') { return promo; } } return null; } catch (_) { return null; } } /// Preview-валидация промокода без применения. Future validatePromoCode({ required int planId, required String promoCode, }) { return chatService.validatePromoCode( id: planId, body: {'promo_code': promoCode}, ); } /// Применяет промокод к chosen_plan. При HTTP 422 возвращает тело ответа. Future applyPromoCode({ required int planId, required String promoCode, }) async { try { return await chatService.applyPromoCode( id: planId, body: {'promo_code': promoCode}, ); } on DioException catch (e) { final data = e.response?.data; if (data is Map) { return PromoApplyResponse.fromJson(data); } rethrow; } } /// Удаляет применённый промокод (idempotent). Future removePromoCode({required int planId}) async { try { return await chatService.removePromoCode(id: planId); } on DioException catch (e) { final data = e.response?.data; if (data is Map) { return PromoRemoveResponse.fromJson(data); } rethrow; } } }