from appservices.common.util import *
from appservices.common.form_schemas import *
# from appservices.common.payment_gateways.idfc_payment_gateways import *

circles_master = Blueprint("circles_master",__name__)



@circles_master.route("/add_circles_master",methods=["POST","GET"])
@adminid_access_token_required
@csrf_protect
def add_circles_master():
    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

        createdOn=datetime.datetime.now()
        permissionsList = check_permissions(adminId,"circlesMasterPermission")
        if "add" in permissionsList:
            if request.method == "POST":
                name = request.form.get("name","")
                circleRefId = request.form.get("circleRefId","")
                paymentGatewayId = request.form.get("paymentGatewayId","")
                

                jsonData = request.form.to_dict(flat=True)
                requestData = [jsonData]
                updatedrequestData = [jsonData]
                
                form = AddCircleMasterForm()
                if form.validate_on_submit():
                    if name and circleRefId and paymentGatewayId: 
                        print("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",name,circleRefId,paymentGatewayId)
                        try:
                            admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
                            if admin_queryset:
                                message=admin_queryset.userName+" "+name+"  Successfully created circles master"
                                
                                save_admin_log_table = save_admin_logs_data(adminId,None,None,"add_circles_master","create",createdOn,client_ip,browser,message,requestData,updatedrequestData,latitude,longitude) 
                                
                            circle_master_table = Circles(
                                adminId=adminId,
                                name = name,
                                circleRefId = circleRefId,
                                paymentGatewayId = paymentGatewayId,
                                createdOn = datetime.datetime.now(),
                                status = 1,
                                )
                            save_table = circle_master_table.save()
                            print(save_table,"+++++++++++++++++++++++++++++++++++++++++++++++++++++++++")

                            flash("master circles saved successfully!")
                            data_status['responseStatus']=1
                            return data_status
                        except Exception as e:
                            flash("Unable to save circles master details!!")
                            app.logger.error(traceback.format_exc())
                            data_status['responseStatus']=4
                            return data_status
                    else:
                        data_status['responseStatus']=2
                        data_status['result']="Required fields are missing!!"
                        return data_status


                else:
                    data_status['result']=form.errors
                    return data_status


                # if name and circleRefId and paymentGatewayId: 
                #     print("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",name,circleRefId,paymentGatewayId)
                #     try:
                #         admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
                #         if admin_queryset:
                #             message = "Successfully created circles master"
                #             save_admin_log_table = save_admin_logs_data(adminId,None,None,"add_circles_master","create",createdOn,client_ip,browser,message,requestData,updatedrequestData) 
                            
                #         circle_master_table = Circles(
                #             adminId=adminId,
                #             name = name,
                #             circleRefId = circleRefId,
                #             paymentGatewayId = paymentGatewayId,
                #             createdOn = datetime.datetime.now(),
                #             status = 1,
                #             )
                #         save_table = circle_master_table.save()
                #         print(save_table,"+++++++++++++++++++++++++++++++++++++++++++++++++++++++++")

                #         flash("master circles saved successfully!")
                #         return redirect(url_for("circles_master.get_circles_master"))
                #     except Exception as e:
                #         flash("Unable to save circles master details!!")
                #         app.logger.error(traceback.format_exc())
                #         return redirect(url_for("circles_master.get_circles_master"))
                # else:
                #     flash("Required fields are missing!!")
                #     return redirect(url_for("circles_master.get_circles_master"))
            else:
                
                return redirect(url_for("circles_master.get_circles_master"))
        else:
            flash("The staff member does not have permission to create a Circles Master.", "danger")
            data_status['responseStatus']=4
            return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to save circle master!!"
        flash("Unable to save circle master!!")
        data_status['responseStatus']=4
        return data_status
    


