# app/api/v1/vendor/payments.py """ Vendor payment configuration and processing endpoints. Vendor Context: Uses token_vendor_id from JWT token (authenticated vendor API pattern). The get_current_vendor_api dependency guarantees token_vendor_id is present. """ import logging from fastapi import APIRouter, Depends from sqlalchemy.orm import Session from app.api.deps import get_current_vendor_api from app.core.database import get_db from app.services.vendor_service import vendor_service from models.database.user import User from models.schema.payment import ( PaymentBalanceResponse, PaymentConfigResponse, PaymentConfigUpdate, PaymentConfigUpdateResponse, PaymentMethodsResponse, RefundRequest, RefundResponse, StripeConnectRequest, StripeConnectResponse, StripeDisconnectResponse, TransactionsResponse, ) router = APIRouter(prefix="/payments") logger = logging.getLogger(__name__) @router.get("/config", response_model=PaymentConfigResponse) def get_payment_configuration( current_user: User = Depends(get_current_vendor_api), db: Session = Depends(get_db), ): """ Get vendor payment configuration. TODO: Implement in Slice 5 - Get payment gateway settings (Stripe, PayPal, etc.) - Get accepted payment methods - Get currency settings - Return masked/secure information only """ vendor = vendor_service.get_vendor_by_id(db, current_user.token_vendor_id) # noqa: F841 return PaymentConfigResponse( payment_gateway=None, accepted_methods=[], currency="EUR", stripe_connected=False, message="Payment configuration coming in Slice 5", ) @router.put("/config", response_model=PaymentConfigUpdateResponse) def update_payment_configuration( payment_config: PaymentConfigUpdate, current_user: User = Depends(get_current_vendor_api), db: Session = Depends(get_db), ): """ Update vendor payment configuration. TODO: Implement in Slice 5 - Update payment gateway settings - Connect/disconnect Stripe account - Update accepted payment methods - Validate configuration before saving """ vendor = vendor_service.get_vendor_by_id(db, current_user.token_vendor_id) # noqa: F841 return PaymentConfigUpdateResponse( message="Payment configuration update coming in Slice 5" ) @router.post("/stripe/connect", response_model=StripeConnectResponse) def connect_stripe_account( stripe_data: StripeConnectRequest, current_user: User = Depends(get_current_vendor_api), db: Session = Depends(get_db), ): """ Connect Stripe account for payment processing. TODO: Implement in Slice 5 - Handle Stripe OAuth flow - Store Stripe account ID securely - Verify Stripe account is active - Enable payment processing """ vendor = vendor_service.get_vendor_by_id(db, current_user.token_vendor_id) # noqa: F841 return StripeConnectResponse(message="Stripe connection coming in Slice 5") @router.delete("/stripe/disconnect", response_model=StripeDisconnectResponse) def disconnect_stripe_account( current_user: User = Depends(get_current_vendor_api), db: Session = Depends(get_db), ): """ Disconnect Stripe account. TODO: Implement in Slice 5 - Remove Stripe account connection - Disable payment processing - Warn about pending payments """ vendor = vendor_service.get_vendor_by_id(db, current_user.token_vendor_id) # noqa: F841 return StripeDisconnectResponse(message="Stripe disconnection coming in Slice 5") @router.get("/methods", response_model=PaymentMethodsResponse) def get_payment_methods( current_user: User = Depends(get_current_vendor_api), db: Session = Depends(get_db), ): """ Get accepted payment methods for vendor. TODO: Implement in Slice 5 - Return list of enabled payment methods - Include: credit card, PayPal, bank transfer, etc. """ vendor = vendor_service.get_vendor_by_id(db, current_user.token_vendor_id) # noqa: F841 return PaymentMethodsResponse( methods=[], message="Payment methods coming in Slice 5", ) @router.get("/transactions", response_model=TransactionsResponse) def get_payment_transactions( current_user: User = Depends(get_current_vendor_api), db: Session = Depends(get_db), ): """ Get payment transaction history. TODO: Implement in Slice 5 - Get all payment transactions for vendor - Filter by date range, status, etc. - Include payment details - Support pagination """ vendor = vendor_service.get_vendor_by_id(db, current_user.token_vendor_id) # noqa: F841 return TransactionsResponse( transactions=[], total=0, message="Payment transactions coming in Slice 5", ) @router.get("/balance", response_model=PaymentBalanceResponse) def get_payment_balance( current_user: User = Depends(get_current_vendor_api), db: Session = Depends(get_db), ): """ Get vendor payment balance and payout information. TODO: Implement in Slice 5 - Get available balance - Get pending balance - Get next payout date - Get payout history """ vendor = vendor_service.get_vendor_by_id(db, current_user.token_vendor_id) # noqa: F841 return PaymentBalanceResponse( available_balance=0.0, pending_balance=0.0, currency="EUR", next_payout_date=None, message="Payment balance coming in Slice 5", ) @router.post("/refund/{payment_id}", response_model=RefundResponse) def refund_payment( payment_id: int, refund_data: RefundRequest, current_user: User = Depends(get_current_vendor_api), db: Session = Depends(get_db), ): """ Process payment refund. TODO: Implement in Slice 5 - Verify payment belongs to vendor - Process refund through payment gateway - Update order status - Send refund notification to customer """ vendor = vendor_service.get_vendor_by_id(db, current_user.token_vendor_id) # noqa: F841 return RefundResponse(message="Payment refund coming in Slice 5")