from appservices.common.util import *
from appservices.common.form_schemas import *


invoice_company_details = Blueprint("invoice_company_details",__name__)


@invoice_company_details.route("/add_company_details",methods=["POST","GET"])
# @token_required
@adminid_access_token_required
@csrf_protect
def add_company_details():
    data_status={"responseStatus":0,"result":""}
    try:
        if not session.get("adminId"):
            return redirect("admin_login")
        adminId = session.get("adminId")
        
        csrf_token = request.form.get("csrf_token")
        print(csrf_token,"((((((((((((((csrf_token))))))))))))))")
        latitude = request.form.get("latitude", "")
        longitude = request.form.get("longitude", "")
        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,"invoiceCompanyDetailsPermissions")
        if "add" in permissionsList:
            if request.method == "POST":
                transactionApiIdsList = request.form.getlist("transactionApiIdsList")
                companyLogo = request.files.get("companyLogo","")
                companyName = request.form.get("companyName","")
                address = request.form.get("address","")
                mobileNumber =  request.form.get("mobileNumber","")
                email =  request.form.get("email","")
                invoiceTemplate = request.form.get("invoiceTemplate","")

                print("(((transactionApiIdsList)))",transactionApiIdsList)
                # print("(((companyLogo)))",companyLogo)
                # print("(((companyName)))",companyName)
                # print("(((address)))",address)
                # print("(((mobileNumber)))",mobileNumber)
                # print("(((email)))",email)
                # print("((((invoice template))))", invoiceTemplate)

                # if invoiceTemplate and not is_valid_description(invoiceTemplate):
                #     flash("Invoice Template contain alphabets, numbers, spaces, special characters, and newlines")
                #     return redirect(url_for("invoice_company_details.get_invoice_company_details"))

                jsonData = request.form.to_dict(flat=True)
                requestData = [jsonData]
                updatedrequestData = [jsonData]

                form = AddCompanyDetailsForm(request.form)

                print("=====================================",form)
                if form.validate_on_submit():
                    if transactionApiIdsList: 
                        try:
                            admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
                            if admin_queryset:
                                message=admin_queryset.userName+" Invoice Company Details created successfully!"
                                save_admin_log_table = save_admin_logs_data(adminId,None,None,"add_company_details","create",actionDate,client_ip,browser,message,requestData,updatedrequestData,latitude,longitude) 
                                

                            invoice_company_details_table = InvoiceCompanyDetails(
                                transactionApiIdsList=transactionApiIdsList,
                                # companyLogo = companyLogo,
                                companyName = companyName,
                                address = address,
                                mobileNumber = mobileNumber,
                                email = email,
                                createdOn = datetime.datetime.now(),
                                status = 1,
                                invoiceTemplate = invoiceTemplate
                                )
                            save_table = invoice_company_details_table.save()
                            companyDetailsId = str(save_table.id)

                            if companyLogo:
                                randomNumber = str(random_digit_generate(6))
                                if not os.path.exists(os.path.join(app.config['SITE_ROOT'], "media/companyLogos/")):
                                    os.makedirs(os.path.join(app.config['SITE_ROOT'], "media/companyLogos/"))
                                save_file = companyLogo.save(os.path.join(app.config['SITE_ROOT'], "media/companyLogos/" + str(randomNumber) + ".png")
                                    )
                                invoice_company_details_table.update(companyLogo="media/companyLogos/" + str(randomNumber) + ".png")

                            flash("Company Details saved successfully!")
                            data_status['responseStatus']=1
                            return data_status
                        except Exception as e:
                            flash("Unable to save master bank details!!")
                            app.logger.error(traceback.format_exc())
                            data_status['responseStatus']=4
                            return data_status
                    else:
                        flash("Required fields are missing!!")
                        data_status['responseStatus']=2
                        data_status['result']="Required fields are missing!!"
                        return data_status
            

                else:
                    data_status['result']=form.errors
                    return data_status


                # if transactionApiIdsList: 
                #     try:
                #         admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
                #         if admin_queryset:
                #             message=admin_queryset.userName+" "+companyName+" Invoice Company Details created successfully!"
                #             save_admin_log_table = save_admin_logs_data(adminId,None,None,"add_company_details","create",actionDate,client_ip,browser,message,requestData,updatedrequestData) 
                            

                #         invoice_company_details_table = InvoiceCompanyDetails(
                #             transactionApiIdsList=transactionApiIdsList,
                #             # companyLogo = companyLogo,
                #             companyName = companyName,
                #             address = address,
                #             mobileNumber = mobileNumber,
                #             email = email,
                #             createdOn = datetime.datetime.now(),
                #             status = 1,
                #             invoiceTemplate = invoiceTemplate
                #             )
                #         save_table = invoice_company_details_table.save()
                #         companyDetailsId = str(save_table.id)

                #         if companyLogo:
                #             randomNumber = str(random_digit_generate(6))
                #             if not os.path.exists(os.path.join(app.config['SITE_ROOT'], "media/companyLogos/")):
                #                 os.makedirs(os.path.join(app.config['SITE_ROOT'], "media/companyLogos/"))
                #             save_file = companyLogo.save(os.path.join(app.config['SITE_ROOT'], "media/companyLogos/" + str(randomNumber) + ".png")
                #                 )
                #             invoice_company_details_table.update(companyLogo="media/companyLogos/" + str(randomNumber) + ".png")

                #         flash("Company Details saved successfully!")
                #         return redirect(url_for("invoice_company_details.get_invoice_company_details"))
                #     except Exception as e:
                #         flash("Unable to save master bank details!!")
                #         app.logger.error(traceback.format_exc())
                #         return redirect(url_for("invoice_company_details.get_invoice_company_details"))
                # else:
                #     flash("Required fields are missing!!")
                #     return redirect(url_for("invoice_company_details.get_invoice_company_details"))
            else:
               return redirect(url_for("invoice_company_details.get_invoice_company_details"))
        else:
            flash("The staff member does not have permission to create a Company Details.", "danger")
            data_status['responseStatus']=4
            return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        flash("Unable to save company details details!!")
        data_status['responseStatus']=4
        return data_status