@circles_master.route("/get_circles_master",methods=["POST","GET"])
@adminid_access_token_required
def get_circles_master():
    if not session.get("adminId"):
        return redirect("admin_login")
    circleMasterList = []
    transactionsApiList=[]
    search_element=""
    redirectval=""
    pagination=""
    snoCount=0
    circlesMasterPage=None
    form = SearchCircleMaster(request.args)
    print("(((((((((((((((((circle master )))))))))))))))))")
    adminId = session.get("adminId")
    permissionsList = check_permissions(session.get("adminId"),"circlesMasterPermission")
    if "view" in permissionsList:
        try:
            redirectTo = request.args.get("redirectTo","")
            if redirectTo:
                redirectval = redirectTo
            else:
                redirectval = ""
            search_element = request.args.get("search_element","")
                    
            print(search_element,"________________line 109_____________________________")

            if form.validate():
                if search_element:
                    search_element = form.search_element.data
                circlesMasterPage = request.args.get(get_page_parameter("circlesMasterPage"), type=int, default=1)

                per_page = 20
                start = (circlesMasterPage - 1) * per_page

                total_count=0
                filters = Q(status__in=[0, 1])

                if search_element and search_element.strip():
                    filters &= Q(name__icontains=search_element.strip())

                total_count = Circles.objects(filters).count()

                circle_master_queryset = (
                    Circles.objects(filters)
                    .only("id","name","circleRefId","paymentGatewayId","status")
                    .order_by("-id")
                    .skip(start)
                    .limit(per_page)
                )

                snoCount = start

                circleMasterList = list(circle_master_queryset)

                transction_api_queryset=TransactionAPI.objects(transactionType="PaymentGateway",status=1).only("id","apiName").order_by("-id")
                transactionsApiList = list(transction_api_queryset)

                pagination = Pagination(circlesMasterPage=circlesMasterPage, total=total_count, per_page=per_page, page_parameter ="circlesMasterPage", alignment="right", record_name="circlesMaster")

            # circle_master_queryset = Circles.objects(status__in=[0,1])
            # if search_element:
            #     circle_master_queryset = circle_master_queryset.filter(Q(name__icontains=search_element))

            # print("circle_master_queryset",circle_master_queryset)
            # # 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 = circle_master_queryset.count()

            # start = (page - 1) * per_page

            # end = min(start + per_page, total_count)

            # total_circles = circle_master_queryset[start:end]
            
            # snoCount = start
            # for each_circle in total_circles:
            #     snoCount +=1
                
                
            #     sites_dict = {
            #     "id": str(each_circle.id),
            #     "name":each_circle.name,
            #     "circleRefId":each_circle.circleRefId,
            #     "paymentGatewayId":str(each_circle.paymentGatewayId.id),
            #     "paymentGateWayName":each_circle.paymentGatewayId.apiName,
            #     "status":each_circle.status,
            #     "createdOn":each_circle.createdOn.strftime('%Y-%m-%d %H:%M:%S'),
            #     }
                
            #     sites_dict["snoCount"]=snoCount
            #     if each_circle.status == 1:
            #         sites_dict["actionText"]="Active"
            #     else:
            #         sites_dict["actionText"]="Deactive"
            #     circleMasterList.append(sites_dict)
            # pagination = Pagination(page=page, total=total_count, per_page=per_page, alignment="right")
            # transction_api_queryset=TransactionAPI.objects(transactionType="PaymentGateway",status=1).order_by("-id")
           
            # for each_tranction_api in transction_api_queryset:
            #     trans_dict={
            #         "id":str(each_tranction_api.id),
            #         "apiName":each_tranction_api.apiName
            #     }
            #     transactionsApiList.append(trans_dict)
                

            return render_template("super_admin_templates/circles_master.html",
                pagination=pagination,
                circleMasterList=circleMasterList,
                redirectval=redirectval,
                search_element=search_element,
                snoCount = snoCount,
                form = form,
                circlesMasterPage = circlesMasterPage,
                transactionsApiList=transactionsApiList
                )
            
        except Exception as e:
            app.logger.error(traceback.format_exc())
            error = "Unable to fetch circles master details!!"
            return render_template("super_admin_templates/circles_master.html", 
                error=error,
                pagination=pagination,
                circleMasterList=circleMasterList,
                redirectval=redirectval,
                search_element=search_element,
                snoCount = snoCount,
                form = form,
                circlesMasterPage = circlesMasterPage,
                transactionsApiList=transactionsApiList
                )
    else:
        flash("The staff member does not have permission to view Circles Master.", "danger")
        return redirect(url_for("admin.dashboard"))


