from appservices.common.util import *

regions = Blueprint("regions",__name__)

# Add region
@regions.route("/add_region",methods=["POST","GET"])
def add_region():
    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()
        
        if request.method == "POST":
            regionName = request.form.get("regionName", "")
            regionType = request.form.get("regionType", "")

            jsonData = request.form.to_dict(flat=True)
            requestData = [jsonData]
            updatedrequestData = [jsonData]

            if regionName and regionType:
                try:
                    admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
                    if admin_queryset:
                        message=admin_queryset.userName+" "+regionName+" region created successfully!"
                        save_admin_log_table = save_admin_logs_data(adminId,None,None,"add_region","create",actionDate,client_ip,browser,message,requestData,updatedrequestData) 

                    region_table = Regions(
                        adminId=adminId,
                        regionName=regionName,
                        regionType=regionType,
                        createdOn=datetime.datetime.now(),
                        status=1,
                    )
                    save_table = region_table.save()
                    regionId = str(save_table.id)

                    flash("Region saved successfully!")
                    return redirect(url_for("regions.regions_list",redirectto="Region"))
                
                except Exception as e:
                    flash("Unable to save region!!")
                    app.logger.error(traceback.format_exc())
                    return redirect(url_for("regions.regions_list",redirectto="Region"))
            
            else:
                flash("Required fields are missing!!")
                return redirect(url_for("regions.regions_list",redirectto="Region"))

    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to save region!!"
        return render_template("super_admin_templates/country_master_list.html", error=error)

def fetching_regions_details(region_queryset):
    region_dict = {}
    try:
        region_dict={
        "id":str(region_queryset.id),
        "regionName":region_queryset.regionName,
        "regionType":region_queryset.regionType
        }
        if region_queryset.status==1:
            region_dict["actionText"] = "Active"
        else:
            region_dict["actionText"] = "Deactive"
        if region_queryset.createdOn:
            region_dict["createdOn"] = region_queryset.createdOn.strftime("%m-%d-%Y")
        else:
            region_dict["createdOn"] = ""
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return region_dict

