"""
Payment Request API router.
"""

from typing import Any
from fastapi import APIRouter, Depends, Request, status
from sqlalchemy.orm import Session

from src.core.database import get_db
from src.apps.auth.utils.auth import get_current_user, get_current_merchant
from src.apps.merchants.schemas.merchant_common import MerchantSchema
from src.apps.users.schemas.user_common import UserSchema
from src.apps.base.schemas.responses import BaseResponse
from src.apps.payment_requests import services
from src.apps.payment_requests.schemas.requests import MerchantPaymentRequestCreateSchema
from src.apps.payment_requests.schemas.responses import PaymentRequestResponseSchema
from src.core.utils.enums import MODULES, OPERATIONS
# from src.middleware.security import PermissionGuard

router = APIRouter()


@router.post("", name="Create Payment Request", response_model=PaymentRequestResponseSchema)
async def create_payment_request(
    payload: MerchantPaymentRequestCreateSchema,
    request: Request,
    db: Session = Depends(get_db),
    merchant: MerchantSchema = Depends(get_current_merchant),
    current_user: UserSchema = Depends(get_current_user),
    # is_permitted: bool = Depends(
    #     PermissionGuard(module=MODULES.PAYMENT_REQUEST, operation=OPERATIONS.CREATE)
    # ),
) -> PaymentRequestResponseSchema:
    """
    Call this API to create a payment request as a merchant

    On successful execution the API would return '200 OK' JSON response of the following format
    ```
    {
        "data": {
            "amount": 100.0,
            "payment_frequency": "split",
            "authorization_type": "request_auth",
            "payment_method": "card",
            "status": "full_amount_pending",
            "save_payment_method": false,
            "allow_tip": false,
            "configure_adjustment": false,
            "message": "",
            "id": 8,
            "due_date": "2021-10-25T19:29:17.454292+00:00",
            "billing_date": "2021-10-25T19:29:17.454292+00:00",
            "created_at": "2021-10-25T19:29:17.454292+00:00",
            "line_items": [...],
            "created_by": { ... }
        },
        "status_code": 200,
        "success": true,
        "message": "Request handled successfully"
    }
    ```
    """
    response = await services.create_payment_request(
        db=db,
        merchant=merchant,
        payload=payload,
        current_user=current_user,
        request=request,
    )
    
    return response