@circles_master.route("/circles_master_status",methods=["POST","GET"])
@adminid_access_token_required
def circles_master_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")
    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]

    circlesMasterPage = request.args.get("circlesMasterPage")
    search_element = request.args.get("search_element", "").strip()

    permissionsList = check_permissions(session.get("adminId"),"circlesMasterPermission")
    if "edit" in permissionsList:
        circle_id = request.args.get("circle_id","")
        print(circle_id,"((((((((((((((((((()))))))))))))))))))")
        circle_id = request.args.get("circle_id","")
        if circle_id:
            try:
                circle_master_queryset = Circles.objects(id=circle_id,status__nin=[2]).first()
                existing_record = circle_master_queryset.to_json()
                requestData = [existing_record]
                if circle_master_queryset:
                    if circle_master_queryset.status == 0:
                        circle_master_queryset.update(status=1)
                        flash("circles activated successfully!")
                        message=circle_master_queryset.adminId.userName+" "+circle_master_queryset.name+" circles activated successfully!"
                    elif circle_master_queryset.status == 1:
                        circle_master_queryset.update(status=0)
                        flash("circles deactivated successfully!")
                        message=circle_master_queryset.adminId.userName+" "+circle_master_queryset.name+" circles deactivated successfully!"
                    save_admin_log_table = save_admin_logs_data(adminId,None,None,"circles_master_status","updatestatus",actionDate,client_ip,browser,message,requestData,updatedrequestData,latitude,longitude)
                    return redirect(url_for("circles_master.get_circles_master",search_element=search_element,circlesMasterPage=circlesMasterPage))
                else:
                    flash("Invaild id!!")
                    return redirect(url_for("circles_master.get_circles_master",search_element=search_element,circlesMasterPage=circlesMasterPage))
            except Exception as e:
                flash("Unable to Update circles Status!!!")
                app.logger.error(traceback.format_exc())
                return redirect(url_for("circles_master.get_circles_master",search_element=search_element,circlesMasterPage=circlesMasterPage))
        else:
            flash("Required fields are missing!")
            return redirect(url_for("circles_master.get_circles_master",search_element=search_element,circlesMasterPage=circlesMasterPage))
    else:
        flash("The staff member does not have permission to update Circle Master status.", "danger")
        return redirect(url_for("circles_master.get_circles_master",search_element=search_element,circlesMasterPage=circlesMasterPage))


@circles_master.route("/delete_circles_master",methods=["GET","POST"])
@adminid_access_token_required
def delete_circles_master():
    try:
        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")
        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]

        search_element = ""
        circlesMasterPage = 1
        
        permissionsList = check_permissions(session.get("adminId"),"circlesMasterPermission")
        if "delete" in permissionsList:
            if request.method == "GET":
                circle_id = request.args.get("circle_id","")
                circlesMasterPage = request.args.get(get_page_parameter("circlesMasterPage"), type=int, default=1)
                search_element = request.args.get("search_element","")
                circle_master_queryset = Circles.objects(id=circle_id,status__in=[0,1]).first()
                existing_record = circle_master_queryset.to_json()
                requestData = [existing_record]
                updatedrequestData = [request.args.to_dict(flat=True)]
                circle_master_queryset.update(status=2)
                flash("circle  deleted successfully!")
                message=circle_master_queryset.adminId.userName+" "+circle_master_queryset.name+" circle deleted successfully!"
                save_admin_log_table = save_admin_logs_data(adminId,None,None,"delete_circles_master","delete",actionDate,client_ip,browser,message,requestData,updatedrequestData,latitude,longitude)
                return redirect(url_for("circles_master.get_circles_master",circlesMasterPage=circlesMasterPage, search_element = search_element))
        else:
            flash("The staff member does not have permission to delete Circle Master.", "danger")
            return redirect(url_for("circles_master.get_circles_master",circlesMasterPage=circlesMasterPage, search_element = search_element))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        flash("Unable to delete circles!!")
        return redirect(url_for("circles_master.get_circles_master",circlesMasterPage=circlesMasterPage, search_element = search_element))