# View All Regions
@regions.route("/regions_list",methods=["POST","GET"])
def regions_list():
    if not session.get("adminId"):
        return redirect("admin_login")
    regionsList = []
    countriesList = []
    statesList = []
    citiesList = []
    blocksList = []
    pincodesList = []
    pagination = ""
    countryPagination="",
    statePagination="",
    cityPagination="",
    blockPagination="",
    pincodePagination="",

    
    adminId = session.get("adminId")
    try:
        redirectto = request.args.get('redirectto','Region')
        if redirectto:
            redirectval=redirectto
        else:
            redirectval="Region"
        

        regions_search_element = request.form.get("regions_search_element","")
        countries_search_element = request.form.get("countries_search_element","")
        states_search_element = request.form.get("states_search_element","")
        cities_search_element = request.form.get("cities_search_element","")
        blocks_search_element = request.form.get("blocks_search_element","")
        pincodes_search_element = request.form.get("pincodes_search_element","")


         ################# For Regions Data ##################

        regions_queryset = Regions.objects(status__in=[0,1]).order_by("sorting")
        if regions_search_element:
            regions_queryset = Regions.filter(Q(regionName__icontains=regions_search_element))
        
        regionpage = request.args.get(get_page_parameter('regionpage'), type=int, default=1)
        print(regionpage,"regionpage")

        per_page = 20  # Number of items per page

        # Query the database for the current page's data
        total_count = regions_queryset.count()

        start = (regionpage - 1) * per_page

        end = min(start + per_page, total_count)

        total_regions = regions_queryset[start:end]
        
        snoCount = start

        for each_region in total_regions:
            snoCount +=1
            region_dict = fetching_regions_details(each_region)
            region_dict["snoCount"]=snoCount
            regionsList.append(region_dict)

        pagination = Pagination(regionpage=regionpage, total=total_count,page_parameter="regionpage",per_page=per_page, alignment="right", record_name="Regions",href="regions_list?redirectto=Region&regionpage={0}")
        

        ################# For Countries Data ##################

        countries_queryset = Countries.objects(status__in=[0,1]).order_by("sorting")
        if countries_search_element:
            countries_queryset = Countries.filter(Q(countryName__icontains=countries_search_element))
       
        countryPage = request.args.get(get_page_parameter('countryPage'), type=int, default=1)
        print(countryPage,"countryPage")
        per_page = 20  # Number of items per page

        
        total_count = countries_queryset.count()

        start = (countryPage - 1) * per_page

        end = min(start + per_page, total_count)

        total_countries = countries_queryset[start:end]
        
        snoCount = start

        for each_country in total_countries:
            snoCount +=1
            country_dict = fetching_countries_details(each_country)
            country_dict["snoCount"]=snoCount
            countriesList.append(country_dict)

        countryPagination = Pagination(countryPage=countryPage, total=total_count,page_parameter="countryPage",per_page=per_page, alignment="right", record_name="Countries",href="regions_list?redirectto=Country&countryPage={0}")


        ################# For States Data ##################
    
        states_queryset = States.objects(status__in=[0,1]).order_by("sorting")
        if states_search_element:
            states_queryset = States.filter(Q(stateName__icontains=states_search_element))
        
        statePage = request.args.get(get_page_parameter('statePage'), type=int, default=1)
        print(statePage,"statePage")
        per_page = 20  # Number of items per page

        # Query the database for the current page's data
        total_count = states_queryset.count()

        start = (statePage - 1) * per_page

        end = min(start + per_page, total_count)

        total_states = states_queryset[start:end]
        
        snoCount = start
        for each_state in total_states:
            snoCount +=1
            state_dict = fetching_states_details(each_state)
            state_dict["snoCount"]=snoCount
            statesList.append(state_dict)

        statePagination = Pagination(statePage=statePage, total=total_count,page_parameter="statePage",per_page=per_page, alignment="right", record_name="States",href="regions_list?redirectto=State&statePage={0}")

        ################# For Cities Data ##################

        cities_queryset = Cities.objects(status__in=[0,1]).order_by("sorting")
        if cities_search_element:
            cities_queryset = Cities.filter(Q(cityName__icontains=cities_search_element))
       
        cityPage = request.args.get(get_page_parameter('cityPage'), type=int, default=1)
        print(cityPage,"cityPage")
        city_per_page = 20  # Number of items per page

        
        total_city_count = cities_queryset.count()

        city_start = (cityPage - 1) * city_per_page

        city_end = min(city_start + city_per_page, total_city_count)

        total_cities = cities_queryset[city_start:city_end]
        
        citysnoCount = city_start

        for each_city in total_cities:
            citysnoCount +=1
            city_dict = fetching_cities_details(each_city)
            city_dict["citysnoCount"]=citysnoCount
            citiesList.append(city_dict)

        cityPagination = Pagination(cityPage=cityPage, total=total_city_count,page_parameter="cityPage",per_page=city_per_page, alignment="right", record_name="Cities",href="regions_list?redirectto=City&cityPage={0}")     



        ################# For Block/PO Data ##################

        blocks_queryset = BlocksPos.objects(status__in=[0,1]).order_by("sorting")
        if blocks_search_element:
            blocks_queryset = BlocksPos.filter(Q(name__icontains=blocks_search_element))
       
        blockPage = request.args.get(get_page_parameter('blockPage'), type=int, default=1)
        print(blockPage,"blockPage")
        per_page = 20  # Number of items per page

        
        total_count = blocks_queryset.count()

        start = (blockPage - 1) * per_page

        end = min(start + per_page, total_count)

        total_blocks = blocks_queryset[start:end]
        
        snoCount = start

        for each_block in total_blocks:
            snoCount +=1
            block_dict = fetching_blocks_details(each_block)
            block_dict["snoCount"]=snoCount
            blocksList.append(block_dict)

        blockPagination = Pagination(blockPage=blockPage, total=total_count,page_parameter="blockPage",per_page=per_page, alignment="right", record_name="BlocksPos",href="regions_list?redirectto=Block&blockPage={0}")

        ################# For Pincodes Data ##################
        
        pincodes_queryset = Pincodes.objects(status__in=[0,1]).order_by("sorting")
        if pincodes_search_element:
            pincodes_queryset = Pincodes.filter(Q(pincode__icontains=pincodes_search_element))
       
        pincodePage = request.args.get(get_page_parameter('pincodePage'), type=int, default=1)
        print(pincodePage,"pincodePage")
        per_page = 20  # Number of items per page

        
        total_count = pincodes_queryset.count()

        start = (pincodePage - 1) * per_page

        end = min(start + per_page, total_count)

        total_pincodes = pincodes_queryset[start:end]
        
        snoCount = start

        for each_pincode in total_pincodes:
            snoCount +=1
            pincode_dict = fetching_pincode_details(each_pincode)
            pincode_dict["snoCount"]=snoCount
            pincodesList.append(pincode_dict)

        pincodePagination = Pagination(pincodePage=pincodePage, total=total_count,page_parameter="pincodePage",per_page=per_page, alignment="right", record_name="Pincodes",href="regions_list?redirectto=Pincode&pincodePage={0}")

        
        return render_template("super_admin_templates/country_master_list.html",
            pagination=pagination,
            countryPagination=countryPagination,
            statePagination=statePagination,
            cityPagination=cityPagination,
            blockPagination=blockPagination,
            pincodePagination=pincodePagination,
            regionsList=regionsList,
            countriesList=countriesList,
            statesList=statesList,
            citiesList=citiesList,
            blocksList=blocksList,
            pincodesList=pincodesList,
            countries_search_element=countries_search_element,
            states_search_element=states_search_element,
            cities_search_element=cities_search_element,
            blocks_search_element=blocks_search_element,
            pincodes_search_element=pincodes_search_element,
            regions_search_element=regions_search_element,
            redirectval=redirectval
            )
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to fetch regions details!!"
        return render_template("super_admin_templates/country_master_list.html", 
            error=error,
            pagination=pagination,
            countryPagination=countryPagination,
            statePagination=statePagination,
            cityPagination=cityPagination,
            blockPagination=blockPagination,
            pincodePagination=pincodePagination,
            countriesList=countriesList,
            citiesList=citiesList,
            blocksList=blocksList,
            pincodesList=pincodesList,
            statesList=statesList,
            regionsList=regionsList,
            countries_search_element=countries_search_element,
            states_search_element=states_search_element,
            blocks_search_element=blocks_search_element,
            pincodes_search_element=pincodes_search_element,
            regions_search_element=regions_search_element,
            redirectval=redirectval
            )


# Update regions type status
@regions.route("/update_region_type_status",methods=["POST","GET"])
def update_region_type_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]
    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)
    
    updatedrequestData = [jsonData]

    regionId = request.args.get("regionId","")

    if regionId:
        try:
            region_queryset = Regions.objects(id=regionId,status__nin=[2]).first()
            existing_record = region_queryset.to_json()
            requestData = [existing_record]
            if region_queryset:
                if region_queryset.status == 0:
                    region_queryset.update(status=1)
                    flash("Region activated successfully!")
                    message=region_queryset.adminId.userName+" "+region_queryset.regionName+" Region activated successfully!"
                elif region_queryset.status == 1:
                    region_queryset.update(status=0)
                    flash("Region deactivated successfully!")
                    message=region_queryset.adminId.userName+" "+region_queryset.regionName+" Region deactivated successfully!"
                save_admin_log_table = save_admin_logs_data(adminId,None,None,"update_region_type_status","updatestatus",actionDate,client_ip,browser,message,requestData,updatedrequestData)
                return redirect(url_for("regions.regions_list"))
            else:
                flash("Invaild id!!")
                return redirect(url_for("regions.regions_list"))
        except Exception as e:
            app.logger.error(traceback.format_exc())
            return redirect(url_for("regions.regions_list"))
    else:
        return redirect(url_for("regions.regions_list"))


