from appservices.common.util import *

bank_masters = Blueprint("bank_masters",__name__)

############### Master IFSC Bank ################

@bank_masters.route("/add_master_ifsc_bank",methods=["POST","GET"])
def add_master_ifsc_bank():
    try:
        if not session.get("adminId"):
            return redirect("admin_login")
        adminId = session.get("adminId")

        loginBrowser = request.headers.get("Sec-Ch-Ua")
        if loginBrowser:
            loginBrowseData = loginBrowser.split(";")
            browser = loginBrowseData[0]
        else:
            loginBrowseData = request.headers.get('User-Agent').split(";")
            browser = loginBrowseData[0]

        client_ip=0
        # Extracting client IP address
        if request.headers.getlist("X-Forwarded-For"): 
            client_ip = request.headers.getlist("X-Forwarded-For")[0]
        else:
            client_ip = request.remote_addr

        actionDate=datetime.datetime.now()
        

        permissionsList = check_permissions(adminId,"bankPermissions")
        if "add" in permissionsList:
            if request.method == "POST":
                bankName = request.form.get("bankName","")
                bankCode = request.form.get("bankCode","")
                priority = request.form.get("priority","")
                image = request.files.get("image","")
                remark =  request.files.get("remark","")

                jsonData = request.form.to_dict(flat=True)
                requestData = [jsonData]
                updatedrequestData = [jsonData]

                if bankName and bankCode and priority: 
                    try:
                        admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
                        if admin_queryset:
                            message=admin_queryset.userName+" "+bankName+" bank created successfully!"
                            save_admin_log_table = save_admin_logs_data(adminId,None,None,"add_master_ifsc_bank","create",actionDate,client_ip,browser,message,requestData,updatedrequestData) 
                            

                        master_ifsc_table = MasterIFSCBank(
                            adminId=adminId,
                            bankName = bankName,
                            bankCode = bankCode,
                            priority = priority,
                            remark = remark,
                            createdOn = datetime.datetime.now(),
                            status = 1,
                            )
                        save_table = master_ifsc_table.save()
                        masterIfscBankId = str(save_table.id)

                        if image:
                            if not os.path.exists(os.path.join(app.config['SITE_ROOT'], "media/masterIfscBank/")):
                                os.makedirs(os.path.join(app.config['SITE_ROOT'], "media/masterIfscBank/"))
                            save_file = image.save(os.path.join(app.config['SITE_ROOT'], "media/masterIfscBank/"+masterIfscBankId+".png"))
                            save_table.update(image=save_file)

                        flash("Master bank saved successfully!")
                        return redirect(url_for("bank_masters.get_bank_masters_list",redirectTo="masterIfscBank"))
                    except Exception as e:
                        flash("Unable to save master bank details!!")
                        app.logger.error(traceback.format_exc())
                        return redirect(url_for("bank_masters.get_bank_masters_list",redirectTo="masterIfscBank"))
                else:
                    flash("Required fields are missing!!")
                    return redirect(url_for("bank_masters.get_bank_masters_list",redirectTo="masterIfscBank"))
        else:
            flash("Staff member does not have given create bank permissions!!")
            return redirect(url_for("bank_masters.get_bank_masters_list",redirectTo="masterIfscBank"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to save master bank details!!"
        return render_template("super_admin_templates/bank_masters_list.html",error=error,redirectTo="masterIfscBank")


#Update master IFSC bank
@bank_masters.route("/update_master_ifsc_bank",methods=["POST","GET"])
def update_master_ifsc_bank():
    if not session.get("adminId"):
        return redirect("admin_login")
    adminId=session.get("adminId")    
    loginBrowser = request.headers.get("Sec-Ch-Ua")
    if loginBrowser:
        loginBrowseData = loginBrowser.split(";")
        browser = loginBrowseData[0]
    else:
        loginBrowseData = request.headers.get('User-Agent').split(";")
        browser = loginBrowseData[0]

    existing_record = ""
    client_ip=0
    # Extracting client IP address
    if request.headers.getlist("X-Forwarded-For"): 
        client_ip = request.headers.getlist("X-Forwarded-For")[0]
    else:
        client_ip = request.remote_addr

    actionDate=datetime.datetime.now()

    try:
        permissionsList = check_permissions(session.get("adminId"),"bankPermissions")
        if "edit" in permissionsList:
            masterIfscBankId = request.args.get("masterIfscBankId","")
            if request.method == "POST":
                bankName = request.form.get("bankName","")
                bankCode = request.form.get("bankCode","")
                priority = request.form.get("priority","")
                image = request.files.get("image","")
                remark = request.form.get("remark","")

                jsonData = request.form.to_dict(flat=True)

                if bankName and bankCode and priority:
                    master_ifsc_queryset = MasterIFSCBank.objects(id=masterIfscBankId,status__in=[0,1]).first()
                    existing_record = master_ifsc_queryset.to_json()
                    message=master_ifsc_queryset.adminId.userName+" "+bankName+" bank updated successfully!"
                    requestData=[master_ifsc_queryset]
                    updatedrequestData=[jsonData]
                    save_admin_log_table = save_admin_logs_data(adminId,None,None,"update_master_ifsc_bank","update",actionDate,client_ip,browser,message,requestData,updatedrequestData) 

                    if master_ifsc_queryset:
                        master_ifsc_queryset.update(
                            bankName = bankName,
                            bankCode = bankCode,
                            priority = priority,
                            remark = remark,
                            )
                        if image:
                            if not os.path.exists(os.path.join(app.config['SITE_ROOT'], "media/masterIfscBank/")):
                                os.makedirs(os.path.join(app.config['SITE_ROOT'], "media/masterIfscBank/"))
                            save_file = image.save(os.path.join(app.config['SITE_ROOT'], "media/masterIfscBank/"+masterIfscBankId+".png"))
                            master_ifsc_queryset.update(image=save_file)
                        flash("Master bank updated successfully!")
                        return redirect(url_for("bank_masters.get_bank_masters_list",redirectTo="masterIfscBank"))
                    else:
                        flash("Invaild id!!")
                        return redirect(url_for("bank_masters.get_bank_masters_list",redirectTo="masterIfscBank"))
                else:
                    flash("Required fields are missing!!")
                    return redirect(url_for("bank_masters.get_bank_masters_list",redirectTo="masterIfscBank"))
        else:
            flash("Staff member does not have given update bank permissions!!")
            return redirect(url_for("bank_masters.get_bank_masters_list",redirectTo="masterIfscBank"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to update master bank details!!"
        flash(error)
        return redirect(url_for("bank_masters.get_bank_masters_list",redirectTo="masterIfscBank"))

# @bank_masters.route("/user_bank_csv_list",methods=["POST","GET"])
# def user_bank_csv_list():
#     if not session.get("adminId"):
#         return redirect("admin_login")
#     companyBanksList = []
    
#     adminId = session.get("adminId")
#     try:
#         company_banks_queryset = CompanyBankAccounts.objects(status__in=[0,1]).order_by("-id")

#         for each_company_bank in company_banks_queryset:
#             bank_dict = fetching_account_bank_details(each_company_bank)
#             companyBanksList.append(bank_dict)

#         fieldnames = ['Bank Name', 'Bank Code', 'Acc Name', 'Acc Number', 'IFSC Code', 'Branch']
#         temp_csv_file_name = "/media/userBankCsvFiles/"+str(round(time.time() * 1000))+".csv"

#         if not os.path.exists(os.path.join(app.config['SITE_ROOT'], "media/userBankCsvFiles/")):
#             os.makedirs(os.path.join(app.config['SITE_ROOT'], "media/userBankCsvFiles/"))

#         full_file_name = app.config['SITE_ROOT']+temp_csv_file_name
#         with open(full_file_name, 'w', encoding='UTF8', newline='') as f:
#             writer = csv.DictWriter(f, fieldnames=fieldnames)
#             writer.writeheader()
#             writer.writerows(regionsList)
#         save_csv_file = CSVFileExports(
#             name=temp_csv_file_name,
#             filters=[],
#             createdOn=datetime.datetime.now(),
#             status=1
#             ).save()
#         csvFileId = str(save_csv_file.id)

#         return send_file(
#             app.config['SITE_ROOT']+temp_csv_file_name,
#             mimetype='text/csv',
#             download_name='User Banks list.csv',
#             as_attachment=True
#         )
#     except Exception as e:
#         app.logger.error(traceback.format_exc())
#         flash("Unable to export CSV data!!")
#         return redirect("bank_masters.get_bank_masters_list")


# def fetching_account_bank_details(bank_queryset):
#     bank_dict = {}
#     try:
#         if bank_queryset.bankName:
#             bank_dict["Bank Name"] = bank_queryset.bankName
#         else:
#             bank_dict["Bank Name"] = ""

#         if bank_queryset.bankCode:
#             bank_dict["Bank Code"] = bank_queryset.bankCode
#         else:
#             bank_dict["Bank Code"] = ""

#         if bank_queryset.accountName:
#             bank_dict["Acc Name"] = bank_queryset.accountName
#         else:
#             bank_dict["Acc Name"] = ""

#         if bank_queryset.accountNumber:
#             bank_dict["Acc Number"] = bank_queryset.accountNumber
#         else:
#             bank_dict["Acc Number"] = ""

#         if bank_queryset.ifscCode:
#             bank_dict["IFSC Code"] = bank_queryset.ifscCode
#         else:
#             bank_dict["IFSC Code"] = ""    

#         if bank_queryset.branch:
#             bank_dict["Branch"] = bank_queryset.branch
#         else:
#             bank_dict["Branch"] = ""
#     except Exception as e:
#         app.logger.error(traceback.format_exc())
#     return bank_dict

@bank_masters.route("/get_bank_masters_list",methods=["POST","GET"])
def get_bank_masters_list():
    if not session.get("adminId"):
        return redirect("admin_login")
    masterIfscBanksList = []
    
    adminId = session.get("adminId")
    permissionsList = check_permissions(session.get("adminId"),"bankPermissions")
    if "view" in permissionsList:
        try:
            redirectTo = request.args.get("redirectTo","masterIfscBank")
            if redirectTo:
                redirectval = redirectTo
            else:
                redirectval = "masterIfscBank"
            search_element = request.args.get("search_element","")


            master_ifsc_banks_queryset = MasterIFSCBank.objects(status__in=[0,1]).order_by("-createdOn")
            if search_element:
                master_ifsc_banks_queryset = master_ifsc_banks_queryset.filter(Q(bankName__icontains=search_element))


            # Get the current page from the query parameters
            page = request.args.get(get_page_parameter(), type=int, default=1)

            per_page = 20  # Number of items per page

            # Query the database for the current page's data
            total_count = master_ifsc_banks_queryset.count()

            start = (page - 1) * per_page

            end = min(start + per_page, total_count)

            total_master_banks = master_ifsc_banks_queryset[start:end]
            
            snoCount = start
            for each_master_ifsc_bank in total_master_banks:
                snoCount +=1
                master_ifsc_bank_dict = fetching_master_ifsc_bank_details(each_master_ifsc_bank)
                master_ifsc_bank_dict["snoCount"]=snoCount
                masterIfscBanksList.append(master_ifsc_bank_dict)

            # Pagination object for rendering pagination controls in the template
            pagination = Pagination(page=page, total=total_count, per_page=per_page, alignment="right", record_name="banks")

            return render_template("super_admin_templates/bank_masters_list.html",
                pagination=pagination,
                masterIfscBanksList=masterIfscBanksList,
                redirectval=redirectval,
                search_element=search_element
                )
        except Exception as e:
            app.logger.error(traceback.format_exc())
            error = "Unable to fetch bank masters details!!"
            return render_template("super_admin_templates/bank_masters_list.html", 
                error=error,
                pagination=pagination,
                masterIfscBanksList=masterIfscBanksList,
                search_element=search_element
                )
    else:
        flash("Staff member does not have given view bank permissions!!")
        return redirect(url_for("admin.dashboard"))
        # return render_template("super_admin_templates/bank_masters_list.html")

@bank_masters.route("/update_bank_status",methods=["POST","GET"])
def update_bank_status():
    if not session.get("adminId"):
        return redirect("admin_login")
    adminId=session.get("adminId")
    loginBrowser = request.headers.get("Sec-Ch-Ua")
    if loginBrowser:
        loginBrowseData = loginBrowser.split(";")
        browser = loginBrowseData[0]
    else:
        loginBrowseData = request.headers.get('User-Agent').split(";")
        browser = loginBrowseData[0]

    client_ip=0
    # Extracting client IP address
    if request.headers.getlist("X-Forwarded-For"): 
        client_ip = request.headers.getlist("X-Forwarded-For")[0]
    else:
        client_ip = request.remote_addr

    actionDate=datetime.datetime.now()

    jsonData = request.form.to_dict(flat=True)

    existing_record = ""
    updatedrequestData = [jsonData]

    permissionsList = check_permissions(session.get("adminId"),"bankPermissions")
    if "edit" in permissionsList:
        masterIfscBankId = request.args.get("masterIfscBankId","")
        remark = request.form.get("remark","")

        if masterIfscBankId and remark:
            try:
                message=""
                master_ifsc_banks_queryset = MasterIFSCBank.objects(id=masterIfscBankId).first()
                existing_record = master_ifsc_banks_queryset.to_json()
                requestData = [existing_record]
                if master_ifsc_banks_queryset:
                    if master_ifsc_banks_queryset.status == 0:
                        master_ifsc_banks_queryset.update(status=1,remark=remark)
                        flash("Bank activated successfully!")
                        message=master_ifsc_banks_queryset.adminId.userName+" "+master_ifsc_banks_queryset.bankName+" bank activated successfully!"
                    elif master_ifsc_banks_queryset.status == 1:
                        master_ifsc_banks_queryset.update(status=0,remark=remark)
                        flash("Bank deactivated successfully!")
                        message=master_ifsc_banks_queryset.adminId.userName+" "+master_ifsc_banks_queryset.bankName+" bank deactivated successfully!"
                    save_admin_log_table = save_admin_logs_data(adminId,None,None,"update_bank_status","updatestatus",actionDate,client_ip,browser,message,requestData,updatedrequestData)
                    return redirect(url_for("bank_masters.get_bank_masters_list",redirectTo="masterIfscBank"))
                else:
                    flash("Invaild id!!")
                    return redirect(url_for("bank_masters.get_bank_masters_list",redirectTo="masterIfscBank"))
            except Exception as e:
                app.logger.error(traceback.format_exc())
                return redirect(url_for("bank_masters.get_bank_masters_list",redirectTo="masterIfscBank"))
        else:
            flash("Required field is missing!!")
            return redirect(url_for("bank_masters.get_bank_masters_list",redirectTo="masterIfscBank"))
    else:
        flash("Staff member does not have given status update bank permissions!!")
        return redirect(url_for("bank_masters.get_bank_masters_list",redirectTo="masterIfscBank"))