from django.shortcuts import render

# Create your views here.

# billing/api_views.py

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status, permissions

from .edef_client import EdefClient, EdefClientError


class InvoiceRootView(APIView):
    """
    GET  -> statut du service de facturation e-MCF (proxy /api/invoice/)
    POST -> créer une facture (proxy POST /api/invoice/)
    """
    permission_classes = [permissions.IsAuthenticated]  # ou AllowAny pour tests

    def get(self, request):
        client = EdefClient()
        try:
            data = client.get_invoice_status()
            return Response(data)
        except EdefClientError as e:
            return Response({"detail": str(e)}, status=status.HTTP_502_BAD_GATEWAY)

    def post(self, request):
        client = EdefClient()
        payload = request.data  # tu peux ajouter un Serializer pour valider
        try:
            data = client.create_invoice(payload)
            return Response(data, status=status.HTTP_201_CREATED)
        except EdefClientError as e:
            return Response({"detail": str(e)}, status=status.HTTP_502_BAD_GATEWAY)


class InvoiceDetailView(APIView):
    """
    GET -> récupérer une facture en attente (proxy /api/invoice/{uid})
    """
    permission_classes = [permissions.IsAuthenticated]

    def get(self, request, uid):
        client = EdefClient()
        try:
            data = client.get_invoice(uid)
            return Response(data)
        except EdefClientError as e:
            return Response({"detail": str(e)}, status=status.HTTP_502_BAD_GATEWAY)


class InvoiceConfirmView(APIView):
    """
    PUT -> confirmer une facture (proxy /api/invoice/{uid}/CONFIRM)
    Body attendu:
    {
      "total": ...,
      "vtotal": ...
    }
    """
    permission_classes = [permissions.IsAuthenticated]

    def put(self, request, uid):
        client = EdefClient()
        payload = request.data
        try:
            data = client.confirm_invoice(uid, payload)
            return Response(data)
        except EdefClientError as e:
            return Response({"detail": str(e)}, status=status.HTTP_502_BAD_GATEWAY)


class InvoiceCancelView(APIView):
    """
    PUT -> annuler une facture en attente (proxy /api/invoice/{uid}/CANCEL)
    """
    permission_classes = [permissions.IsAuthenticated]

    def put(self, request, uid):
        client = EdefClient()
        try:
            data = client.cancel_invoice(uid)
            return Response(data)
        except EdefClientError as e:
            return Response({"detail": str(e)}, status=status.HTTP_502_BAD_GATEWAY)


# ---------- API INFORMATION ----------

class InfoStatusView(APIView):
    permission_classes = [permissions.IsAuthenticated]

    def get(self, request):
        client = EdefClient()
        try:
            data = client.info_status()
            return Response(data)
        except EdefClientError as e:
            return Response({"detail": str(e)}, status=status.HTTP_502_BAD_GATEWAY)


class InfoTaxGroupsView(APIView):
    permission_classes = [permissions.IsAuthenticated]

    def get(self, request):
        client = EdefClient()
        try:
            data = client.info_tax_groups()
            return Response(data)
        except EdefClientError as e:
            return Response({"detail": str(e)}, status=status.HTTP_502_BAD_GATEWAY)


class InfoInvoiceTypesView(APIView):
    permission_classes = [permissions.IsAuthenticated]

    def get(self, request):
        client = EdefClient()
        try:
            data = client.info_invoice_types()
            return Response(data)
        except EdefClientError as e:
            return Response({"detail": str(e)}, status=status.HTTP_502_BAD_GATEWAY)


class InfoPaymentTypesView(APIView):
    permission_classes = [permissions.IsAuthenticated]

    def get(self, request):
        client = EdefClient()
        try:
            data = client.info_payment_types()
            return Response(data)
        except EdefClientError as e:
            return Response({"detail": str(e)}, status=status.HTTP_502_BAD_GATEWAY)


class InfoClientTypesView(APIView):
    permission_classes = [permissions.IsAuthenticated]

    def get(self, request):
        client = EdefClient()
        try:
            data = client.info_client_types()
            return Response(data)
        except EdefClientError as e:
            return Response({"detail": str(e)}, status=status.HTTP_502_BAD_GATEWAY)


class InfoReferenceTypesView(APIView):
    permission_classes = [permissions.IsAuthenticated]

    def get(self, request):
        client = EdefClient()
        try:
            data = client.info_reference_types()
            return Response(data)
        except EdefClientError as e:
            return Response({"detail": str(e)}, status=status.HTTP_502_BAD_GATEWAY)


class InfoItemTypesView(APIView):
    permission_classes = [permissions.IsAuthenticated]

    def get(self, request):
        client = EdefClient()
        try:
            data = client.info_item_types()
            return Response(data)
        except EdefClientError as e:
            return Response({"detail": str(e)}, status=status.HTTP_502_BAD_GATEWAY)


class InfoCurrencyRatesView(APIView):
    permission_classes = [permissions.IsAuthenticated]

    def get(self, request):
        client = EdefClient()
        try:
            data = client.info_currency_rates()
            return Response(data)
        except EdefClientError as e:
            return Response({"detail": str(e)}, status=status.HTTP_502_BAD_GATEWAY)