#Update master IFSC bank
@invoice_company_details.route("/update_invoice_company_details",methods=["POST","GET"])
# @token_required
@adminid_access_token_required
@csrf_protect
def update_invoice_company_details():
    data_status={"responseStatus":0,"result":""}
    if not session.get("adminId"):
        return redirect("admin_login")
    adminId=session.get("adminId")   
    
    csrf_token = request.form.get("csrf_token")
    print(csrf_token,"((((((((((((((csrf_token))))))))))))))") 
    latitude = request.form.get("latitude", "")
    longitude = request.form.get("longitude", "")
    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"),"invoiceCompanyDetailsPermissions")
        if "edit" in permissionsList:
            companyDetailsId = request.args.get("companyDetailsId","")
            print("(((companyDetailsId)))",companyDetailsId)
            if request.method == "POST":
                transactionApiIdsList = request.form.getlist("transactionApiIdsList")
                companyLogo = request.files.get("companyLogo","")
                companyName = request.form.get("companyName","")
                address = request.form.get("address","")
                mobileNumber =  request.form.get("mobileNumber","")
                email =  request.form.get("email","")
                invoiceTemplate = request.form.get("invoiceTemplate","")

                print("(((transactionApiIdsList)))",transactionApiIdsList)
                print("(((companyLogo)))",companyLogo)
                print("(((companyName)))",companyName)
                print("(((address)))",address)
                print("(((mobileNumber)))",mobileNumber)
                print("(((email)))",email)
                print("(((invoiceTemplate)))", invoiceTemplate)

                if invoiceTemplate and not is_valid_description(invoiceTemplate):
                    flash("Invoice Template contain alphabets, numbers, spaces, special characters, and newlines")
                    return redirect(url_for("invoice_company_details.get_invoice_company_details"))

                jsonData = request.form.to_dict(flat=True)

                form = AddCompanyDetailsForm(request.form,current_id=companyDetailsId)

                if form.validate_on_submit():
                    if transactionApiIdsList:
                        transactionApiIdsList = [ObjectId(api_id) for api_id in transactionApiIdsList]

                        company_details_queryset = InvoiceCompanyDetails.objects(id=companyDetailsId,status__in=[0,1]).first()
                        admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
                        existing_record = company_details_queryset.to_json()
                        if company_details_queryset.transactionApiIdsList:
                            first_api_name = company_details_queryset.transactionApiIdsList[0].apiName
                        else:
                            first_api_name = ""

                        message = f"{admin_queryset.userName} {first_api_name} Company Details updated successfully!"
                        
                        requestData=[existing_record]
                        updatedrequestData=[jsonData]

                        save_admin_log_table = save_admin_logs_data(adminId,None,None,"update_invoice_company_details","update",actionDate,client_ip,browser,message,requestData,updatedrequestData,latitude,longitude) 

                        if company_details_queryset:
                            company_details_queryset.update(
                                transactionApiIdsList = transactionApiIdsList,
                                # companyLogo = companyLogo,
                                companyName = companyName,
                                address = address,
                                mobileNumber = mobileNumber,
                                email = email,
                                invoiceTemplate = invoiceTemplate
                                )
                            if companyLogo:
                                randomNumber = str(random_digit_generate(6))
                                if not os.path.exists(os.path.join(app.config['SITE_ROOT'], "media/companyLogos/")):
                                    os.makedirs(os.path.join(app.config['SITE_ROOT'], "media/companyLogos/"))
                                save_file = companyLogo.save(os.path.join(app.config['SITE_ROOT'], "media/companyLogos/" + str(randomNumber) + ".png")
                                    )
                                company_details_queryset.update(companyLogo="media/companyLogos/" + str(randomNumber) + ".png")

                            flash("Company Details Updated successfully!")
                            data_status["responseStatus"]=1
                            return data_status
                        else:
                            flash("Invaild id!!")
                            data_status["responseStatus"]=4
                            return data_status
                    else:
                        flash("Required fields are missing!!")
                        data_status["responseStatus"]=2
                        data_status["result"]="Required fields are missing."
                        return data_status

                else:
                    data_status['result']=form.errors
                    return data_status 


                # if transactionApiIdsList:
                #     transactionApiIdsList = [ObjectId(api_id) for api_id in transactionApiIdsList]

                #     company_details_queryset = InvoiceCompanyDetails.objects(id=companyDetailsId,status__in=[0,1]).first()
                #     admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
                #     existing_record = company_details_queryset.to_json()

                #     message=admin_queryset.userName+" "+companyName+" Company Details updated successfully!"
                #     requestData=[existing_record]
                #     updatedrequestData=[jsonData]
                #     save_admin_log_table = save_admin_logs_data(adminId,None,None,"update_invoice_company_details","update",actionDate,client_ip,browser,message,requestData,updatedrequestData) 

                #     if company_details_queryset:
                #         company_details_queryset.update(
                #             transactionApiIdsList = transactionApiIdsList,
                #             # companyLogo = companyLogo,
                #             companyName = companyName,
                #             address = address,
                #             mobileNumber = mobileNumber,
                #             email = email,
                #             invoiceTemplate = invoiceTemplate
                #             )
                #         if companyLogo:
                #             randomNumber = str(random_digit_generate(6))
                #             if not os.path.exists(os.path.join(app.config['SITE_ROOT'], "media/companyLogos/")):
                #                 os.makedirs(os.path.join(app.config['SITE_ROOT'], "media/companyLogos/"))
                #             save_file = companyLogo.save(os.path.join(app.config['SITE_ROOT'], "media/companyLogos/" + str(randomNumber) + ".png")
                #                 )
                #             company_details_queryset.update(companyLogo="media/companyLogos/" + str(randomNumber) + ".png")

                #         flash("Company Details Updated successfully!")
                #         return redirect(url_for("invoice_company_details.get_invoice_company_details"))
                #     else:
                #         flash("Invaild id!!")
                #         return redirect(url_for("invoice_company_details.get_invoice_company_details"))
                # else:
                #     flash("Required fields are missing!!")
                #     return redirect(url_for("invoice_company_details.get_invoice_company_details"))
            else:
                return redirect(url_for("invoice_company_details.get_invoice_company_details"))
        else:
            flash("The staff member does not have permission to update Company Details.", "danger")
            data_status['responseStatus']=4
            return data_status

    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to update Company Details!!"
        flash(error)
        data_status['responseStatus']=4
        return data_status

