from django.http import Http404
from django.shortcuts import redirect, render
from azbankgateways.exceptions import AZBankGatewaysException
from azbankgateways import bankfactories, models as bank_models, default_settings as settings
from azbankgateways.models import PaymentStatus
import logging
from sale import models as saleModel
from user import models as userModel
from rest_framework.response import Response
from rest_framework.views import APIView
from sale import serializers as saleSerializers
from django.utils import timezone
from config.settings import FRONTEND_URL


class GoToGateway(APIView):
    def get(self, request, user, order):
        obj = saleModel.Orders.objects.get(pk=order)
        if request.user.id == user:
            if obj.status == 'cart':
                details = saleModel.OrderDetails.objects.filter(order_id=order, order__user=user)
                serializer = saleSerializers.OrderSerializer(details)
                price = serializer.get_total_payable(obj)
                if price > 1000:
                    amount = price
                    user = userModel.User.objects.get(pk=user)
                    user_mobile_number = user.mobile  # optional

                    factory = bankfactories.BankFactory()
                    try:
                        bank = factory.create(bank_models.BankType.SEP) #factory.auto_create()  # or factory.create(bank_models.BankType.BMI) or set identifier
                        bank.set_request(request)
                        bank.set_amount(amount)
                        bank.set_client_callback_url('/payment/callback-gateway/')
                        bank.set_mobile_number(user_mobile_number)  # optional
                        bank_record = bank.ready()
                        obj.bank_record = bank_record.id
                        obj.save()
                        if (timezone.now() - bank._bank.created_at).seconds > 120:
                            bank._set_payment_status(PaymentStatus.EXPIRE_GATEWAY_TOKEN)
                            logging.debug("Redirect to bank expire!")
                            raise bank.BankGatewayTokenExpired()
                        logging.debug("Redirect to bank")
                        bank._set_payment_status(PaymentStatus.REDIRECT_TO_BANK)
                        return Response({"link": bank.get_gateway_payment_url()})
                    except AZBankGatewaysException as e:
                        logging.critical(e)
                        return Response({"link": FRONTEND_URL + '/payment/result/error/'})
                return Response({"link": FRONTEND_URL + '/payment/result/bad-request/'})
            return Response({"link": FRONTEND_URL + '/payment/result/closed/'})
        return Response({"link": FRONTEND_URL + '/payment/result/forbidden/'})


# def go_to_gateway_view(request, user, order):
#     obj = saleModel.Orders.objects.get(pk=order)
#     if request.user.id == user:
#         if obj.status == '':
#             details = saleModel.OrderDetails.objects.filter(order_id=order, order__user=user)
#             serializer = saleSerializers.OrderSerializer(details)
#             price = serializer.get_total_payable(obj)
#             if price > 1000:
#                 amount = price
#                 user = userModel.User.objects.get(pk=user)
#                 user_mobile_number = user.mobile  # optional
#
#                 factory = bankfactories.BankFactory()
#                 try:
#                     bank = factory.auto_create()  # or factory.create(bank_models.BankType.BMI) or set identifier
#                     bank.set_request(request)
#                     bank.set_amount(amount)
#                     bank.set_client_callback_url('/payment/callback-gateway/')
#                     bank.set_mobile_number(user_mobile_number)  # optional
#
#                     bank_record = bank.ready()
#                     obj.bank_record = bank_record.id
#                     obj.save()
#
#                     return bank.redirect_gateway()
#                 except AZBankGatewaysException as e:
#                     logging.critical(e)
#                     return redirect('/payment/result/error/')
#             return redirect('/payment/result/bad-request/')
#         return redirect('/payment/result/closed/')
#     return redirect('/payment/result/forbidden/')


def callback_gateway_view(request):
    tracking_code = request.GET.get(settings.TRACKING_CODE_QUERY_PARAM, None)
    if not tracking_code:
        logging.debug("این لینک معتبر نیست.")
        raise Http404

    try:
        bank_record = bank_models.Bank.objects.get(tracking_code=tracking_code)
    except bank_models.Bank.DoesNotExist:
        logging.debug("این لینک معتبر نیست.")
        raise Http404

    order = saleModel.Orders.objects.get(bank_record=bank_record.id)
    if bank_record.is_success:
        details = saleModel.OrderDetails.objects.filter(order_id=order.id)
        for detail in details:
            if detail.suggested.status == 'from-base':
                base = saleModel.PriceBasis.objects.get(suggested_id=detail.suggested.id)
                base.stock -= 1
                base.save()
            detail.suggested.seller.wallet += detail.price
            detail.suggested.seller.save()
        order.status = 'payed'
        order.save()

        return redirect(FRONTEND_URL + '/payment/result/ok/')

    order.status = 'cancelled'
    order.save()
    return redirect(FRONTEND_URL + '/payment/result/not-complete/')


def result(request, status):  # test
    return render(request, "payment/success.html", {'status': status})
