from appservices.common.util import *
from appservices.common.form_schemas import *

verification_charges = Blueprint("verification_charges",__name__)

@verification_charges.route("/verification_charges_list",methods=["POST","GET"])
@adminid_access_token_required
def verification_charges_list():
    kycApisList=[]
    datesWiseVerificationChargesList=[]
    verificationChargesList = []
    aadharTotalVerificationsCount = 0
    panTotalVerificationsCount = 0
    bankTotalVerificationsCount = 0
    totalAadharChargeAmount = 0
    gstAadharTotalAmount = 0
    totalPgAadharChargeAmount = 0
    gstPgAadharTotalAmount = 0
    totalPanChargeAmount = 0
    gstPanTotalAmount = 0
    totalPgPanChargeAmount = 0
    gstPgPanTotalAmount = 0
    gstBankTotalAmount = 0
    totalBankChargeAmount = 0
    totalPgBankChargeAmount = 0
    gstPgBankTotalAmount = 0

    startDate = None
    endDate = None
    date_format = "%d-%m-%Y"
    permissionsList = check_permissions(session.get("adminId"),"verificationChargePermissions")
    form=VerificationChargesListForm(request.args)
    if "view" in permissionsList:
        try:
            thirdparty_api_charges_queryset = ThirdpartyApiCharges.objects().order_by("-id")
            aadharTotalVerificationsCount = thirdparty_api_charges_queryset.filter(verificationType="aadhar").count()
            panTotalVerificationsCount = thirdparty_api_charges_queryset.filter(verificationType="pan").count()
            bankTotalVerificationsCount = thirdparty_api_charges_queryset.filter(verificationType="bank").count()

            # Aadhar Commissions and Pg Commission For Verification charges
            totalAadharChargeAmount = ThirdpartyApiCharges.objects(verificationType="aadhar").sum('commissionCharges.chargeAmount')
            gstAadharTotalAmount = ThirdpartyApiCharges.objects(verificationType="aadhar").sum('commissionCharges.gstAmount')
            totalPgAadharChargeAmount = ThirdpartyApiCharges.objects(verificationType="aadhar").sum('aggregatorCharges.chargeAmount')
            gstPgAadharTotalAmount = ThirdpartyApiCharges.objects(verificationType="aadhar").sum('aggregatorCharges.gstAmount')

            # Pan Commissions and Pg Commission For Verification charges
            totalPanChargeAmount = ThirdpartyApiCharges.objects(verificationType="pan").sum('commissionCharges.chargeAmount')
            gstPanTotalAmount = ThirdpartyApiCharges.objects(verificationType="pan").sum('commissionCharges.gstAmount')
            totalPgPanChargeAmount = ThirdpartyApiCharges.objects(verificationType="pan").sum('aggregatorCharges.chargeAmount')
            gstPgPanTotalAmount = ThirdpartyApiCharges.objects(verificationType="pan").sum('aggregatorCharges.gstAmount')

            # Bank Commissions and Pg Commission For Verification charges
            totalBankChargeAmount = ThirdpartyApiCharges.objects(verificationType="bank").sum('commissionCharges.chargeAmount')
            gstBankTotalAmount = ThirdpartyApiCharges.objects(verificationType="bank").sum('commissionCharges.gstAmount')
            totalPgBankChargeAmount = ThirdpartyApiCharges.objects(verificationType="bank").sum('aggregatorCharges.chargeAmount')
            gstPgBankTotalAmount = ThirdpartyApiCharges.objects(verificationType="bank").sum('aggregatorCharges.gstAmount')

            verificationChargesList = [
                {
                    "chargeName": "Aadhar Charges",
                    "totalTnxChargeAmount": totalAadharChargeAmount,  
                    "totalTnxChargeGstAmount": gstAadharTotalAmount, 
                    "totalPgChargeAmount": totalPgAadharChargeAmount,
                    "totalPgChargeGstAmount": gstPgAadharTotalAmount,
                    "totalCount": aadharTotalVerificationsCount
                },
                {
                    "chargeName": "Pan Charges",
                    "totalTnxChargeAmount": totalPanChargeAmount,
                    "totalTnxChargeGstAmount": gstPanTotalAmount,
                    "totalPgChargeAmount": totalPgPanChargeAmount,
                    "totalPgChargeGstAmount": gstPgPanTotalAmount,
                    "totalCount": panTotalVerificationsCount
                },
                {

                    "chargeName": "Bank Charges",
                    "totalTnxChargeAmount": totalBankChargeAmount,
                    "totalTnxChargeGstAmount": gstBankTotalAmount,
                    "totalPgChargeAmount": totalPgBankChargeAmount,
                    "totalPgChargeGstAmount": gstPgBankTotalAmount,
                    "totalCount": bankTotalVerificationsCount
                }
            ]
            startDate = request.args.get("startDate","")
            endDate = request.args.get("endDate","")
            searchId=request.args.get("searchId","")

            try:
                if startDate:
                    startDate = datetime.datetime.strptime(startDate, date_format)
                    startDate = startDate.replace(hour=0, minute=0, second=0, microsecond=0)
                else:
                    startDate = datetime.datetime.now().replace(hour=0, minute=0, second=0, microsecond=0)

                if endDate:
                    endDate = datetime.datetime.strptime(endDate, date_format)
                    endDate = endDate.replace(hour=23, minute=59, second=59, microsecond=999999)
                else:
                    endDate = datetime.datetime.now().replace(hour=23, minute=59, second=59, microsecond=999999)
            except Exception as ve:
                app.logger.error("Date parsing error: %s", ve)
                startDate = datetime.datetime.now().replace(hour=0, minute=0, second=0, microsecond=0)
                endDate = datetime.datetime.now().replace(hour=23, minute=59, second=59, microsecond=999999)

            if form.validate():

                kyc_apis_queryset=kycApis.objects(status=1).order_by("-id")
                for each_kycapi in kyc_apis_queryset:
                    kyc_api_dict={
                        "id":str(each_kycapi.id),
                        "kycApiName":each_kycapi.apiName,
                    }
                    kycApisList.append(kyc_api_dict)
                if searchId:
                    kyc_apis_queryset=kyc_apis_queryset.filter(id=searchId)

                for each_kycapi in kyc_apis_queryset:
                    kycApiId=str(each_kycapi.id)
                    if kycApiId:
                        thirdparty_api_charges_queryset_datewise = ThirdpartyApiCharges.objects(kycApiId=kycApiId,createdOn__gte=startDate,createdOn__lte=endDate).order_by("-id")

                        aadharTotalVerificationsCount = thirdparty_api_charges_queryset_datewise.filter(verificationType="aadhar").count()
                        panTotalVerificationsCount = thirdparty_api_charges_queryset_datewise.filter(verificationType="pan").count()
                        bankTotalVerificationsCount = thirdparty_api_charges_queryset_datewise.filter(verificationType="bank").count()

                        # Aadhar Commissions and Pg Commission For Verification charges
                        totalAadharChargeAmount = thirdparty_api_charges_queryset_datewise.filter(verificationType="aadhar").sum('commissionCharges.chargeAmount')
                        gstAadharTotalAmount =  thirdparty_api_charges_queryset_datewise.filter(verificationType="aadhar").sum('commissionCharges.gstAmount')
                        totalPgAadharChargeAmount =  thirdparty_api_charges_queryset_datewise.filter(verificationType="aadhar").sum('aggregatorCharges.chargeAmount')
                        gstPgAadharTotalAmount =  thirdparty_api_charges_queryset_datewise.filter(verificationType="aadhar").sum('aggregatorCharges.gstAmount')

                        # Pan Commissions and Pg Commission For Verification charges
                        totalPanChargeAmount =  thirdparty_api_charges_queryset_datewise.filter(verificationType="pan").sum('commissionCharges.chargeAmount')
                        gstPanTotalAmount =  thirdparty_api_charges_queryset_datewise.filter(verificationType="pan").sum('commissionCharges.gstAmount')
                        totalPgPanChargeAmount =  thirdparty_api_charges_queryset_datewise.filter(verificationType="pan").sum('aggregatorCharges.chargeAmount')
                        gstPgPanTotalAmount = thirdparty_api_charges_queryset_datewise.filter(verificationType="pan").sum('aggregatorCharges.gstAmount')

                        # Bank Commissions and Pg Commission For Verification charges
                        totalBankChargeAmount =  thirdparty_api_charges_queryset_datewise.filter(verificationType="bank").sum('commissionCharges.chargeAmount')
                        gstBankTotalAmount =  thirdparty_api_charges_queryset_datewise.filter(verificationType="bank").sum('commissionCharges.gstAmount')
                        totalPgBankChargeAmount = thirdparty_api_charges_queryset_datewise.filter(verificationType="bank").sum('aggregatorCharges.chargeAmount')
                        gstPgBankTotalAmount =  thirdparty_api_charges_queryset_datewise.filter(verificationType="bank").sum('aggregatorCharges.gstAmount')

                        datesWiseVerificationChargesDict = {
                                "apiName":each_kycapi.apiName,
                                "totalAadharChargeAmount": totalAadharChargeAmount,  
                                "gstAadharTotalAmount": gstAadharTotalAmount, 
                                "totalPgAadharChargeAmount": totalPgAadharChargeAmount,
                                "gstPgAadharTotalAmount": gstPgAadharTotalAmount,
                                "aadharTotalVerificationsCount": aadharTotalVerificationsCount,
                                "totalPanChargeAmount": totalPanChargeAmount,
                                "gstPanTotalAmount": gstPanTotalAmount,
                                "totalPgPanChargeAmount": totalPgPanChargeAmount,
                                "gstPgPanTotalAmount": gstPgPanTotalAmount,
                                "panTotalVerificationsCount": panTotalVerificationsCount,
                                "totalBankChargeAmount": totalBankChargeAmount,
                                "gstBankTotalAmount": gstBankTotalAmount,
                                "totalPgBankChargeAmount": totalPgBankChargeAmount,
                                "gstPgBankTotalAmount": gstPgBankTotalAmount,
                                "bankTotalVerificationsCount": bankTotalVerificationsCount
                            }
                        datesWiseVerificationChargesList.append(datesWiseVerificationChargesDict)

            else:
                print("form.errors",form.errors)
            
                return render_template("super_admin_templates/verification_charges_list.html",verificationChargesList=verificationChargesList,datesWiseVerificationChargesList=datesWiseVerificationChargesList,kycApisList=kycApisList,startDate=startDate.strftime(date_format),endDate=endDate.strftime(date_format),searchId=searchId,form=form)

        except Exception as e:
            app.logger.error(traceback.format_exc())
        return render_template("super_admin_templates/verification_charges_list.html",verificationChargesList=verificationChargesList,datesWiseVerificationChargesList=datesWiseVerificationChargesList,kycApisList=kycApisList,startDate=startDate.strftime(date_format),endDate=endDate.strftime(date_format),searchId=searchId,form=form)
    else:
        flash("The staff member does not have permission to view Verification charges", "danger")
        return redirect(url_for("admin.dashboard"))