@invoice_company_details.route("/get_invoice_company_details", methods=["GET"])
@adminid_access_token_required
def get_invoice_company_details():
    invoiceCompanyDetailsList=[]
    payinApisList=[]
    payinApisAddList=[]
    search_element=""
    redirectval=""
    pagination=""
    snoCount=0
    invoiceCompanyPage=None
    permissionsList = check_permissions(session.get("adminId"),"invoiceCompanyDetailsPermissions")
    if "view" in permissionsList:
        try:
            search_element = request.args.get("search_element","")

            invoiceCompanyPage = request.args.get(get_page_parameter("invoiceCompanyPage"), type=int, default=1)
            
            per_page = 20
            start = (invoiceCompanyPage - 1) * per_page

            total_count=0
            filters = Q(status__in=[0, 1])

            if search_element and search_element.strip():
                filters &= Q(companyName__icontains=search_element.strip())
            
            total_count = InvoiceCompanyDetails.objects(filters).count()


            invoice_company_details_queryset = (
                InvoiceCompanyDetails.objects(filters)
                .only("id","transactionApiIdsList","createdOn","invoiceTemplate","status")
                .order_by("-id")
                .skip(start)
                .limit(per_page)
            )

            snoCount = start

            invoiceCompanyDetailsList = list(invoice_company_details_queryset)

            payin_apis_queryset = TransactionAPI.objects(status__in=[0,1]).only("id","apiName").order_by('-id')

            payinApisList = list(payin_apis_queryset)

            pagination = Pagination(invoiceCompanyPage=invoiceCompanyPage, total=total_count, per_page=per_page, page_parameter ="invoiceCompanyPage", alignment="right", record_name="banks")


            payinApisAddList = payinApisList.copy()

            # invoice_company_details_queryset = InvoiceCompanyDetails.objects(companyName__icontains=search_element,status__in=[0,1]).order_by("-id")
            # payin_apis_queryset = TransactionAPI.objects(status__in=[0,1]).order_by('-id')
            # for each_payin_api in payin_apis_queryset:
            #     apiDict = fetching_transaction_api_details(each_payin_api)
            #     payinApisList.append(apiDict)
            
            # payinApisAddList = payinApisList.copy()


            # # 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 = invoice_company_details_queryset.count()

            # start = (page - 1) * per_page

            # end = min(start + per_page, total_count)

            # total_master_banks = invoice_company_details_queryset[start:end]
            
            # snoCount = start
            # for each_invoice_company_details in total_master_banks:
            #     transactionApisList=[]
            #     snoCount +=1
            #     for each_txn_api in each_invoice_company_details.transactionApiIdsList:
            #         transactionApisList.append(each_txn_api.apiName)
            #     for each_payin_api in payinApisAddList:
            #         if each_payin_api.get("apiName") in transactionApisList:
            #             payinApisAddList.remove(each_payin_api)
            #     if each_invoice_company_details.status == 1:
            #         statusText = "Active"
            #     else:
            #         statusText = "Inactive"


            #     invoice_company_details_dict ={
            #         "id": ObjectId(each_invoice_company_details.id),
            #         "transactionApisList": transactionApisList,
            #         # "companyLogo":each_invoice_company_details.companyLogo,
            #         "companyName":each_invoice_company_details.companyName,
            #         "address":each_invoice_company_details.address,
            #         "mobileNumber":each_invoice_company_details.mobileNumber,
            #         "email":each_invoice_company_details.email,
            #         "createdOn":each_invoice_company_details.createdOn,
            #         "actionText": statusText, 
            #         "invoiceTemplate": each_invoice_company_details.invoiceTemplate
            #     }
            #     if each_invoice_company_details.companyLogo:
            #         invoice_company_details_dict["companyLogo"]=domain+each_invoice_company_details.companyLogo
            #     else:
            #         invoice_company_details_dict["companyLogo"]=""
            #     invoice_company_details_dict["snoCount"]=snoCount
            #     invoiceCompanyDetailsList.append(invoice_company_details_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")
            # # for each_invoice_company_details in invoiceCompanyDetailsList:
            # #     for each_transaction_api in each_invoice_company_details.get("transactionApisList",[]):
            # #         for each_payin_api in payinApisList:
            # #             if each_transaction_api in each_payin_api.get("apiName"):
            # #                 payinApisList.remove(each_payin_api)
            
            # print("payinApisList:",len(payinApisList))
            # for i in payinApisList:
            #     print(i.get("apiName"))
            # print("payinApisAddList:",len(payinApisAddList))
            # for i in payinApisAddList:
            #     print(i.get("apiName"))
            return render_template("super_admin_templates/invoice_company_details_list.html",
                pagination=pagination,
                invoiceCompanyDetailsList=invoiceCompanyDetailsList,
                search_element=search_element,
                snoCount = snoCount,
                invoiceCompanyPage=invoiceCompanyPage,
                payinApisList=payinApisList,
                payinApisAddList =payinApisAddList,
                )
        except Exception as e:
            app.logger.error(traceback.format_exc())
            error = "Unable to fetch Company Details!!"
            return render_template("super_admin_templates/invoice_company_details_list.html", 
                error=error,
                pagination=pagination,
                invoiceCompanyDetailsList=invoiceCompanyDetailsList,
                search_element=search_element,
                snoCount = snoCount,
                invoiceCompanyPage=invoiceCompanyPage,
                payinApisList=payinApisList,
                payinApisAddList =payinApisAddList,
                )
    else:
        flash("The staff member does not have permission to view Company Details.", "danger")
        return redirect(url_for("admin.dashboard"))