@circles_master.route("/update_circles_master",methods=["POST","GET"])
@adminid_access_token_required
@csrf_protect
def update_circles_master():
    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()
    permissionsList = check_permissions(session.get("adminId"),"circlesMasterPermission")
    if "edit" in permissionsList:
        try:
            circle_id = request.args.get("circle_id","")
            if request.method == "POST":
                name = request.form.get("name","")
                circleRefId = request.form.get("circleRefId","")
                paymentGatewayId = request.form.get("paymentGatewayId","")
                jsonData = request.form.to_dict(flat=True)

                form = AddCircleMasterForm(request.form,current_id=circle_id)

                print("((((((((((((((((((paymentGatewayId))))))))))))))))))",paymentGatewayId)

                if form.validate_on_submit():
                    if name and circleRefId and paymentGatewayId:
                        try:
                            print("((((((((((((((((((paymentGatewayId))))))))))))))))))",paymentGatewayId)
                            circle_master_queryset = Circles.objects(id=circle_id,status__in=[0,1]).first()
                            message=circle_master_queryset.adminId.userName+" "+name+"  updated successfully!"
                            requestData=[circle_master_queryset]
                            updatedrequestData=[jsonData]
                            save_admin_log_table = save_admin_logs_data(adminId,None,None,"update_circles_master","update",actionDate,client_ip,browser,message,requestData,updatedrequestData,latitude,longitude) 

                            if circle_master_queryset:
                                print("((((((((((((((((((circle_master_queryset))))))))))))))))))",circle_master_queryset)
                                circle_master_queryset.update(
                                    name = name,
                                    circleRefId = circleRefId,
                                    paymentGatewayId = ObjectId(paymentGatewayId),
                                    )
                                
                                flash("circles Updated successfully!")
                                data_status["responseStatus"]=1
                                return data_status
                            else:
                                flash("Invaild id!!")
                                data_status["responseStatus"]=4
                                return data_status
                        except Exception as e:
                            flash("Unable to Update circles")
                            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 name and circleRefId and paymentGatewayId:
                #     print("((((((((((((((((((paymentGatewayId))))))))))))))))))",paymentGatewayId)
                #     circle_master_queryset = Circles.objects(id=circle_id,status__in=[0,1]).first()
                #     message=circle_master_queryset.adminId.userName+" "+name+"  updated successfully!"
                #     requestData=[circle_master_queryset]
                #     updatedrequestData=[jsonData]
                #     save_admin_log_table = save_admin_logs_data(adminId,None,None,"update_circles_master","update",actionDate,client_ip,browser,message,requestData,updatedrequestData) 

                #     if circle_master_queryset:
                #         print("((((((((((((((((((circle_master_queryset))))))))))))))))))",circle_master_queryset)
                #         circle_master_queryset.update(
                #             name = name,
                #             circleRefId = circleRefId,
                #             paymentGatewayId = ObjectId(paymentGatewayId),
                #             )
                        
                #         flash("circles Updated successfully!")
                #         return redirect(url_for("circles_master.get_circles_master"))
                #     else:
                #         flash("Invaild id!!")
                #         return redirect(url_for("circles_master.get_circles_master"))
                # else:
                #     flash("Required fields are missing!!")
                #     return redirect(url_for("circles_master.get_circles_master"))
            else:
                return redirect(url_for("circles_master.get_circles_master"))
        except Exception as e:
            flash("Unable to Update circles")
            app.logger.error(traceback.format_exc())
            data_status['responseStatus']=4
            return data_status
    else:
        flash("The staff member does not have permission to update Circle Master.", "danger")
        data_status['responseStatus']=4
        return data_status