# Update region
@regions.route("/update_region",methods=["POST","GET"])
def update_region():
    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:
        regionId = request.args.get("regionId","")
        if request.method == "POST":
            regionName = request.form.get("regionName","")
            regionType = request.form.get("regionType","")

            jsonData = request.form.to_dict(flat=True)

            region_queryset = Regions.objects(id=regionId).first()
            existing_record = region_queryset.to_json()
            message=region_queryset.adminId.userName+" "+regionName+" Region updated successfully!"
            requestData=[existing_record]
            updatedrequestData=[jsonData]
            save_admin_log_table = save_admin_logs_data(adminId,None,None,"update_region","update",actionDate,client_ip,browser,message,requestData,updatedrequestData)

            if region_queryset:
                region_queryset.update(
                    regionName=regionName,
                    regionType=regionType
                    )
                flash("Region updated successfully!")
                return redirect(url_for("regions.regions_list"))
            else:
                flash("Invaild id!!")
                return redirect(url_for("regions.regions_list"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to update region!!"
        return redirect(url_for("regions.regions_list"))


# Delete Region
@regions.route("/delete_region",methods=["GET"])
def delete_region():
    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]
        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)
        
        updatedrequestData = [jsonData]

        if request.method == "GET":
            regionId = request.args.get("regionId","")
            region_queryset = Regions.objects(id=regionId,status__in=[0,1]).first()
            existing_record = region_queryset.to_json()
            requestData = [existing_record]
            region_queryset.update(status=2)
            flash("Region deleted successfully!")
            message=region_queryset.adminId.userName+" "+region_queryset.regionName+" Region deleted successfully!"
            save_admin_log_table = save_admin_logs_data(adminId,None,None,"delete_region","delete",actionDate,client_ip,browser,message,requestData,updatedrequestData)
            return redirect(url_for("regions.regions_list"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        flash("Unable to delete region!!")
        return redirect(url_for("regions.regions_list"))


def fetching_csv_regions_details(region_queryset):
    region_dict = {}
    try:
        if region_queryset.regionName:
            region_dict["Region Name"] = region_queryset.regionName
        else:
            region_dict["Region Name"] = ""

        if region_queryset.regionType:
            region_dict["Region Type"] = region_queryset.regionType
        else:
            region_dict["Region Type"] = ""        

        if region_queryset.status == 1:
            region_dict["Status"] = "Active"
        else:
            region_dict["Status"] = "In-Active"
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return region_dict


@regions.route("/regions_csv_list",methods=["POST","GET"])
def regions_csv_list():
    if not session.get("adminId"):
        return redirect("admin_login")
    regionsList = []
    
    adminId = session.get("adminId")
    try:
        regions_queryset = Regions.objects(status__in=[0,1]).order_by("-id")

        for each_region in regions_queryset:
            region_dict = fetching_csv_regions_details(each_region)
            regionsList.append(region_dict)

        fieldnames = ['Region Name', 'Region Type', 'Status']
        temp_csv_file_name = "/media/regions_csv_files/"+str(round(time.time() * 1000))+".csv"

        if not os.path.exists(os.path.join(app.config['SITE_ROOT'], "media/regions_csv_files/")):
            os.makedirs(os.path.join(app.config['SITE_ROOT'], "media/regions_csv_files/"))

        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='Regions list.csv',
            as_attachment=True
        )
    except Exception as e:
        app.logger.error(traceback.format_exc())
        flash("Unable to export CSV data!!")
        return redirect("regions.regions_list")



############################ Countries ################################

@regions.route("/add_country",methods=["POST","GET"])
def add_country():
    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()

        if request.method == "POST":
            countryName = request.form.get("countryName","")
            countryCode = request.form.get("countryCode","")
            regionId = request.form.get("regionId","")
            regex = request.form.get("regex","")
            countryFlag = request.files.get("countryFlag")

            jsonData = request.form.to_dict(flat=True)
            requestData = [jsonData]
            updatedrequestData = [jsonData]

            if countryName and countryCode and regionId and regex:
                try:
                    admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
                    if admin_queryset:
                        message=admin_queryset.userName+" "+countryName+" country created successfully!"
                        save_admin_log_table = save_admin_logs_data(adminId,None,None,"add_country","create",actionDate,client_ip,browser,message,requestData,updatedrequestData)

                    country_table = Countries(
                        adminId=adminId,
                        countryName = countryName,
                        countryCode = countryCode,
                        regionId = regionId,
                        regex = regex,
                        createdOn = datetime.datetime.now(),
                        status = 1,
                        )
                    save_table = country_table.save()
                    countryId = str(save_table.id)

                    if countryFlag:
                        if not os.path.exists(os.path.join(app.config['SITE_ROOT'], "media/countries/")):
                            os.makedirs(os.path.join(app.config['SITE_ROOT'], "media/countries/"))
                        save_file = countryFlag.save(os.path.join(app.config['SITE_ROOT'], "media/countries/"+countryId+".png"))
                        save_table.update(countryFlag="media/countries/"+countryId+".png")

                    flash("Country saved successfully!")
                    return redirect(url_for("regions.regions_list",redirectto="Country"))
                except Exception as e:
                    flash("Unable to save country!!")
                    app.logger.error(traceback.format_exc())
                    return redirect(url_for("regions.regions_list",redirectto="Country"))
            else:
                flash("Required fields are missing!!")
                return redirect(url_for("regions.regions_list",redirectto="Country"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to save country!!"
        return render_template("super_admin_templates/country_master_list.html",error=error)


def fetching_csv_countries_details(country_queryset):
    country_dict = {}
    try:
        if country_queryset.countryName:
            country_dict["Country Name"] = country_queryset.countryName
        else:
            country_dict["Country Name"] = ""

        if country_queryset.regionId.regionName:
            country_dict["Region Name"] = country_queryset.regionId.regionName
        else:
            country_dict["Region Name"] = ""        

        if country_queryset.regex:
            country_dict["Regex"] = country_queryset.regex
        else:
            country_dict["Regex"] = ""

        if country_queryset.countryCode:
            country_dict["Country Code"] = country_queryset.countryCode
        else:
            country_dict["Country Code"] = ""

        if country_queryset.status == 1:
            country_dict["Status"] = "Active"
        else:
            country_dict["Status"] = "In-Active"
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return country_dict


@regions.route("/countries_csv_list",methods=["POST","GET"])
def countries_csv_list():
    if not session.get("adminId"):
        return redirect("admin_login")
    countriesList = []
    
    adminId = session.get("adminId")
    try:
        countries_queryset = Countries.objects(status__in=[0,1]).order_by("-id")
        for each_country in countries_queryset:
            country_dict = fetching_csv_countries_details(each_country)
            countriesList.append(country_dict)


        fieldnames = ['Country Name', 'Region Name', 'Regex', 'Country Code','Status']
        temp_csv_file_name = "/media/countries_csv_files/"+str(round(time.time() * 1000))+".csv"

        if not os.path.exists(os.path.join(app.config['SITE_ROOT'], "media/countries_csv_files/")):
            os.makedirs(os.path.join(app.config['SITE_ROOT'], "media/countries_csv_files/"))

        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(countriesList)
        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='Countries list.csv',
            as_attachment=True
        )
    except Exception as e:
        app.logger.error(traceback.format_exc())
        flash("Unable to export CSV data!!")
        return redirect("regions.regions_list",redirectto="Country")


# Update countries type status
@regions.route("/update_country_type_status",methods=["POST","GET"])
def update_country_type_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]
    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)
    
    updatedrequestData = [jsonData]

    countryId = request.args.get("countryId","")

    if countryId:
        try:
            country_queryset = Countries.objects(id=countryId,status__nin=[2]).first()
            existing_record = country_queryset.to_json()
            requestData = [existing_record]
            if country_queryset:
                if country_queryset.status == 0:
                    country_queryset.update(status=1)
                    flash("country activated successfully!")
                    message=country_queryset.adminId.userName+" "+country_queryset.countryName+" country activated successfully!"
                elif country_queryset.status == 1:
                    country_queryset.update(status=0)
                    flash("country deactivated successfully!")
                    message=country_queryset.adminId.userName+" "+country_queryset.countryName+" country deactivated successfully!"
                save_admin_log_table = save_admin_logs_data(adminId,None,None,"update_country_type_status","updatestatus",actionDate,client_ip,browser,message,requestData,updatedrequestData)
                return redirect(url_for("regions.regions_list",redirectto="Country"))
            else:
                flash("Invaild id!!")
                return redirect(url_for("regions.regions_list",redirectto="Country"))
        except Exception as e:
            app.logger.error(traceback.format_exc())
            return redirect(url_for("regions.regions_list",redirectto="Country"))
    else:
        return redirect(url_for("regions.regions_list",redirectto="Country"))


