# app/modules/payments/routes/api/store.py
"""
Store payment configuration and processing endpoints.

Store Context: Uses token_store_id from JWT token (authenticated store API pattern).
The get_current_store_api dependency guarantees token_store_id is present.

Provides:
- Payment gateway configuration
- Stripe connect/disconnect
- Payment methods listing
- Transaction history
- Payment balance
- Refund processing
"""

import logging

from fastapi import APIRouter, Depends
from sqlalchemy.orm import Session

from app.api.deps import get_current_store_api, require_module_access
from app.core.database import get_db
from app.modules.enums import FrontendType
from app.modules.payments.schemas import (
    PaymentBalanceResponse,
    PaymentConfigResponse,
    PaymentConfigUpdate,
    PaymentConfigUpdateResponse,
    PaymentMethodsResponse,
    StripeConnectRequest,
    StripeConnectResponse,
    StripeDisconnectResponse,
    TransactionsResponse,
)
from app.modules.payments.schemas import (
    PaymentRefundRequest as RefundRequest,
)
from app.modules.payments.schemas import (
    PaymentRefundResponse as RefundResponse,
)
from app.modules.tenancy.schemas.auth import UserContext
from app.modules.tenancy.services.store_service import store_service

router = APIRouter(
    prefix="/payments",
    dependencies=[Depends(require_module_access("payments", FrontendType.STORE))],
)
logger = logging.getLogger(__name__)


@router.get("/config", response_model=PaymentConfigResponse)
def get_payment_configuration(
    current_user: UserContext = Depends(get_current_store_api),
    db: Session = Depends(get_db),
):
    """
    Get store 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
    """
    store = store_service.get_store_by_id(db, current_user.token_store_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: UserContext = Depends(get_current_store_api),
    db: Session = Depends(get_db),
):
    """
    Update store payment configuration.

    TODO: Implement in Slice 5
    - Update payment gateway settings
    - Connect/disconnect Stripe account
    - Update accepted payment methods
    - Validate configuration before saving
    """
    store = store_service.get_store_by_id(db, current_user.token_store_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: UserContext = Depends(get_current_store_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
    """
    store = store_service.get_store_by_id(db, current_user.token_store_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: UserContext = Depends(get_current_store_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
    """
    store = store_service.get_store_by_id(db, current_user.token_store_id)  # noqa: F841
    return StripeDisconnectResponse(message="Stripe disconnection coming in Slice 5")


@router.get("/methods", response_model=PaymentMethodsResponse)
def get_payment_methods(
    current_user: UserContext = Depends(get_current_store_api),
    db: Session = Depends(get_db),
):
    """
    Get accepted payment methods for store.

    TODO: Implement in Slice 5
    - Return list of enabled payment methods
    - Include: credit card, PayPal, bank transfer, etc.
    """
    store = store_service.get_store_by_id(db, current_user.token_store_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: UserContext = Depends(get_current_store_api),
    db: Session = Depends(get_db),
):
    """
    Get payment transaction history.

    TODO: Implement in Slice 5
    - Get all payment transactions for store
    - Filter by date range, status, etc.
    - Include payment details
    - Support pagination
    """
    store = store_service.get_store_by_id(db, current_user.token_store_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: UserContext = Depends(get_current_store_api),
    db: Session = Depends(get_db),
):
    """
    Get store payment balance and payout information.

    TODO: Implement in Slice 5
    - Get available balance
    - Get pending balance
    - Get next payout date
    - Get payout history
    """
    store = store_service.get_store_by_id(db, current_user.token_store_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: UserContext = Depends(get_current_store_api),
    db: Session = Depends(get_db),
):
    """
    Process payment refund.

    TODO: Implement in Slice 5
    - Verify payment belongs to store
    - Process refund through payment gateway
    - Update order status
    - Send refund notification to customer
    """
    store = store_service.get_store_by_id(db, current_user.token_store_id)  # noqa: F841
    return RefundResponse(message="Payment refund coming in Slice 5")
