# 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")