# Update country
@regions.route("/update_country",methods=["POST","GET"])
def update_country():
    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:
        countryId = request.args.get("countryId","")
        if request.method == "POST":
            countryName = request.form.get("countryName","")
            countryCode = request.form.get("countryCode","")
            regex = request.form.get("regex","")
            regionId = request.form.get("regionId","")
            countryFlag = request.files.get("countryFlag")

            jsonData = request.form.to_dict(flat=True)

            country_queryset = Countries.objects(id=countryId).first()
            existing_record = country_queryset.to_json()
            message=country_queryset.adminId.userName+" "+countryName+" country updated successfully!"
            requestData=[existing_record]
            updatedrequestData=[jsonData]
            save_admin_log_table = save_admin_logs_data(adminId,None,None,"update_country","update",actionDate,client_ip,browser,message,requestData,updatedrequestData) 

            if country_queryset:
                country_queryset.update(
                    countryName=countryName,
                    countryCode=countryCode,
                    regex=regex,
                    regionId=ObjectId(regionId)
                    )
                if countryFlag:
                    if not os.path.exists(os.path.join(app.config['SITE_ROOT'], "media/countries/")):
                        os.makedirs(os.path.join(app.config['SITE_ROOT'], "media/countries/"))
                    save_file = countryFlag.save(os.path.join(app.config['SITE_ROOT'], "media/countries/"+countryId+".png"))
                    country_queryset.update(countryFlag="media/countries/"+countryId+".png")
                flash("country updated successfully!")
                return redirect(url_for("regions.regions_list",redirectto="Country"))
            else:
                flash("Invaild id!!")
                return redirect(url_for("regions.regions_list",redirectto="Country"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to update country!!"
        return redirect(url_for("regions.regions_list",redirectto="Country"))


# Delete country
@regions.route("/delete_country",methods=["GET"])
def delete_country():
    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]

        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)
        
        updatedrequestData = [jsonData]

        if request.method == "GET":
            countryId = request.args.get("countryId","")
            country_queryset = Countries.objects(id=countryId,status__in=[0,1]).first()
            existing_record = country_queryset.to_json()
            requestData = [existing_record]
            country_queryset.update(status=2)
            flash("country deleted successfully!")
            message=country_queryset.adminId.userName+" "+country_queryset.countryName+" country deleted successfully!"
            save_admin_log_table = save_admin_logs_data(adminId,None,None,"delete_country","delete",actionDate,client_ip,browser,message,requestData,updatedrequestData)
            return redirect(url_for("regions.regions_list",redirectto="Country"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        flash("Unable to delete country!!")
        return redirect(url_for("regions.regions_list",redirectto="Country"))


############################ States ##############################

@regions.route("/add_state",methods=["POST","GET"])
def add_state():
    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()

        if request.method == "POST":
            stateName = request.form.get("stateName","")
            countryId = request.form.get("countryId","")

            jsonData = request.form.to_dict(flat=True)
            requestData = [jsonData]
            updatedrequestData = [jsonData]

            if stateName and countryId:
                try:
                    admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
                    if admin_queryset:
                        message=admin_queryset.userName+" "+stateName+" state created successfully!"
                        save_admin_log_table = save_admin_logs_data(adminId,None,None,"add_state","create",actionDate,client_ip,browser,message,requestData,updatedrequestData)

                    state_table = States(
                        adminId=adminId,
                        stateName = stateName,
                        countryId = countryId,
                        createdOn = datetime.datetime.now(),
                        status = 1,
                        )
                    save_table = state_table.save()
                    stateId = str(save_table.id)

                    flash("State saved successfully!")
                    return redirect(url_for("regions.regions_list",redirectto="State"))
                except Exception as e:
                    flash("Unable to save state!!")
                    app.logger.error(traceback.format_exc())
                    return redirect(url_for("regions.regions_list",redirectto="State"))
            else:
                flash("Required fields are missing!!")
                return redirect(url_for("regions.regions_list",redirectto="State"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to save state!!"
        return render_template("super_admin_templates/country_master_list.html",error=error)


# Update state type status
@regions.route("/update_state_status",methods=["POST","GET"])
def update_state_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]

    stateId = request.args.get("stateId","")

    if stateId:
        try:
            state_queryset = States.objects(id=stateId,status__nin=[2]).first()
            existing_record = state_queryset.to_json()
            requestData = [existing_record]
            if state_queryset:
                if state_queryset.status == 0:
                    state_queryset.update(status=1)
                    flash("State activated successfully!")
                    message=state_queryset.adminId.userName+" "+state_queryset.stateName+" State activated successfully!"
                elif state_queryset.status == 1:
                    state_queryset.update(status=0)
                    flash("State deactivated successfully!")
                    message=state_queryset.adminId.userName+" "+state_queryset.stateName+" State deactivated successfully!"
                save_admin_log_table = save_admin_logs_data(adminId,None,None,"update_state_status","updatestatus",actionDate,client_ip,browser,message,requestData,updatedrequestData)

                return redirect(url_for("regions.regions_list",redirectto="State"))
            else:
                flash("Invaild id!!")
                return redirect(url_for("regions.regions_list",redirectto="State"))
        except Exception as e:
            app.logger.error(traceback.format_exc())
            return redirect(url_for("regions.regions_list",redirectto="State"))
    else:
        return redirect(url_for("regions.regions_list",redirectto="State"))


# Update state
@regions.route("/update_state",methods=["POST","GET"])
def update_state():
    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:
        stateId = request.args.get("stateId","")
        if request.method == "POST":
            stateName = request.form.get("stateName","")
            countryId = request.form.get("countryId","")

            jsonData = request.form.to_dict(flat=True)

            state_queryset = States.objects(id=stateId).first()
            existing_record = state_queryset.to_json()

            message=state_queryset.adminId.userName+" "+stateName+" State updated successfully!"
            requestData=[existing_record]
            updatedrequestData=[jsonData]
            save_admin_log_table = save_admin_logs_data(adminId,None,None,"update_state","update",actionDate,client_ip,browser,message,requestData,updatedrequestData)

            if state_queryset:
                state_queryset.update(
                    stateName=stateName,
                    countryId=ObjectId(countryId)
                    )
                flash("State updated successfully!")
                return redirect(url_for("regions.regions_list",redirectto="State"))
            else:
                flash("Invaild id!!")
                return redirect(url_for("regions.regions_list",redirectto="State"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to update state!!"
        return redirect(url_for("regions.regions_list",redirectto="State"))


# Delete state
@regions.route("/delete_state",methods=["GET"])
def delete_state():
    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()
        jsonData = request.form.to_dict(flat=True)

        existing_record = ""
        updatedrequestData = [jsonData]

        if request.method == "GET":
            stateId = request.args.get("stateId","")
            state_queryset = States.objects(id=stateId,status__in=[0,1]).first()
            existing_record = state_queryset.to_json()
            requestData = [existing_record]
            state_queryset.update(status=2)
            flash("State deleted successfully!")
            message=state_queryset.adminId.userName+" "+state_queryset.stateName+" State deleted successfully!"
            save_admin_log_table = save_admin_logs_data(adminId,None,None,"delete_state","delete",actionDate,client_ip,browser,message,requestData,updatedrequestData)
            return redirect(url_for("regions.regions_list",redirectto="State"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        flash("Unable to delete state!!")
        return redirect(url_for("regions.regions_list",redirectto="State"))



def fetching_csv_states_details(state_queryset):
    state_dict = {}
    try:
        if state_queryset.stateName:
            state_dict["State Name"] = state_queryset.stateName
        else:
            state_dict["State Name"] = ""

        if state_queryset.countryId.countryName:
            state_dict["Country Name"] = state_queryset.countryId.countryName
        else:
            state_dict["Country Name"] = ""

        if state_queryset.status == 1:
            state_dict["Status"] = "Active"
        else:
            state_dict["Status"] = "In-Active"
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return state_dict


@regions.route("/states_csv_list",methods=["POST","GET"])
def states_csv_list():
    if not session.get("adminId"):
        return redirect("admin_login")
    statesList = []
    
    adminId = session.get("adminId")
    try:
        states_queryset = States.objects(status__in=[0,1]).order_by("-id")
        for each_state in states_queryset:
            state_dict = fetching_csv_states_details(each_state)
            statesList.append(state_dict)


        fieldnames = ['State Name', 'Country Name','Status']
        temp_csv_file_name = "/media/states_csv_files/"+str(round(time.time() * 1000))+".csv"

        if not os.path.exists(os.path.join(app.config['SITE_ROOT'], "media/states_csv_files/")):
            os.makedirs(os.path.join(app.config['SITE_ROOT'], "media/states_csv_files/"))

        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(statesList)
        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='States list.csv',
            as_attachment=True
        )
    except Exception as e:
        app.logger.error(traceback.format_exc())
        flash("Unable to export CSV data!!")
        return redirect("regions.regions_list",redirectto="State")



############################ Cities ##############################

@regions.route("/add_city",methods=["POST","GET"])
def add_city():
    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()

        if request.method == "POST":
            cityName = request.form.get("cityName","")
            stateId = request.form.get("stateId","")

            jsonData = request.form.to_dict(flat=True)
            requestData = [jsonData]
            updatedrequestData = [jsonData]

            if cityName and stateId:
                try:
                    admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
                    if admin_queryset:
                        message=admin_queryset.userName+" "+cityName+" City created successfully!"
                        save_admin_log_table = save_admin_logs_data(adminId,None,None,"add_city","create",actionDate,client_ip,browser,message,requestData,updatedrequestData) 
                    city_table = Cities(
                        adminId=adminId,
                        cityName = cityName,
                        stateId = stateId,
                        createdOn = datetime.datetime.now(),
                        status = 1,
                        )
                    save_table = city_table.save()
                    cityId = str(save_table.id)

                    flash("City saved successfully!")
                    return redirect(url_for("regions.regions_list",redirectto="City"))
                except Exception as e:
                    flash("Unable to save city!!")
                    app.logger.error(traceback.format_exc())
                    return redirect(url_for("regions.regions_list",redirectto="City"))
            else:
                flash("Required fields are missing!!")
                return redirect(url_for("regions.regions_list",redirectto="City"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to save city!!"
        return render_template("super_admin_templates/country_master_list.html",error=error)


# Update city type status
@regions.route("/update_city_status",methods=["POST","GET"])
def update_city_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]

    cityId = request.args.get("cityId","")

    if cityId:
        try:
            city_queryset = Cities.objects(id=cityId,status__nin=[2]).first()
            existing_record = city_queryset.to_json()
            requestData = [existing_record]
            if city_queryset:
                if city_queryset.status == 0:
                    city_queryset.update(status=1)
                    flash("City activated successfully!")
                    message=city_queryset.adminId.userName+" "+city_queryset.cityName+" City activated successfully!"
                elif city_queryset.status == 1:
                    city_queryset.update(status=0)
                    flash("City deactivated successfully!")
                    message=city_queryset.adminId.userName+" "+city_queryset.cityName+" City deactivated successfully!"
                save_admin_log_table = save_admin_logs_data(adminId,None,None,"update_city_status","updatestatus",actionDate,client_ip,browser,message,requestData,updatedrequestData)
                return redirect(url_for("regions.regions_list",redirectto="City"))
            else:
                flash("Invaild id!!")
                return redirect(url_for("regions.regions_list",redirectto="City"))
        except Exception as e:
            app.logger.error(traceback.format_exc())
            return redirect(url_for("regions.regions_list",redirectto="City"))
    else:
        return redirect(url_for("regions.regions_list",redirectto="City"))


# Update city
@regions.route("/update_city",methods=["POST","GET"])
def update_city():
    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:
        cityId = request.args.get("cityId","")
        if request.method == "POST":
            cityName = request.form.get("cityName","")
            stateId = request.form.get("stateId","")

            jsonData = request.form.to_dict(flat=True)

            city_queryset = Cities.objects(id=cityId).first()
            existing_record = city_queryset.to_json()
            message=city_queryset.adminId.userName+" "+cityName+" City updated successfully!"
            requestData=[existing_record]
            updatedrequestData=[jsonData]
            save_admin_log_table = save_admin_logs_data(adminId,None,None,"update_city","update",actionDate,client_ip,browser,message,requestData,updatedrequestData) 

            if city_queryset:
                city_queryset.update(
                    cityName=cityName,
                    stateId=ObjectId(stateId)
                    )
                flash("City updated successfully!")
                return redirect(url_for("regions.regions_list",redirectto="City"))
            else:
                flash("Invaild id!!")
                return redirect(url_for("regions.regions_list",redirectto="City"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to update city!!"
        return redirect(url_for("regions.regions_list",redirectto="City"))


# Delete city
@regions.route("/delete_city",methods=["GET"])
def delete_city():
    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()

        jsonData = request.form.to_dict(flat=True)
        existing_record = ""
        updatedrequestData = [jsonData]

        if request.method == "GET":
            cityId = request.args.get("cityId","")
            city_queryset = Cities.objects(id=cityId,status__in=[0,1]).first()
            existing_record = city_queryset.to_json()
            requestData = [existing_record]
            city_queryset.update(status=2)
            flash("City deleted successfully!")
            message=city_queryset.adminId.userName+" "+city_queryset.cityName+" City deleted successfully!"
            save_admin_log_table = save_admin_logs_data(adminId,None,None,"delete_city","delete",actionDate,client_ip,browser,message,requestData,updatedrequestData)
            return redirect(url_for("regions.regions_list",redirectto="City"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        flash("Unable to delete city!!")
        return redirect(url_for("regions.regions_list",redirectto="City"))

def fetching_csv_cities_details(city_queryset):
    city_dict = {}
    try:
        if city_queryset.cityName:
            city_dict["City Name"] = city_queryset.cityName
        else:
            city_dict["City Name"] = ""

        if city_queryset.countryId.countryName:
            city_dict["State Name"] = city_queryset.stateId.stateName
        else:
            city_dict["State Name"] = ""

        if city_queryset.status == 1:
            city_dict["Status"] = "Active"
        else:
            city_dict["Status"] = "In-Active"
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return city_dict


@regions.route("/cities_csv_list",methods=["POST","GET"])
def cities_csv_list():
    if not session.get("adminId"):
        return redirect("admin_login")
    citiesList = []
    
    adminId = session.get("adminId")
    try:
        cities_queryset = Cities.objects(status__in=[0,1]).order_by("-id")
        for each_city in cities_queryset:
            city_dict = fetching_csv_cities_details(each_city)
            citiesList.append(city_dict)


        fieldnames = ['City Name', 'State Name','Status']
        temp_csv_file_name = "/media/cities_csv_files/"+str(round(time.time() * 1000))+".csv"

        if not os.path.exists(os.path.join(app.config['SITE_ROOT'], "media/cities_csv_files/")):
            os.makedirs(os.path.join(app.config['SITE_ROOT'], "media/cities_csv_files/"))

        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(citiesList)
        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='Cities list.csv',
            as_attachment=True
        )
    except Exception as e:
        app.logger.error(traceback.format_exc())
        flash("Unable to export CSV data!!")
        return redirect("regions.regions_list",redirectto="City")


############################ Block/PO ##############################

@regions.route("/add_block",methods=["POST","GET"])
def add_block():
    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()

        adminId = session.get("adminId")
        if request.method == "POST":
            name = request.form.get("name","")
            cityId = request.form.get("cityId","")
            jsonData = request.form.to_dict(flat=True)
            requestData = [jsonData]
            updatedrequestData = [jsonData]

            if name and cityId:
                try:
                    admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
                    if admin_queryset:
                        message=admin_queryset.userName+" "+name+" Block created successfully!"
                        save_admin_log_table = save_admin_logs_data(adminId,None,None,"add_block","create",actionDate,client_ip,browser,message,requestData,updatedrequestData) 

                    block_table = BlocksPos(
                        adminId=adminId,
                        name = name,
                        cityId = cityId,
                        createdOn = datetime.datetime.now(),
                        status = 1,
                        )
                    save_table = block_table.save()
                    blockId = str(save_table.id)

                    flash("Block saved successfully!")
                    return redirect(url_for("regions.regions_list",redirectto="Block"))
                except Exception as e:
                    flash("Unable to save block!!")
                    app.logger.error(traceback.format_exc())
                    return redirect(url_for("regions.regions_list",redirectto="Block"))
            else:
                flash("Required fields are missing!!")
                return redirect(url_for("regions.regions_list",redirectto="Block"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to save block!!"
        return render_template("super_admin_templates/country_master_list.html",error=error)


# Update block type status
@regions.route("/update_block_status",methods=["POST","GET"])
def update_block_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]

    blockId = request.args.get("blockId","")

    if blockId:
        try:
            block_queryset = BlocksPos.objects(id=blockId,status__nin=[2]).first()
            existing_record = block_queryset.to_json()
            requestData = [existing_record]
            if block_queryset:
                if block_queryset.status == 0:
                    block_queryset.update(status=1)
                    flash("Block activated successfully!")
                    message=block_queryset.adminId.userName+" "+block_queryset.name+" Block activated successfully!"
                elif block_queryset.status == 1:
                    block_queryset.update(status=0)
                    flash("Block deactivated successfully!")
                    message=block_queryset.adminId.userName+" "+block_queryset.name+" Block deactivated successfully!"
                save_admin_log_table = save_admin_logs_data(adminId,None,None,"update_block_status","updatestatus",actionDate,client_ip,browser,message,requestData,updatedrequestData)
                return redirect(url_for("regions.regions_list",redirectto="Block"))
            else:
                flash("Invaild id!!")
                return redirect(url_for("regions.regions_list",redirectto="Block"))
        except Exception as e:
            app.logger.error(traceback.format_exc())
            return redirect(url_for("regions.regions_list",redirectto="Block"))
    else:
        return redirect(url_for("regions.regions_list",redirectto="Block"))


# Update block
@regions.route("/update_block",methods=["POST","GET"])
def update_block():
    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:
        blockId = request.args.get("blockId","")
        if request.method == "POST":
            name = request.form.get("name","")
            cityId = request.form.get("cityId","")

            jsonData = request.form.to_dict(flat=True)

            block_queryset = BlocksPos.objects(id=blockId).first()
            existing_record = block_queryset.to_json()
            message=block_queryset.adminId.userName+" "+name+" Block updated successfully!"
            requestData=[existing_record]
            updatedrequestData=[jsonData]
            save_admin_log_table = save_admin_logs_data(adminId,None,None,"update_block","update",actionDate,client_ip,browser,message,requestData,updatedrequestData)

            if block_queryset:
                block_queryset.update(
                    name=name,
                    cityId=ObjectId(cityId)
                    )
                flash("Block updated successfully!")
                return redirect(url_for("regions.regions_list",redirectto="Block"))
            else:
                flash("Invaild id!!")
                return redirect(url_for("regions.regions_list",redirectto="Block"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to update Block!!"
        return redirect(url_for("regions.regions_list",redirectto="Block"))


# Delete block
@regions.route("/delete_block",methods=["GET"])
def delete_block():
    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()

        jsonData = request.form.to_dict(flat=True)

        existing_record = ""
        updatedrequestData = [jsonData]

        if request.method == "GET":
            blockId = request.args.get("blockId","")
            block_queryset = BlocksPos.objects(id=blockId,status__in=[0,1]).first()
            existing_record = block_queryset.to_json()
            requestData = [existing_record]
            block_queryset.update(status=2)
            flash("Block deleted successfully!")
            message=block_queryset.adminId.userName+" "+block_queryset.name+" Block deleted successfully!"
            save_admin_log_table = save_admin_logs_data(adminId,None,None,"delete_block","delete",actionDate,client_ip,browser,message,requestData,updatedrequestData)
            return redirect(url_for("regions.regions_list",redirectto="Block"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        flash("Unable to delete block!!")
        return redirect(url_for("regions.regions_list",redirectto="Block"))


def fetching_csv_blocks_details(block_queryset):
    block_dict = {}
    try:
        if block_queryset.name:
            block_dict["Block/PO Name"] = block_queryset.name
        else:
            block_dict["Block/PO Name"] = ""

        if block_queryset.cityId.cityName:
            block_dict["City Name"] = block_queryset.cityId.cityName
        else:
            block_dict["City Name"] = ""

        if block_queryset.status == 1:
            block_dict["Status"] = "Active"
        else:
            block_dict["Status"] = "In-Active"
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return block_dict


@regions.route("/blocks_csv_list",methods=["POST","GET"])
def blocks_csv_list():
    if not session.get("adminId"):
        return redirect("admin_login")
    blocksList = []
    
    adminId = session.get("adminId")
    try:
        blocks_queryset = BlocksPos.objects(status__in=[0,1]).order_by("-id")
        for each_block in blocks_queryset:
            block_dict = fetching_csv_blocks_details(each_block)
            blocksList.append(block_dict)


        fieldnames = ['Block/PO Name', 'City Name','Status']
        temp_csv_file_name = "/media/blocks_csv_files/"+str(round(time.time() * 1000))+".csv"

        if not os.path.exists(os.path.join(app.config['SITE_ROOT'], "media/blocks_csv_files/")):
            os.makedirs(os.path.join(app.config['SITE_ROOT'], "media/blocks_csv_files/"))

        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(blocksList)
        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='Blocks/PO list.csv',
            as_attachment=True
        )
    except Exception as e:
        app.logger.error(traceback.format_exc())
        flash("Unable to export CSV data!!")
        return redirect("regions.regions_list",redirectto="Block")


############################ Pincodes ##############################

@regions.route("/add_pincode",methods=["POST","GET"])
def add_pincode():
    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()
        
        if request.method == "POST":
            pincode = request.form.get("pincode")
            blockPoId = request.form.get("blockPoId","")
            latitude = request.form.get("latitude","")
            longitude = request.form.get("longitude","")

            jsonData = request.form.to_dict(flat=True)
            requestData = [jsonData]
            updatedrequestData = [jsonData]

            if pincode and blockPoId:
                try:
                    admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
                    if admin_queryset:
                        message=admin_queryset.userName+" "+pincode+" Pincode created successfully!"
                        save_admin_log_table = save_admin_logs_data(adminId,None,None,"add_pincode","create",actionDate,client_ip,browser,message,requestData,updatedrequestData)

                    pincode_table = Pincodes(
                        adminId=adminId,
                        pincode = pincode,
                        blockPoId = blockPoId,
                        latitude = latitude,
                        longitude = longitude,
                        createdOn = datetime.datetime.now(),
                        status = 1,
                        )
                    save_table = pincode_table.save()
                    pincodeId = str(save_table.id)

                    flash("Pincode saved successfully!")
                    return redirect(url_for("regions.regions_list",redirectto="Pincode"))
                except Exception as e:
                    flash("Unable to save pincode!!")
                    app.logger.error(traceback.format_exc())
                    return redirect(url_for("regions.regions_list",redirectto="Pincode"))
            else:
                flash("Required fields are missing!!")
                return redirect(url_for("regions.regions_list",redirectto="Pincode"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to save pincode!!"
        return render_template("super_admin_templates/country_master_list.html",error=error)


# Update pincode status
@regions.route("/update_pincode_status",methods=["POST","GET"])
def update_pincode_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]

    pincodeId = request.args.get("pincodeId","")

    if pincodeId:
        try:
            pincode_queryset = Pincodes.objects(id=pincodeId,status__nin=[2]).first()
            existing_record = pincode_queryset.to_json()
            requestData = [existing_record]
            if pincode_queryset:
                admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
                if pincode_queryset.status == 0:
                    pincode_queryset.update(status=1)
                    flash("Pincode activated successfully!")
                    message=admin_queryset.userName+" "+str(pincode_queryset.pincode)+" Pincode activated successfully!"
                elif pincode_queryset.status == 1:
                    pincode_queryset.update(status=0)
                    flash("Pincode deactivated successfully!")
                    message=admin_queryset.userName+" "+str(pincode_queryset.pincode)+" Pincode deactivated successfully!"
                save_admin_log_table = save_admin_logs_data(adminId,None,None,"update_pincode_status","updatestatus",actionDate,client_ip,browser,message,requestData,updatedrequestData)
                return redirect(url_for("regions.regions_list",redirectto="Pincode"))
            else:
                flash("Invaild id!!")
                return redirect(url_for("regions.regions_list",redirectto="Pincode"))
        except Exception as e:
            app.logger.error(traceback.format_exc())
            return redirect(url_for("regions.regions_list",redirectto="Pincode"))
    else:
        return redirect(url_for("regions.regions_list",redirectto="Pincode"))


# Update city
@regions.route("/update_pincode",methods=["POST","GET"])
def update_pincode():
    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:
        pincodeId = request.args.get("pincodeId","")
        if request.method == "POST":
            pincode = request.form.get("pincode","")
            latitude = request.form.get("latitude","")
            longitude = request.form.get("longitude","")
            blockPoId = request.form.get("blockPoId","")
            jsonData = request.form.to_dict(flat=True)


            pincode_queryset = Pincodes.objects(id=pincodeId).first()
            existing_record = pincode_queryset.to_json()
            message=pincode_queryset.adminId.userName+" "+pincode+" Pincode updated successfully!"
            requestData=[existing_record]
            updatedrequestData=[jsonData]
            save_admin_log_table = save_admin_logs_data(adminId,None,None,"update_pincode","update",actionDate,client_ip,browser,message,requestData,updatedrequestData) 

            if pincode_queryset:
                pincode_queryset.update(
                    pincode=pincode,
                    latitude = latitude,
                    longitude = longitude,
                    blockPoId=ObjectId(blockPoId)
                    )
                flash("Pincode updated successfully!")
                return redirect(url_for("regions.regions_list",redirectto="Pincode"))
            else:
                flash("Invaild id!!")
                return redirect(url_for("regions.regions_list",redirectto="Pincode"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to update pincode!!"
        return redirect(url_for("regions.regions_list",redirectto="Pincode"))


# Delete pincode
@regions.route("/delete_pincode",methods=["GET"])
def delete_pincode():
    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()

        jsonData = request.form.to_dict(flat=True)

        existing_record = ""
        updatedrequestData = [jsonData]

        if request.method == "GET":
            pincodeId = request.args.get("pincodeId","")
            pincode_queryset = Pincodes.objects(id=pincodeId,status__in=[0,1]).first()
            existing_record = pincode_queryset.to_json()
            requestData = [existing_record]
            pincode_queryset.update(status=2)
            flash("Pincode deleted successfully!")
            message=pincode_queryset.adminId.userName+" "+pincode_queryset.pincode+" Pincode deleted successfully!"
            save_admin_log_table = save_admin_logs_data(adminId,None,None,"delete_pincode","delete",actionDate,client_ip,browser,message,requestData,updatedrequestData) 
            return redirect(url_for("regions.regions_list",redirectto="Pincode"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        flash("Unable to delete pincode!!")
        return redirect(url_for("regions.regions_list",redirectto="Pincode"))


def fetching_csv_pincode_details(pincode_queryset):
    pincode_dict = {}
    try:
        if pincode_queryset.pincode:
            pincode_dict["Pincode"] = pincode_queryset.pincode
        else:
            pincode_dict["Pincode"] = ""

        if pincode_queryset.blockPoId.name:
            pincode_dict["Block/Po Name"] = pincode_queryset.blockPoId.name
        else:
            pincode_dict["Block/Po Name"] = ""

        if pincode_queryset.status == 1:
            pincode_dict["Status"] = "Active"
        else:
            pincode_dict["Status"] = "In-Active"
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return pincode_dict


@regions.route("/pincodes_csv_list",methods=["POST","GET"])
def pincodes_csv_list():
    if not session.get("adminId"):
        return redirect("admin_login")
    pincodesList = []
    
    adminId = session.get("adminId")
    try:
        pincodes_queryset = Pincodes.objects(status__in=[0,1]).order_by("-id")
        for each_pincode in pincodes_queryset:
            pincode_dict = fetching_csv_pincode_details(each_pincode)
            pincodesList.append(pincode_dict)


        fieldnames = ['Pincode', 'Block/Po Name','Status']
        temp_csv_file_name = "/media/pincodes_csv_files/"+str(round(time.time() * 1000))+".csv"

        if not os.path.exists(os.path.join(app.config['SITE_ROOT'], "media/pincodes_csv_files/")):
            os.makedirs(os.path.join(app.config['SITE_ROOT'], "media/pincodes_csv_files/"))

        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(pincodesList)
        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='Pincodes list.csv',
            as_attachment=True
        )
    except Exception as e:
        app.logger.error(traceback.format_exc())
        flash("Unable to export CSV data!!")
        return redirect("regions.regions_list",redirectto="Pincode")