from django.shortcuts import get_object_or_404
from ninja_extra import ControllerBase, api_controller, route
from ninja_extra.exceptions import NotFound, PermissionDenied
from ninja_extra.permissions import IsAuthenticated
from pydantic import NonNegativeInt

from core.models import User
from counter.models import BillingInfo, Customer
from eboutic.models import Basket
from eboutic.schemas import BillingInfoSchema


@api_controller("/etransaction", permissions=[IsAuthenticated])
class EtransactionInfoController(ControllerBase):
    @route.put("/billing-info/{user_id}", url_name="put_billing_info")
    def put_user_billing_info(self, user_id: NonNegativeInt, info: BillingInfoSchema):
        """Update or create the billing info of this user."""
        if user_id == self.context.request.user.id:
            user = self.context.request.user
        elif self.context.request.user.is_root:
            user = get_object_or_404(User, pk=user_id)
        else:
            raise PermissionDenied
        customer, _ = Customer.get_or_create(user)
        BillingInfo.objects.update_or_create(
            customer=customer, defaults=info.model_dump(exclude_none=True)
        )

    @route.get("/data", url_name="etransaction_data", include_in_schema=False)
    def fetch_etransaction_data(self):
        """Generate the data to pay an eboutic command with paybox.

        The data is generated with the basket that is used by the current session.
        """
        basket = Basket.from_session(self.context.request.session)
        if basket is None:
            raise NotFound
        return dict(basket.get_e_transaction_data())