@invoice_company_details.route("/update_invoice_company_status", methods=["POST", "GET"])
@adminid_access_token_required
def update_invoice_company_status():
    if not session.get("adminId"):
        return redirect("admin_login")
    adminId=session.get("adminId")
    latitude = request.args.get("latitude", "")
    longitude = request.args.get("longitude", "")
    loginBrowser = request.headers.get("Sec-Ch-Ua")
    userAgent=""
    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()

    jsonData = request.form.to_dict(flat=True)

    requestData = [existing_record]
    updatedrequestData = [jsonData]

    invoiceCompanyPage = request.args.get("invoiceCompanyPage")
    search_element = request.args.get("search_element", "").strip()

    permissionsList = check_permissions(session.get("adminId"),"invoiceCompanyDetailsPermissions")
    if "edit" in permissionsList:
        companyDetailsId = request.args.get("companyDetailsId", "")

        if companyDetailsId:
            try:
                # Fetch the record
                company_details_queryset = InvoiceCompanyDetails.objects(id=companyDetailsId).first()
                existing_record = company_details_queryset.to_json()   
                if company_details_queryset:
                    admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
                    # Save current record state for logging
                    existing_record = company_details_queryset.to_json()
                    requestData = [existing_record]
                    if company_details_queryset.transactionApiIdsList:
                        first_api_name = company_details_queryset.transactionApiIdsList[0].apiName
                    else:
                        first_api_name = ""

                    

                    # Toggle status
                    if company_details_queryset.status == 0:
                        company_details_queryset.update(status=1)
                        flash("Invoice company details activated successfully!")
                        # message = f"{company_details_queryset.companyName} activated successfully!"
                        message=admin_queryset.userName+" "+first_api_name+" invoice company details activated successfully!"

                    elif company_details_queryset.status == 1:
                        company_details_queryset.update(status=0)
                        flash("Invoice company details deactivated successfully!")
                        # message = f"{company_details_queryset.companyName} deactivated successfully!"
                        message=admin_queryset.userName+" "+first_api_name+" invoice company details deactivated successfully!"
                    save_admin_log_table = save_admin_logs_data(adminId,None,None,"update_invoice_company_status","updatestatus",actionDate,client_ip,browser,message,requestData,updatedrequestData,latitude,longitude)
                    return redirect(url_for("invoice_company_details.get_invoice_company_details",search_element=search_element,invoiceCompanyPage=invoiceCompanyPage))
                else:
                    flash("Invalid ID!")
                    return redirect(url_for("invoice_company_details.get_invoice_company_details",search_element=search_element,invoiceCompanyPage=invoiceCompanyPage))
            except Exception as e:
                app.logger.error(traceback.format_exc())
                flash("An error occurred while updating the status!")
                return redirect(url_for("invoice_company_details.get_invoice_company_details",search_element=search_element,invoiceCompanyPage=invoiceCompanyPage))
        else:
            flash("Required fields are missing!")
            return redirect(url_for("invoice_company_details.get_invoice_company_details",search_element=search_element,invoiceCompanyPage=invoiceCompanyPage))
    else:
        flash("The staff member does not have permission to update Invoice Company status.", "danger")
        return redirect(url_for("invoice_company_details.get_invoice_company_details"))
   