from appservices.common.util import *
from appservices.common.payment_gateways.lyra_payment_gateway import *

merchants = Blueprint("merchants",__name__)

@merchants.route("/user_signup",methods=["POST"])
def user_signup():
    data_status = {"responseStatus": 0, "result": ""}
    fullName = request.json.get("fullName","")
    phoneNumber = request.json.get("phoneNumber","")
    email = request.json.get("email","")
    address = request.json.get("address","")
    patternId = request.json.get("patternId","")
    entityTypeId = request.json.get("entityTypeId","")
    stateId = request.json.get("stateId","")
    cityId = request.json.get("cityId","")
    blockPoId = request.json.get("blockPoId","")
    pincodeId = request.json.get("pincodeId","")
    password = request.json.get("password","")
    businessName = request.json.get("businessName","")
    businessAddress = request.json.get("businessAddress","")
    categoryId = request.json.get("categoryId","")
    subCategoryId = request.json.get("subCategoryId","")

    if fullName and phoneNumber and email and password and address and entityTypeId and stateId and cityId and blockPoId and pincodeId and patternId and categoryId and subCategoryId:
        try:
            merchant_queryset = Users.objects(phoneNumber__iexact=phoneNumber).first()
            if merchant_queryset:
                data_status["result"]="This phonenumber is already in use!!"
                return data_status

            user_table = Users(
                fullName = fullName,
                phoneNumber  = phoneNumber,
                email  = email,
                password  = generate_password_hash(password), 
                address = address,
                entityTypeId = entityTypeId,
                createdOn =datetime.datetime.now(),
                stateId = stateId,
                cityId = cityId,
                blockPoId = blockPoId,
                pincodeId = pincodeId,
                patternId = patternId,
                businessName = businessName,
                businessAddress = businessAddress,
                categoryId = categoryId,
                subCategoryId = subCategoryId,
                merchantUniqueNumber = generate_next_serial_number(),
                payoutBalance = 0,
                walletBalance = 0,
                status = 0
                )
            save_table = user_table.save()
            userId = str(save_table.id)

            user_queryset = Users.objects(id=userId).first()
            userLoginDetails = {
            "id": str(user_queryset.id),
            "fullName": user_queryset.fullName,
            "phoneNumber": user_queryset.phoneNumber,
            "email": user_queryset.email,
            "address": user_queryset.address,
            "createdOn": user_queryset.createdOn,
            "status": user_queryset.status
            }
            data_status["responseStatus"] = 1
            data_status["result"] = "User signup successfully!"
            data_status["userLoginDetails"]=userLoginDetails
            return data_status
        except Exception as e:
            app.logger.error(traceback.format_exc())
            data_status["result"] = "Unable to create user signup!!"
            return data_status
    else:
        data_status["result"] = "Required fields are missing!!"
        return data_status

@merchants.route("/user_login",methods=["POST"])
def user_login():
    data_status = {"responseStatus": 0, "result": ""}
    phoneNumber = request.json.get("phoneNumber","")
    password = request.json.get("password","")
    deviceName = request.json.get("deviceName","")
    latitude = request.json.get("latitude","")
    longitude = request.json.get("longitude","")
    os = request.json.get("os","")
    ipAddress = request.json.get("ipAddress","")
    loginBrowser = request.json.get("loginBrowser","")
    userAgent = request.headers.get("User-Agent")

    loginBrowser = request.headers.get("Sec-Ch-Ua")
    if loginBrowser:
        loginBrowseData = loginBrowser.split(";")
        browser = loginBrowseData[0]
    else:
        loginBrowseData = userAgent.split(";")
        browser = loginBrowseData[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
    
    if phoneNumber and password:
        try:
            user_queryset = Users.objects(phoneNumber=phoneNumber,status__nin=[2]).first()
            if not user_queryset:
                data_status["result"]="Invalid phone number!!"
                return data_status
            if user_queryset.status == 3:
                data_status["result"]="Your account has been blocked by the admin. Please get in touch with the admin for assistance."
                return data_status
            elif user_queryset.status == 0:
                data_status["result"]="Your account is in-active please contact admin."
                return data_status
            elif user_queryset.status != 1:
                data_status["result"]="Invalid Merchant!!"
                return data_status
                
            userLogId=""
            if check_password_hash(user_queryset.password, password):
                if user_queryset.status == 1:
                    user_queryset.lastLogin = datetime.datetime.now()
                    user_queryset.save()
                    userLoginDetails={}
                    userLoginDetails = {
                    "id": str(user_queryset.id),
                    "stateId": str(user_queryset.stateId.id),
                    "entityTypeId": str(user_queryset.entityTypeId.id),
                    "fullName": user_queryset.fullName,
                    "phoneNumber": user_queryset.phoneNumber,
                    "email": user_queryset.email,
                    "address": user_queryset.address,
                    "createdOn": user_queryset.createdOn,
                    "status": user_queryset.status,
                    "lastLogin": user_queryset.lastLogin
                    }
                    if user_queryset.tPin == 0:
                        userLoginDetails["tPin"] = 0
                    else:
                        userLoginDetails["tPin"] = user_queryset.tPin

                    authenticationEnabled=user_queryset.authenticationEnabled
                    otpEnabled=0
                    userLogId=""
                    otpCode=''
                    status=1
                    if authenticationEnabled==1:
                        otpEnabled=1
                        status=0
                        userLoginDetails={}
                        otpCode=random.randint(100000,999999)
                        try:
                            smsmessage="Your Apex Pay Merchant Login OTP is "+str(otp)
                            send_sms(user_queryset.phoneNumber,smsmessage)
                        except Exception as e:
                            pass
                    try:
                        userId = str(user_queryset.id)
                        user_login_report_table = LoginReportLogs(
                            userId = userId,
                            ipAddress = client_ip,
                            loginBrowser = browser.strip('"'),
                            deviceName = deviceName,
                            phoneNumber = str(user_queryset.phoneNumber),
                            latitude = latitude,
                            longitude = longitude,
                            userAgent = userAgent,
                            os = os,
                            createdOn = datetime.datetime.now(),
                            otpCode=str(otpCode),
                            attempts=0,
                            authenticationEnabled=authenticationEnabled,
                            status = status
                            ).save()
                        userLogId=str(user_login_report_table.id)
                    except Exception as e:
                        userLogId=""
                        app.logger.error(traceback.format_exc())
                        pass
                    data_status["responseStatus"] = 1
                    data_status["otpEnabled"] = otpEnabled
                    data_status["userLogId"] = userLogId
                    data_status["result"] = "User login successfull!"
                    data_status["userLoginDetails"] = userLoginDetails
                    return data_status
                else:
                    data_status["result"] = "Please contact the admin for approval to log in!!"
                    return data_status
            else:
                data_status["result"] = "Invalid Password!!"
                return data_status
        except Exception as e:
            app.logger.error(traceback.format_exc())
            data_status["result"]="Unable to user login!!"
            return data_status
    else:
        data_status["result"] = "Required fields are missing!!"
        return data_status


@merchants.route("/get_user_by_mobile_number",methods=["POST"])
def get_user_by_mobile_number():
    data_status = {"responseStatus": 0, "result": ""}
    phoneNumber = request.json.get("phoneNumber","")
    userLogId = request.json.get("userLogId","")
    otpCode = request.json.get("otpCode","")
    if phoneNumber and otpCode and userLogId:
        try:
            user_queryset = Users.objects(phoneNumber__iexact=phoneNumber,status__nin=[2]).first()
            if not user_queryset:
                data_status["result"]="Invalid phone number!!"
                return data_status
            if user_queryset.status == 3:
                data_status["result"]="Your account has been blocked by the admin. Please get in touch with the admin for assistance."
                return data_status
            elif user_queryset.status == 0:
                data_status["result"]="Your account is in-active please contact admin."
                return data_status
            elif user_queryset.status != 1:
                data_status["result"]="Invalid phone number!!"
                return data_status
            
            if userLogId!="":
                user_login_report_querryset=LoginReportLogs.objects(id=str(userLogId),status=0,userId=str(user_queryset.id)).first()
                if user_login_report_querryset:
                    attempts=user_login_report_querryset.attempts+1
                    if user_login_report_querryset.otpCode==otpCode:
                        user_login_report_querryset.update(status=1,attempts=attempts)
                        userLoginDetails = {
                        "id": str(user_queryset.id),
                        "stateId": str(user_queryset.stateId.id),
                        "entityTypeId": str(user_queryset.entityTypeId.id),
                        "fullName": user_queryset.fullName,
                        "phoneNumber": user_queryset.phoneNumber,
                        "email": user_queryset.email,
                        "address": user_queryset.address,
                        "createdOn": user_queryset.createdOn,
                        "status": user_queryset.status,
                        "lastLogin": user_queryset.lastLogin
                        }
                        if user_queryset.tPin == 0:
                            userLoginDetails["tPin"] = 0
                        else:
                            userLoginDetails["tPin"] = user_queryset.tPin

                        data_status["responseStatus"] = 1
                        data_status["result"] = "User login successfull!"
                        data_status["userLoginDetails"] = userLoginDetails
                        return data_status
                    else:
                        user_login_report_querryset.update(attempts=attempts)
                        data_status["result"] = "Invalid Otp."
                        return data_status
                else:
                    data_status["result"] = "Invalid Otp."
                    return data_status
            else:
                data_status["result"] = "Invalid Otp."
                return data_status
        except Exception as e:
            app.logger.error(traceback.format_exc())
            data_status["result"]="Unable to user login!!"
            return data_status
    else:
        data_status["result"] = "Required fields are missing!!"
        return data_status

#OTP Generate API
@merchants.route("/resend_merchant_otp",methods=["GET","POST"])
def resend_merchant_otp():
    data_status = {"responseStatus": 0, "result": ""}
    phoneNumber = request.json.get("phoneNumber","")
    userLogId = request.json.get("userLogId","")
    if phoneNumber and userLogId:
        try:
            user_queryset = Users.objects(phoneNumber__iexact=phoneNumber,status__nin=[2]).first()
            if not user_queryset:
                data_status["result"]="Invalid phone number!!"
                return data_status
            if user_queryset.status == 3:
                data_status["result"]="Your account has been blocked by the admin. Please get in touch with the admin for assistance."
                return data_status
            elif user_queryset.status == 0:
                data_status["result"]="Your account is in-active please contact admin."
                return data_status
            elif user_queryset.status != 1:
                data_status["result"]="Invalid phone number!!"
                return data_status
            
            if userLogId!="":
                user_login_report_querryset=LoginReportLogs.objects(id=str(userLogId),userId=str(user_queryset.id)).first()
                if user_login_report_querryset:
                    phoneNumber = user_queryset.phoneNumber
                    otpCode = random.randint(100000,999999)
                    try:
                        smsmessage="Your Apex Pay Merchant Login OTP is "+str(otpCode)
                        send_sms(phoneNumber,smsmessage)
                    except Exception as e:
                        pass
                    user_login_report_querryset.update(otpCode=str(otpCode),status=0)
                    userLogId=str(user_login_report_querryset.id)
                    data_status["responseStatus"] = 1
                    data_status["userLogId"] = userLogId
                    data_status["result"] = "Otp sent Successfully."
                    return data_status
                else:
                    data_status["result"] = "Invalid Otp."
                    return data_status
            else:
                data_status["result"] = "Invalid Request."
                return data_status
        except Exception as e:
            app.logger.error(traceback.format_exc())
            data_status["result"]="Unable to user login!!"
            return data_status
    else:
        data_status["result"] = "Required fields are missing!!"
        return data_status


@merchants.route("/add_top_up_request",methods=["POST"])
def add_top_up_request():
    data_status = {"responseStatus": 0, "result": ""}
    userId = request.json.get("userId","")
    depositBankId = request.json.get("depositBankId","")
    amount = request.json.get("amount",0)
    paymentMode = request.json.get("paymentMode","")
    transaction = request.json.get("transaction","")
    paymentDate = request.json.get("paymentDate","")
    transactionSlip = request.json.get("transactionSlip","")

    if depositBankId and amount and paymentMode and userId and paymentDate and transaction:
        try:
            user_queryset = Users.objects(id=userId,status__in=[1]).first()
            if not user_queryset:
                data_status["result"]="Invalid user id!!"
                return data_status
            top_up_table = TopUpRequests(
                userId=userId,
                depositBankId = depositBankId,
                amount  = amount,
                paymentMode  = paymentMode,
                transaction  = transaction,
                paymentDate  = paymentDate,
                createdOn =datetime.datetime.now(),
                status = 1
                )
            save_table = top_up_table.save()

            if transactionSlip:
                image_name = upload_file_image(transactionSlip, "transactionSlips", str(get_epoch_milli_time()), "")
                if image_name:
                    save_table.update(transactionSlip=image_name)

            data_status["responseStatus"] = 1
            data_status["result"] = "User top up request successfully!"
            return data_status
        except Exception as e:
            app.logger.error(traceback.format_exc())
            data_status["result"] = "Unable to save user top up request!!"
            return data_status
    else:
        data_status["result"] = "Required fields are missing!!"
        return data_status


@merchants.route("/deposite_banks_list",methods=["POST"])
def deposite_banks_list():
    data_status = {"responseStatus": 0, "result": ""}
    bankType = request.json.get("bankType") #"administrator" or "parent"

    if not bankType:
        data_status["result"]="Required fields are missing!!"
        return data_status
    depositeBanksList=[]
    try:
        deposite_banks_queryset = CompanyBankAccounts.objects(companyType=bankType,status__in=[1]).order_by("-id").all()
        
        for each_bank in deposite_banks_queryset:
            depositeBankDict = {
            "id":str(each_bank.id),
            "bankName":each_bank.bankName,
            "companyType":each_bank.companyType,
            "accountName":each_bank.accountName,
            "accountNumber":each_bank.accountNumber,
            "bankCode":each_bank.bankCode
            }
            if each_bank.image:
                depositeBankDict["image"]=domain+each_bank.image
            else:
                depositeBankDict["image"]=""
            depositeBanksList.append(depositeBankDict)
        data_status["responseStatus"] = 1
        data_status["result"] = "Deposite Banks data fected successfull!"
        data_status["depositeBanksList"] = depositeBanksList
        return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"]="Unable to fetch deposite banks data!!"
        return data_status


@merchants.route("/transaction_history",methods=["POST"])
def transaction_history():
    data_status = {"responseStatus": 0, "result": ""}
    startDate = request.json.get("startDate")
    endDate = request.json.get("endDate")

    if startDate and endDate:
        
        transactionHistoryList=[]
        try:
            startDateTimeObject = datetime.datetime.strptime(startDate,"%m-%d-%Y")
            endDateTimeObject = datetime.datetime.strptime(endDate,"%m-%d-%Y")
            start_date = startDateTimeObject.replace(hour=0, minute=0, second=0, microsecond=0)
            end_date = endDateTimeObject.replace(hour=23, minute=59, second=59, microsecond=999999)

            transactions_queryset = TopUpRequests.objects(
                createdOn__gte=start_date,
                createdOn__lte=end_date,
                status__in=[1]
                ).order_by("-id").all()
            
            for each_transaction in transactions_queryset:
                transactionDict = {
                "id":str(each_transaction.id),
                "depositBankId":str(each_transaction.depositBankId.id),
                "depositBankName":each_transaction.depositBankId.bankName,
                "depositBankCode":each_transaction.depositBankId.bankCode,
                "depositBankAccountNumber":each_transaction.depositBankId.accountNumber,
                "depositBankAccountType":each_transaction.depositBankId.accountType,
                "paymentMode":each_transaction.paymentMode,
                "transaction":each_transaction.transaction,
                "paymentDate":each_transaction.paymentDate,
                "amount":each_transaction.amount
                }
                if each_transaction.transactionSlip:
                    transactionDict["transactionSlip"]=domain+each_transaction.transactionSlip
                else:
                    transactionDict["transactionSlip"]=""
                transactionHistoryList.append(transactionDict)
            data_status["responseStatus"] = 1
            data_status["result"] = "Transaction history data fetched successfull!"
            data_status["transactionHistoryList"] = transactionHistoryList
            return data_status
        except Exception as e:
            app.logger.error(traceback.format_exc())
            data_status["result"]="Unable to fetch transaction history data!!"
            return data_status
    else:
        data_status["result"]="Required fields are missing!!"
        return data_status


@merchants.route("/add_user_kyc",methods=["POST"])
def add_user_kyc():
    data_status = {"responseStatus": 0, "result": ""}
    userId = request.json.get("userId","")
    originalPanName = request.json.get("originalPanName","")
    panName = request.json.get("panName","")
    panNumber = request.json.get("panNumber","")
    panStatus = request.json.get("panStatus","")
    panDocument = request.json.get("panDocument","")
    bankId = request.json.get("bankId","")
    bankName = request.json.get("bankName","")
    originalBankName = request.json.get("originalBankName","")
    bankAccountNumber = request.json.get("bankAccountNumber","")
    bankStatus = request.json.get("bankStatus","")
    ifscCode = request.json.get("ifscCode","")
    aadharName = request.json.get("aadharName","")
    originalAadharName = request.json.get("originalAadharName","")
    aadharNumber = request.json.get("aadharNumber","")
    aadharStatus = request.json.get("aadharStatus","")
    aadharDocument = request.json.get("aadharDocument","")

    if panNumber and panStatus:
        try:
            user_queryset = Users.objects(id=userId,status__in=[1]).first()
            if not user_queryset:
                data_status["result"]="Invalid user id!!"
                return data_status
            user_kyc_table = UserKYC(
                userId=userId,
                panName = panName,
                originalPanName = originalPanName,
                panNumber  = panNumber,
                panStatus  = panStatus,
                bankName  = bankName,
                originalBankName  = originalBankName,
                bankId  = bankId,
                bankAccountNumber  = bankAccountNumber,
                bankStatus  = bankStatus,
                ifscCode  = ifscCode,
                aadharName  = aadharName,
                originalAadharName  = originalAadharName,
                aadharNumber  = aadharNumber,
                aadharStatus  = aadharStatus,
                createdOn =datetime.datetime.now(),
                status = 1
                )
            save_table = user_kyc_table.save()

            if panDocument:
                image_name = upload_file_image(panDocument, "panDocuments", str(get_epoch_milli_time()), "")
                if image_name:
                    save_table.update(panDocument=image_name)

            if aadharDocument:
                image_name = upload_file_image(aadharDocument, "aadharDocuments", str(get_epoch_milli_time()), "")
                if image_name:
                    save_table.update(aadharDocument=image_name)


            data_status["responseStatus"] = 1
            data_status["result"] = "User KYC added successfully!"
            return data_status
        except Exception as e:
            app.logger.error(traceback.format_exc())
            data_status["result"] = "Unable to save user KYC!!"
            return data_status
    else:
        data_status["result"] = "Required fields are missing!!"
        return data_status

@merchants.route("/update_user_kyc",methods=["POST"])
@user_required
def update_user_kyc():
    data_status = {"responseStatus": 0, "result": ""}
    userId = request.json.get("userId","")
    panName = request.json.get("panName","")
    originalPanName = request.json.get("originalPanName","")
    panNumber = request.json.get("panNumber","")
    panStatus = request.json.get("panStatus","")
    panDocument = request.json.get("panDocument","")
    bankId = request.json.get("bankId","")
    bankName = request.json.get("bankName","")
    originalBankName = request.json.get("originalBankName","")
    bankHolderName = request.json.get("bankHolderName","")
    bankAccountNumber = request.json.get("bankAccountNumber","")
    bankStatus = request.json.get("bankStatus","")
    ifscCode = request.json.get("ifscCode","")
    aadharName = request.json.get("aadharName","")
    originalAadharName = request.json.get("originalAadharName","")
    aadharNumber = request.json.get("aadharNumber","")
    aadharStatus = request.json.get("aadharStatus","")
    aadharDocument = request.json.get("aadharDocument","")

    if userId:
        try:
            user_queryset = Users.objects(id=userId,status=1).first()
            if not user_queryset:
                data_status["result"]="Invalid user id!!"
                return data_status

            user_kyc_queryset = UserKYC.objects(userId=userId).first()
            if not user_kyc_queryset:
                data_status["result"]="Invalid kyc id!!"
                return data_status
            if user_kyc_queryset:
                if panName:
                    user_kyc_queryset.update(panName = panName,originalPanName = originalPanName,panNumber = panNumber,panStatus = panStatus)
                if aadharName:
                    user_kyc_queryset.update(aadharName = aadharName,originalAadharName = originalAadharName,aadharNumber = aadharNumber,aadharStatus = aadharStatus)

                if bankName:
                    user_kyc_queryset.update(bankName = bankName,originalBankName = originalBankName,bankAccountNumber = bankAccountNumber,bankHolderName = bankHolderName,bankStatus = bankStatus,ifscCode  = ifscCode)

                if bankId:
                    user_kyc_queryset.update(bankId=ObjectId(bankId))

                if panDocument:
                    image_name = upload_file_image(panDocument, "panDocuments", str(get_epoch_milli_time()), "")
                    if image_name:
                        user_kyc_queryset.update(panDocument=image_name)

                if aadharDocument:
                    image_name = upload_file_image(aadharDocument, "aadharDocuments", str(get_epoch_milli_time()), "")
                    if image_name:
                        user_kyc_queryset.update(aadharDocument=image_name)

                data_status["result"] = "User KYC updated successfully!"
            else:
                user_kyc_table = UserKYC(
                    userId=userId,
                    panName = panName,
                    originalPanName = originalPanName,
                    panNumber  = panNumber,
                    panStatus  = panStatus,
                    bankName  = bankName,
                    originalBankName  = originalBankName,
                    bankId  = bankId,
                    bankAccountNumber  = bankAccountNumber,
                    bankStatus  = bankStatus,
                    ifscCode  = ifscCode,
                    aadharName  = aadharName,
                    originalAadharName  = originalAadharName,
                    aadharNumber  = aadharNumber,
                    aadharStatus  = aadharStatus,
                    createdOn =datetime.datetime.now(),
                    status = 1
                    )
                save_table = user_kyc_table.save()

                if panDocument:
                    image_name = upload_file_image(panDocument, "panDocuments", str(get_epoch_milli_time()), "")
                    if image_name:
                        save_table.update(panDocument=image_name)

                if aadharDocument:
                    image_name = upload_file_image(aadharDocument, "aadharDocuments", str(get_epoch_milli_time()), "")
                    if image_name:
                        save_table.update(aadharDocument=image_name)

                data_status["result"] = "User KYC created successfully!"

            data_status["responseStatus"] = 1
            return data_status
        except Exception as e:
            app.logger.error(traceback.format_exc())
            data_status["result"] = "Unable to update user KYC!!"
            return data_status
    else:
        data_status["result"] = "Required fields are missing!!"
        return data_status

@merchants.route("/single_view_user_kyc",methods=["POST"])
@user_required
def single_view_user_kyc():
    data_status = {"responseStatus": 0, "result": ""}
    userId = request.json.get("userId","")

    if userId:
        userKycDict={}
        try:
            user_kyc_queryset = UserKYC.objects(userId=userId).first()
            if not user_kyc_queryset:
                data_status["result"]="Invalid kyc id!!"
            userKycDict = {
            "id":str(user_kyc_queryset.id),
            "panName":user_kyc_queryset.panName,
            "originalPanName":user_kyc_queryset.originalPanName,
            "panNumber":user_kyc_queryset.panNumber,
            "panStatus":user_kyc_queryset.panStatus,
            "bankName":user_kyc_queryset.bankName,
            "originalBankName":user_kyc_queryset.originalBankName,
            "bankAccountNumber":user_kyc_queryset.bankAccountNumber,
            "bankStatus":user_kyc_queryset.bankStatus,
            "ifscCode":user_kyc_queryset.ifscCode,
            "aadharName":user_kyc_queryset.aadharName,
            "originalAadharName":user_kyc_queryset.originalAadharName,
            "aadharNumber":user_kyc_queryset.aadharNumber,
            "aadharStatus":user_kyc_queryset.aadharStatus
            }
            if user_kyc_queryset.aadharDocument:
                userKycDict["aadharDocument"]=domain+user_kyc_queryset.aadharDocument
            else:
                userKycDict["aadharDocument"]=""

            if user_kyc_queryset.panDocument:
                userKycDict["panDocument"]=domain+user_kyc_queryset.panDocument
            else:
                userKycDict["panDocument"]=""

            if user_kyc_queryset.uploadVideo:
                userKycDict["uploadVideo"]=domain+user_kyc_queryset.uploadVideo
            else:
                userKycDict["uploadVideo"]=""

            data_status["responseStatus"] = 1
            data_status["result"] = "User KYC data fetched successfull!"
            data_status["userKycDetails"] = userKycDict
            return data_status
        except Exception as e:
            app.logger.error(traceback.format_exc())
            data_status["result"]="Unable to fetch user kyc data!!"
            return data_status
    else:
        data_status["result"]="Required fields are missing!!"
        return data_status

@merchants.route("/view_all_user_kyc",methods=["POST"])
@user_required
def view_all_user_kyc():
    data_status = {"responseStatus": 0, "result": ""}
    userId = request.json.get("userId","")

    if userId:
        userKycList=[]
        try:
            user_kyc_queryset = UserKYC.objects(userId=userId,status=1).order_by("-id").all()
            
            for each_user_kyc in user_kyc_queryset:
                userKycDict = {
                "id":str(each_user_kyc.id),
                "panName":each_user_kyc.panName,
                "originalPanName":each_user_kyc.originalPanName,
                "panNumber":each_user_kyc.panNumber,
                "panStatus":each_user_kyc.panStatus,
                "bankName":each_user_kyc.bankName,
                "originalBankName":each_user_kyc.originalBankName,
                "bankAccountNumber":each_user_kyc.bankAccountNumber,
                "bankStatus":each_user_kyc.bankStatus,
                "ifscCode":each_user_kyc.ifscCode,
                "aadharName":each_user_kyc.aadharName,
                "originalAadharName":each_user_kyc.originalAadharName,
                "aadharNumber":each_user_kyc.aadharNumber,
                "aadharStatus":each_user_kyc.aadharStatus
                }
                if each_user_kyc.aadharDocument:
                    userKycDict["aadharDocument"]=domain+each_user_kyc.aadharDocument
                else:
                    userKycDict["aadharDocument"]=""

                if each_user_kyc.panDocument:
                    userKycDict["panDocument"]=domain+each_user_kyc.panDocument
                else:
                    userKycDict["panDocument"]=""

                if each_user_kyc.uploadVideo:
                    userKycDict["uploadVideo"]=domain+each_user_kyc.uploadVideo
                else:
                    userKycDict["uploadVideo"]=""

                # if each_user_kyc.bankId:
                #     userKycDict["bankId"]=str(each_user_kyc.bankId.id)
                # else:
                #     userKycDict["bankId"]=""
                userKycList.append(userKycDict)
            data_status["responseStatus"] = 1
            data_status["result"] = "User KYC data fetched successfull!"
            data_status["userKycList"] = userKycList
            return data_status
        except Exception as e:
            app.logger.error(traceback.format_exc())
            data_status["result"]="Unable to fetch user kyc data!!"
            return data_status
    else:
        data_status["result"]="Required fields are missing!!"
        return data_status

#Get User Personal Details API
@merchants.route("/get_user_personal_details",methods=["POST"])
def get_user_personal_details():
    data_status = {"responseStatus": 0, "result": ""}
    userId = request.json.get("userId","")

    if userId:
        try:
            user_queryset = Users.objects(id=userId,status__in=[0,1]).first()
            user_kyc_queryset = UserKYC.objects(userId=userId,status__in=[0,1]).first()
            if not user_queryset:
                data_status["result"]="Invalid user id!!"
                return data_status
            user_details = {
            "id":str(user_queryset.id),
            "fullName":user_queryset.fullName,
            "phoneNumber":user_queryset.phoneNumber,
            "email":user_queryset.email,
            "address":user_queryset.address,
            "pincode":user_queryset.pincodeId.pincode,
            "pincodeId":str(user_queryset.pincodeId.id),
            "stateId":str(user_queryset.stateId.id),
            "stateName":user_queryset.stateId.stateName,
            "cityId":str(user_queryset.cityId.id),
            "cityName":user_queryset.cityId.cityName,
            "blockPoId":str(user_queryset.blockPoId.id),
            "blockPoName":user_queryset.blockPoId.name,
            }
            if user_queryset.entityTypeId:
                user_details["entityTypeId"]=str(user_queryset.entityTypeId.id)
                user_details["entityType"]=user_queryset.entityTypeId.entityType
            else:
                user_details["entityTypeId"]=""
                user_details["entityType"]= ""

            if user_queryset.pincodeId:
                user_details["pincode"]=user_queryset.pincodeId.pincode
            else:
                user_details["pincode"]=""

            if user_queryset.profilePicture:
                user_details["profilePicture"]=domain+user_queryset.profilePicture
            else:
                user_details["profilePicture"]=""
            try:
                if user_kyc_queryset.panName:
                    user_details["panName"]=user_kyc_queryset.panName
                    user_details["panNumber"]=user_kyc_queryset.panNumber
                    user_details["originalPanName"]=user_kyc_queryset.originalPanName
                    user_details["panDocument"]=domain+user_kyc_queryset.panDocument
                else:
                    user_details["panName"]=""
                    user_details["panNumber"]=""
                    user_details["originalPanName"]=""
                    user_details["panDocument"]=""
            except:
                user_details["panName"]=""
                user_details["panNumber"]=""
                user_details["originalPanName"]=""
                user_details["panDocument"]=""
            try:
                if user_kyc_queryset.aadharName:
                    user_details["aadharName"]=user_kyc_queryset.aadharName
                    user_details["aadharNumber"]=user_kyc_queryset.aadharNumber
                    user_details["originalAadharName"]=user_kyc_queryset.originalAadharName
                    user_details["aadharDocument"]=domain+user_kyc_queryset.aadharDocument
                else:
                    user_details["aadharName"]=""
                    user_details["aadharNumber"]=""
                    user_details["originalAadharName"]=""
                    user_details["aadharDocument"]=""
            except:
                user_details["aadharName"]=""
                user_details["aadharNumber"]=""
                user_details["originalAadharName"]=""
                user_details["aadharDocument"]=""
            try:
                if user_kyc_queryset.bankId:
                    user_details["bankId"]=str(user_kyc_queryset.bankId.id)
                    user_details["bankName"]=user_kyc_queryset.bankId.bankName
                else:
                    user_details["bankId"]=""
                    user_details["bankName"]=""
            except:
                user_details["bankId"]=""
                user_details["bankName"]=""

            try:
                if user_kyc_queryset.panReason:
                    user_details["panReason"]=user_kyc_queryset.panReason
                    user_details["bankReason"]=user_kyc_queryset.bankReason
                    user_details["aadharReason"]=user_kyc_queryset.aadharReason
                    user_details["videoVerificationReason"]=user_kyc_queryset.videoVerificationReason
                else:
                    user_details["panReason"]=""
                    user_details["bankReason"]=""
                    user_details["aadharReason"]=""
                    user_details["videoVerificationReason"]=""
            except:
                user_details["panReason"]=""
                user_details["bankReason"]=""
                user_details["aadharReason"]=""
                user_details["videoVerificationReason"]=""

            try:
                if user_kyc_queryset:
                    user_details["panStatus"]=user_kyc_queryset.panStatus
                    user_details["bankStatus"]=user_kyc_queryset.bankStatus
                    user_details["aadharStatus"]=user_kyc_queryset.aadharStatus
                    user_details["videoVerificationStatus"]=user_kyc_queryset.videoVerificationStatus
                    user_details["agreementVerificationStatus"]=user_kyc_queryset.agreementVerificationStatus
                else:
                    user_details["panStatus"]="Pending"
                    user_details["bankStatus"]="Pending"
                    user_details["aadharStatus"]="Pending"
                    user_details["videoVerificationStatus"]="Pending"
                    user_details["agreementVerificationStatus"]="Pending"
            except Exception as e:
                user_details["panStatus"]="Pending"
                user_details["bankStatus"]="Pending"
                user_details["aadharStatus"]="Pending"
                user_details["videoVerificationStatus"]="Pending"
                user_details["agreementVerificationStatus"]="Pending"
            try:
                kycStatus = [user_kyc_queryset.panStatus,user_kyc_queryset.bankStatus,user_kyc_queryset.aadharStatus,user_kyc_queryset.videoVerificationStatus,user_kyc_queryset.agreementVerificationStatus]
                print(kycStatus,"KYC STATUSSSSSSS")
                user_details["kycStatus"] = all(status == "Approved" for status in kycStatus)
            except Exception as e:
                user_details["kycStatus"] = False

            try:
                if user_kyc_queryset:
                    user_details["originalBankName"]=user_kyc_queryset.originalBankName
                    user_details["bankAccountNumber"]=user_kyc_queryset.bankAccountNumber
                    user_details["ifscCode"]=user_kyc_queryset.ifscCode
                else:
                    user_details["originalBankName"]=""
                    user_details["bankAccountNumber"]=""
                    user_details["ifscCode"]=""
            except Exception as e:
                user_details["originalBankName"]=""
                user_details["bankAccountNumber"]=""
                user_details["ifscCode"]=""


            try:
                if user_kyc_queryset.uploadVideo:
                    user_details["uploadVideo"]=domain+user_kyc_queryset.uploadVideo
                else:
                    user_details["uploadVideo"]=""
            except:
                user_details["uploadVideo"]=""

            if user_queryset.signatureImage:
                user_details["signatureImage"]=domain+user_queryset.signatureImage
                user_details["agreementDocument"]=domain+user_queryset.agreementDocument
            else:
                user_details["signatureImage"]=""
                user_details["agreementDocument"]=""

            # try:
            #     if user_kyc_queryset.panStatus == "Approved" and user_kyc_queryset.bankStatus == "Approved" and user_kyc_queryset.aadharStatus == "Approved" and user_kyc_queryset.videoVerificationStatus == "Approved":
            #         user_details["kycStatus"] = True
            #     else:
            #         user_details["kycStatus"] = False
            # except Exception as e:
            #     user_details["kycStatus"] = False

            # if user_queryset.userPermissionId:
            #     user_details["userPermissionId"] = str(user_queryset.userPermissionId.id)
            #     userPermissionsDetails = {}
            #     user_permissions_queryset = UserPermissions.objects(id=str(user_queryset.userPermissionId.id)).first()
            #     userPermissionsDetails = {
            #     "userPermissionId":str(user_permissions_queryset.id),
            #     "permissionName":user_permissions_queryset.permissionName,
            #     "groupingPermissionsList":user_permissions_queryset.groupingPermissionsList,
            #     "categoryPermissionsList":user_permissions_queryset.categoryPermissionsList,
            #     "servicePermissionsList":user_permissions_queryset.servicePermissionsList,
            #     "operatorPermissionsList":user_permissions_queryset.operatorPermissionsList,
            #     "otherPermissionsList":user_permissions_queryset.otherPermissionsList
            #     }
            #     user_details["userPermissionsDetails"]=userPermissionsDetails
            # else:
            #     user_details["userPermissionId"] = ""
                # user_details["userPermissionsDetails"] = {}

            data_status["responseStatus"] = 1
            data_status["userPersonalDetails"] = user_details
            data_status["result"] = "User personal details fetched successfully!"
            return data_status
        except Exception as e:
            app.logger.error(traceback.format_exc())
            data_status["result"]="Unable to fetch user personal details data!!"
            return data_status
    else:
        data_status["result"]="Required fields are missing!!"
        return data_status

# Get User Business Details API
@merchants.route("/get_user_business_details",methods=["POST"])
def get_user_business_details():
    data_status = {"responseStatus": 0, "result": ""}
    userId = request.json.get("userId","")

    if userId:
        try:
            user_queryset = Users.objects(id=userId,status__in=[1]).first()
            if not user_queryset:
                data_status["result"]="Invalid user id!!"
                return data_status
            user_data = {
            "id":str(user_queryset.id)
            }
            if user_queryset.businessName:
                user_data["businessName"]=user_queryset.businessName
            else:
                user_data["businessName"]=""

            if user_queryset.businessAddress:
                user_data["businessAddress"]=user_queryset.businessAddress
            else:
                user_data["businessAddress"]=""

            data_status["responseStatus"] = 1
            data_status["userBusinessDetailsList"] = user_data
            data_status["result"] = "User business details fetched successfully!"
            return data_status
        except Exception as e:
            app.logger.error(traceback.format_exc())
            data_status["result"]="Unable to fetch user business details data!!"
            return data_status
    else:
        data_status["result"]="Required fields are missing!!"
        return data_status

# Get User KYC Details API
@merchants.route("/get_user_kyc_details",methods=["POST"])
def get_user_kyc_details():
    data_status = {"responseStatus": 0, "result": ""}
    userId = request.json.get("userId","")
    # userId = request.form.get("userId","")
    print(userId)
    print("((((((((((userId))))))))))")

    if userId:
        try:
            user_kyc_queryset = UserKYC.objects(userId=userId,status__in=[1]).first()
            if not user_kyc_queryset:
                data_status["result"]="Invalid user id!!"
                return data_status
            userKycDict = {
            "id":str(user_kyc_queryset.id),
            "panName":user_kyc_queryset.panName,
            "panNumber":user_kyc_queryset.panNumber,
            "panStatus":user_kyc_queryset.panStatus,
            "bankName":user_kyc_queryset.bankName,
            "bankAccountNumber":user_kyc_queryset.bankAccountNumber,
            "bankStatus":user_kyc_queryset.bankStatus,
            "ifscCode":user_kyc_queryset.ifscCode,
            "aadharName":user_kyc_queryset.aadharName,
            "aadharNumber":user_kyc_queryset.aadharNumber,
            "aadharStatus":user_kyc_queryset.aadharStatus,
            "aadharName":user_kyc_queryset.aadharName
            }
            if user_kyc_queryset.aadharDocument:
                userKycDict["aadharDocument"]=domain+user_kyc_queryset.aadharDocument
            else:
                userKycDict["aadharDocument"]=""

            if user_kyc_queryset.panDocument:
                userKycDict["panDocument"]=domain+user_kyc_queryset.panDocument
            else:
                userKycDict["panDocument"]=""

            if user_kyc_queryset.uploadVideo:
                userKycDict["uploadVideo"]=domain+user_kyc_queryset.uploadVideo
            else:
                userKycDict["uploadVideo"]=""
            try:

                if user_kyc_queryset.bankId:
                    userKycDict["bankId"]=str(user_kyc_queryset.bankId.id)
                else:
                    userKycDict["bankId"]=""
            except:
                userKycDict["bankId"]=""

            try:
                if user_kyc_queryset.panReason:
                    userKycDict["panReason"]=user_kyc_queryset.panReason
                    userKycDict["bankReason"]=user_kyc_queryset.bankReason
                    userKycDict["aadharReason"]=user_kyc_queryset.aadharReason
                    userKycDict["videoVerificationReason"]=user_kyc_queryset.videoVerificationReason
                else:
                    userKycDict["panReason"]=""
                    userKycDict["bankReason"]=""
                    userKycDict["aadharReason"]=""
                    userKycDict["videoVerificationReason"]=""
            except:
                userKycDict["panReason"]=""
                userKycDict["bankReason"]=""
                userKycDict["aadharReason"]=""
                userKycDict["videoVerificationReason"]=""
                
            data_status["responseStatus"] = 1
            data_status["result"] = "User KYC data fetched successfully!"
            data_status["userKycData"] = userKycDict
            return data_status
        except Exception as e:
            app.logger.error(traceback.format_exc())
            data_status["result"]="Unable to fetch user kyc data!!"
            return data_status
    else:
        data_status["result"]="Required fields are missing!!"
        return data_status

# Get user verification video API
@merchants.route("/get_user_verification_video",methods=["POST"])
def get_user_verification_video():
    data_status = {"responseStatus": 0, "result": ""}
    userId = request.json.get("userId","")

    if userId:
        try:
            user_kyc_queryset = UserKYC.objects(userId=userId).first()
            if not user_kyc_queryset:
                data_status["result"]="Invalid user id!!"
                return data_status
            user_data_dict = {
            "id":str(user_kyc_queryset.id),
            "merchantName":user_kyc_queryset.userId.fullName
            }
            if user_kyc_queryset.uploadVideo:
                user_data_dict["uploadVideo"]=domain+user_kyc_queryset.uploadVideo
            else:
                user_data_dict["uploadVideo"]=""

            data_status["responseStatus"] = 1
            data_status["result"] = "User verification video fetched successfully!"
            data_status["userVideoData"] = user_data_dict
            return data_status
        except Exception as e:
            app.logger.error(traceback.format_exc())
            data_status["result"]="Unable to fetch user video!!"
            return data_status
    else:
        data_status["result"]="Required fields are missing!!"
        return data_status

#Change User Password API
@merchants.route("/change_user_password",methods=["POST"])
def change_user_password():
    data_status = {"responseStatus": 0, "result": ""}
    userId = request.json.get("userId","")
    oldPassword = request.json.get("oldPassword","")
    newPassword = request.json.get("newPassword","")
    confirmPassword = request.json.get("confirmPassword","")

    if userId and oldPassword and newPassword and confirmPassword:
        if newPassword != confirmPassword:
            data_status["result"]="New password and confirm password should be the same!!"
            return data_status
        try:
            user_queryset = Users.objects(id=userId,status__in=[1]).first()
            if user_queryset:
                if check_password_hash(user_queryset.password, oldPassword):
                    user_queryset.update(password=generate_password_hash(newPassword))
                    # user_queryset.password = generate_password_hash(newPassword)
                    # user_queryset.save()
                    data_status["responseStatus"] = 1
                    data_status["result"] = "Password changed successfully!"
                    return data_status
                else:
                    data_status["result"]="Old password is incorrect!!"
                    return data_status
        except Exception as e:
            app.logger.error(traceback.format_exc())
            data_status["result"]="Unable to change password!!"
            return data_status
    else:
        data_status["result"]="Required fields are missing!!"
        return data_status


# Change User Tpin API
@merchants.route("/change_user_tpin",methods=["POST"])
def change_user_tpin():
    data_status = {"responseStatus": 0, "result": ""}
    userId = request.json.get("userId","")
    oldTpin = request.json.get("oldTpin","")
    newTpin = request.json.get("newTpin","")
    confirmTpin = request.json.get("confirmTpin","")
    print()

    if userId and oldTpin and newTpin and confirmTpin:
        if newTpin != confirmTpin:
            data_status["result"]="New Tpin and confirm Tpin should be the same!!"
            return data_status
        try:
            user_queryset = Users.objects(id=userId,status__in=[1]).first()
            if user_queryset:
                if user_queryset.tPin == oldTpin:
                    user_queryset.update(tPin=newTpin)
                    data_status["responseStatus"] = 1
                    data_status["result"] = "Tpin changed successfully!"
                    return data_status
                else:
                    data_status["result"]="Old Tpin is incorrect!!"
                    return data_status
        except Exception as e:
            app.logger.error(traceback.format_exc())
            data_status["result"]="Unable to change Tpin!!"
            return data_status
    else:
        data_status["result"]="Required fields are missing!!"
        return data_status

# #Forgot Tpin API
# @merchants.route("/forgot_tpin",methods=["POST"])
# def forgot_tpin():
#     data_status = {"responseStatus": 0, "result": ""}
#     userId = request.json.get("userId")
#     newTpin = request.json.get("newTpin")
#     confirmTpin = request.json.get("confirmTpin")
#     if userId and newTpin and confirmTpin:
#         try:
#             user_queryset = Users.objects(id=userId,status__in=[1]).first()
#             if user_queryset:
#                 user_queryset.update(tpin=newTpin)
#                 data_status["responseStatus"] = 1
#                 data_status["result"] = "Tpin changed successfully!"
#                 return data_status
#         except Exception as e:
#             app.logger.error(traceback.format_exc())
#             data_status["result"]="Unable to change Tpin!!"
#             data_status["tPin"]=tpin
#             return data_status
#     else:
#         data_status["result"]="Required fields are missing!!"
#         return data_status

#Forgot Tpin API
@merchants.route("/set_up_tpin",methods=["POST"])
def set_up_tpin():
    data_status = {"responseStatus": 0, "result": ""}
    userId = request.json.get("userId")
    tPin = request.json.get("tPin")
    if userId and tPin:
        try:
            user_queryset = Users.objects(id=userId,status__in=[1]).first()
            if user_queryset:
                user_queryset.update(tPin=tPin)
                data_status["responseStatus"] = 1
                data_status["result"] = "Tpin set up successfully"
                return data_status
        except Exception as e:
            app.logger.error(traceback.format_exc())
            data_status["result"]="Unable to set up Tpin!!"
            # data_status["tPin"]=tpin
            return data_status
    else:
        data_status["result"]="Required fields are missing!!"
        return data_status

#OTP Generate API
@merchants.route("/generate_otp",methods=["GET","POST"])
def generate_otp():
    data_status = {"responseStatus": 0, "result": ""}
    userId = request.json.get("userId")
    try:
        otp = random.randint(100000,999999)
        if userId:
            user_queryset = Users.objects(id=userId,status__in=[1]).first()
            if user_queryset:
                phoneNumber = user_queryset.phoneNumber
                try:
                    smsmessage="Your Apex Pay OTP is "+str(otp)
                    send_sms(phoneNumber,smsmessage)
                except Exception as e:
                    pass
        data_status["responseStatus"] = 1
        data_status["result"]="Otp generated successfully"
        data_status["otp"]=otp
        return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"]="Unable to generate OTP."
        return data_status

#Email Verification API
@merchants.route("/verify_email",methods=["GET","POST"])
def verify_email():
    data_status = {"responseStatus": 0, "result": ""}
    email = request.json.get("email")
    if email:
        try:
            user_queryset = Users.objects(email__iexact=email,status__in=[1]).first()
            if user_queryset:
                data_status["result"] = "Email already exists"
                return data_status
            else:
                otp = random.randint(100000,999999)

                user_details = {}
                user_details = {
                "email":email,
                "otp":otp,
                }
                msg=Message("Email Verification",sender=sender_email,recipients=[email])
                msg.html=render_template("frontend/email_otp.html",userInfo=user_details)
                mail.send(msg)

                data_status["responseStatus"] = 1
                data_status["result"]="Otp sent successfully"
                data_status["otp"]=otp
                return data_status
        except Exception as e:
            app.logger.error(traceback.format_exc())
            data_status["result"]="Unable to send OTP."
            return data_status
    else:
        data_status["result"]="Required field is missing!!"
        return data_status

#Forgot password API
@merchants.route("/forgot_password_otp",methods=["POST"])
def forgot_password_otp():
    data_status = {"responseStatus": 0, "result": ""}
    phoneNumber = request.json.get("phoneNumber")

    if phoneNumber:
        try:
            #Tesing sms credentials
            # account_sid = "ACec0fb091975d4bcde0c90789168a63e3"
            # auth_token  = "7ce816d89db04966aff9e39234e49a46"

            #Production sms credentials
            # account_sid = "ACbac3e0aa6c2462c3f741e8dde70cc122"
            # auth_token  = "351a93e37c6d4d8b8b2f10529f212c65"

            user_queryset = Users.objects(phoneNumber__iexact=phoneNumber,status__in=[1]).first()
            if user_queryset:
                otp = random.randint(100000,999999)
                try:
                    smsmessage="Your Apex Pay Merchant Forgot Password Verification Code is "+str(otp)
                    send_sms(phoneNumber,smsmessage)
                except Exception as e:
                    pass
                data_status["responseStatus"] = 1
                data_status["otp"] = otp
                data_status["result"] = "Otp sent successfully!"
                return data_status
            else:
                data_status["result"]="Invalid mobile number!!"
                return data_status

        except Exception as e:
            app.logger.error(traceback.format_exc())
            data_status["result"]="Unable to send otp!!"
            return data_status
    else:
        data_status["result"]="Required field is missing!!"
        return data_status

#Update forgot password API
@merchants.route("/update_forgot_password",methods=["POST"])
def update_forgot_password():
    data_status = {"responseStatus": 0, "result": ""}
    phoneNumber = request.json.get("phoneNumber")
    password = request.json.get("password")

    if phoneNumber:
        try:
            user_queryset = Users.objects(phoneNumber__iexact=phoneNumber,status__in=[1]).first()
            if user_queryset:
                user_queryset.update(password = generate_password_hash(password),)

                data_status["responseStatus"] = 1
                data_status["result"] = "Your password updated successfully!"
                return data_status
            else:
                data_status["result"]="Invalid mobile number!!"
                return data_status

        except Exception as e:
            app.logger.error(traceback.format_exc())
            data_status["result"]="Unable to change password!"
            return data_status
    else:
        data_status["result"]="Required field is missing!!"
        return data_status

#Verification mobile number API
@merchants.route("/verify_mobile_number",methods=["GET","POST"])
def verify_mobile_number():
    data_status = {"responseStatus": 0, "result": ""}
    phoneNumber = request.json.get("phoneNumber")
    if phoneNumber:
        try:
            user_queryset = Users.objects(phoneNumber__iexact=phoneNumber,status__in=[1]).first()
            if user_queryset:
                data_status["result"] = "Phone number already in use!"
                return data_status
            else:
                otp = random.randint(100000,999999)
                try:
                    smsmessage="Your Apex Pay Merchant Mobile Number Verification Code is "+str(otp)
                    send_sms(phoneNumber,smsmessage)
                except Exception as e:
                    pass
                data_status["responseStatus"] = 1
                data_status["otp"] = otp
                data_status["result"]="Otp sent successfully"
                return data_status
        except Exception as e:
            app.logger.error(traceback.format_exc())
            data_status["result"]="Unable to send OTP."
            return data_status
    else:
        data_status["result"]="Required field is missing!!"
        return data_status

#Login Report Details API
@merchants.route("/get_login_reports",methods=["POST"])
@user_required
def get_login_reports():
    data_status = {"responseStatus": 0, "result": ""}
    userId = request.json.get("userId")
    startDate = request.json.get("startDate","")
    endDate = request.json.get("endDate","")
    LoginReportsList = []
    try:
        login_reports_queryset = LoginReportLogs.objects(userId=userId,status__in=[1]).order_by('-id').limit(4)
        if startDate and endDate:
            start_date = startDate + " 00:00:00"
            end_date = endDate + " 23:59:59"
            startDate = datetime.datetime.strptime(start_date, "%d-%m-%Y %H:%M:%S")
            endDate = datetime.datetime.strptime(end_date, "%d-%m-%Y %H:%M:%S")

            login_reports_queryset = login_reports_queryset.filter(createdOn__gte=startDate,createdOn__lte=endDate)
        for each_login_report in login_reports_queryset:
            # ist_time=each_login_report.createdOn.replace(tzinfo=pytz.utc).astimezone(ist_timezone)
            login_dict = {
            "id":str(each_login_report.id),
            "userId":str(each_login_report.userId.id),
            "userName":each_login_report.userId.fullName,
            "userAgent":each_login_report.userAgent,
            "deviceName":each_login_report.deviceName,
            "latitude":each_login_report.latitude,
            "longitude":each_login_report.longitude,
            "status":each_login_report.status,
            "os":each_login_report.os,
            "ipAddress":each_login_report.ipAddress,
            "loginBrowser":each_login_report.loginBrowser,
            "createdOn":each_login_report.createdOn.astimezone(ist_timezone).strftime("%d-%m-%Y %I:%M %p")
            }
            LoginReportsList.append(login_dict)

        data_status["responseStatus"] = 1
        data_status["result"] = "Login reports fetched successfully"
        data_status["LoginReportsList"] = LoginReportsList
        return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"] = "Unable to fetch details"
        return data_status


################### Add Money Wallet API's ##############

#Get Payment GateWay's API
@merchants.route("/get_payment_gateways",methods=["POST"])
def get_payment_gateways():
    data_status = {"responseStatus": 0, "result": ""}
    userId = request.json.get("userId")
    paymentGatewaysList = []

    try:
        payment_gateways_queyset = SourceOfFunds.objects(status__in=[1]).order_by('-id').all()
        for each_paymeny_gateway in payment_gateways_queyset:
            paymeny_gateway_dict = {
            "id":str(each_paymeny_gateway.id),
            "paymentGateway":each_paymeny_gateway.sourceName
            }
            paymentGatewaysList.append(paymeny_gateway_dict)
        data_status["result"] = "Data fetched successfully"
        data_status["responseStatus"] = 1
        data_status["paymentGatewaysList"] = paymentGatewaysList
        return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"] = "unable to fetch data"
        return data_status


#Get Settlement Type's API
@merchants.route("/get_settlement_types",methods=["POST"])
def get_settlement_types():
    data_status = {"responseStatus": 0, "result": ""}
    userId = request.json.get("userId")
    settlementPaysList = []

    try:
        settlement_types_queyset = Settlement.objects(status__in=[1]).order_by('-id').all()
        for each_settlement_type in settlement_types_queyset:
            settlement_type_dict = {
            "id":str(each_settlement_type.id),
            "settlementPay":each_settlement_type.settlementType
            }
            settlementPaysList.append(settlement_type_dict)
        data_status["result"] = "Data fetched successfully"
        data_status["responseStatus"] = 1
        data_status["settlementPaysList"] = settlementPaysList
        return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"] = "unable to fetch data"
        return data_status

#Add Wallet Money API 
@merchants.route("/add_money_to_wallet",methods=["POST"])
def add_money_to_wallet():
    data_status = {"responseStatus": 0, "result": ""}
    userId = request.json.get("userId")
    amount = request.json.get("amount",0.00)
    paymentGatewayId = request.json.get("paymentGatewayId","")
    paymentType = request.json.get("paymentType","")
    creditType = request.json.get("creditType","")
    transactionId = request.json.get("transactionId","")
    settlementPayId = request.json.get("settlementPayId","")
    isConfirm = request.json.get("isConfirm",False)
    paymentAuthentication = request.json.get("paymentAuthentication",False)
    transactionData = request.json.get("transactionData")
    orderId = request.json.get("orderId","")
    status = request.json.get("status")

    if amount and paymentGatewayId and settlementPayId:
        try:
            user_queryset = Users.objects(id=userId,status__in=[1]).first()
            if not user_queryset:
                data_status["result"] = "Invalid user Id"
                return data_status
            if status == 1:   
                actuallBalance = user_queryset.walletBalance
                updateAmount = float(actuallBalance)+amount
                user_queryset.update(walletBalance = updateAmount)

                transactionData = [transactionData]
                wallet_transaction_table = WalletTransactions(
                    userId = userId,
                    amount = amount,
                    paymentGatewayId = paymentGatewayId,
                    paymentType = paymentType,
                    creditType = creditType,
                    transactionId = transactionId,
                    settlementPayId = settlementPayId,
                    isConfirm = isConfirm,
                    transactionData = transactionData,
                    paymentAuthentication = paymentAuthentication,
                    orderId = orderId,
                    walletLog="Wallet Balance is added with the amount of " + str(int(amount)) + ".",
                    userType="user",
                    createdBy = None,
                    createdOn = datetime.datetime.now(),
                    status = status
                    ).save()
                walletTransactionId = str(wallet_transaction_table.id)
            elif status == 0:
                transactionData = [transactionData]
                wallet_transaction_table = WalletTransactions(
                    userId = userId,
                    amount = amount,
                    paymentGatewayId = paymentGatewayId,
                    paymentType = paymentType,
                    creditType = creditType,
                    transactionId = transactionId,
                    settlementPayId = settlementPayId,
                    isConfirm = isConfirm,
                    transactionData = transactionData,
                    paymentAuthentication = paymentAuthentication,
                    orderId = orderId,
                    walletLog="Unable to add money.Transaction Failed!!",
                    userType="user",
                    createdBy = None,
                    createdOn = datetime.datetime.now(),
                    status = status
                    ).save()
                walletTransactionId = str(wallet_transaction_table.id)

            data_status["responseStatus"] = 1
            data_status["walletTransactionId"] = walletTransactionId
            data_status["result"] = "Money added to the wallet successfully"
            return data_status
        except Exception as e:
            app.logger.error(traceback.format_exc())
            data_status["result"] = "Unable to add money to the wallet"
            return data_status
    else:
        data_status["result"] = "Required fields are missing."
        return data_status


def fetching_wallet_transaction_reports(each_wallet_trasaction):
    wallet_transaction_dict = {}
    try:
        transaction_queryset = Transactions.objects(transactionId=each_wallet_trasaction.transactionId).first()
        wallet_transaction_dict = {
        "id":str(each_wallet_trasaction.id),
        "amount":each_wallet_trasaction.amount,
        # "paymentGatewayId":str(each_wallet_trasaction.paymentGatewayId.id),
        # "paymentGateway":each_wallet_trasaction.paymentGatewayId.sourceName,
        # "settlementPayId":str(each_wallet_trasaction.settlementPayId.id),
        # "settlementPay":each_wallet_trasaction.settlementPayId.settlementType,
        "paymentType":each_wallet_trasaction.paymentType,
        "creditType":each_wallet_trasaction.creditType,
        "transactionId":each_wallet_trasaction.transactionId,
        # "isConfirm":each_wallet_trasaction.isConfirm,
        # "transactionData":each_wallet_trasaction.transactionData,
        # "createdOn":each_wallet_trasaction.createdOn,
        #"serviceName":transaction_queryset.serviceName,
        "status":each_wallet_trasaction.status,
        }
        if transaction_queryset:
            wallet_transaction_dict.update({"serviceName":transaction_queryset.serviceName}),
        else:
            wallet_transaction_dict.update({"serviceName":each_wallet_trasaction.paymentType}),

        if each_wallet_trasaction.createdOn:
            ist_time=each_wallet_trasaction.createdOn.replace(tzinfo=pytz.utc).astimezone(ist_timezone)
            wallet_transaction_dict["createdOn"] = ist_time.strftime("%m-%d-%Y %I:%M %p")
        # if each_wallet_trasaction.paymentGatewayId:
        #     wallet_transaction_dict["paymentGatewayId"] = str(each_wallet_trasaction.paymentGatewayId.id)
        #     wallet_transaction_dict["paymentGateway"] = each_wallet_trasaction.paymentGatewayId.sourceName
        # else:
        #     wallet_transaction_dict["paymentGatewayId"] = ""
        #     wallet_transaction_dict["paymentGateway"] = ""

        # if each_wallet_trasaction.settlementPayId:
        #     wallet_transaction_dict["settlementPayId"] = str(each_wallet_trasaction.settlementPayId.id)
        #     wallet_transaction_dict["settlementPayId"] = each_wallet_trasaction.settlementPayId.settlementType
        # else:
        #     wallet_transaction_dict["settlementPayId"] = ""
        #     wallet_transaction_dict["settlementPay"] = ""

    except Exception as e:
        app.logger.error(traceback.format_exc())
    return wallet_transaction_dict

#Add Wallet Money API 
@merchants.route("/get_wallet_transactions",methods=["POST"])
def get_wallet_transactions():
    data_status = {"responseStatus": 0, "result": ""}
    userId = request.json.get("userId")
    startDate = request.json.get("startDate","")
    endDate = request.json.get("endDate","")
    walletTransactionsList = []

    if userId:
        if startDate and endDate:
            startDate = startDate + " 00:00:00"
            endDate = endDate + " 23:59:59"
            start_date = datetime.datetime.strptime(startDate, "%m-%d-%Y %H:%M:%S")
            end_date = datetime.datetime.strptime(endDate, "%m-%d-%Y %H:%M:%S")
            wallet_transactions_queryset = WalletTransactions.objects(
                userId=userId,
                createdOn__gte=start_date,
                createdOn__lte=end_date,
                ).order_by("-id").all()
        else:
            wallet_transactions_queryset = WalletTransactions.objects(
                userId=userId,
                ).order_by("-id").all()
        try:
            for each_wallet_trasaction in wallet_transactions_queryset:
                wallet_transaction_data = fetching_wallet_transaction_reports(each_wallet_trasaction)
                walletTransactionsList.append(wallet_transaction_data)
            data_status["responseStatus"] = 1
            data_status["result"] = "Wallet reports fetched successfully"
            data_status["walletTransactionsList"] = walletTransactionsList
            return data_status
        except Exception as e:
            app.logger.error(traceback.format_exc())
            data_status["result"] = "Unable to fethc wallets data"
            return data_status
    else:
        data_status["result"] = "Required fields are missing"
        return data_status

#Add Wallet Money API 
@merchants.route("/get_wallet_single_transaction",methods=["POST"])
def get_wallet_single_transaction():
    data_status = {"responseStatus": 0, "result": ""}
    walletTransactionId = request.json.get("walletTransactionId")
    wallet_transaction_dict = {}
    if walletTransactionId:
        each_wallet_trasaction = WalletTransactions.objects(
                id=walletTransactionId,
                ).order_by("-id").first()
        try:
            wallet_transaction_dict = {
                "id":str(each_wallet_trasaction.id),
                "amount":each_wallet_trasaction.amount,
                "paymentType":each_wallet_trasaction.paymentType,
                "creditType":each_wallet_trasaction.creditType,
                "transactionId":each_wallet_trasaction.transactionId,
                }

            data_status["responseStatus"] = 1
            data_status["result"] = "Wallet reports fetched successfully"
            data_status["walletTransactionData"] = wallet_transaction_dict
            return data_status
        except Exception as e:
            app.logger.error(traceback.format_exc())
            data_status["result"] = "Unable to fethc wallets data"
            return data_status
    else:
        data_status["result"] = "Required fields are missing"
        return data_status



########### Transactions API's ##########

@merchants.route("/add_transaction",methods=["POST"])
def add_transaction():
    data_status = {"responseStatus": 0, "result": ""}
    userId = request.json.get("userId","")
    categoryId = request.json.get("categoryId",None)
    serviceId = request.json.get("serviceId",None)
    operatorId = request.json.get("operatorId",None)
    transactionAPIId = request.json.get("transactionAPIId",None)
    paymentType = request.json.get("paymentType","")
    transactionId = request.json.get("transactionId","")
    transactionData = request.json.get("transactionData")
    mobileNumber = request.json.get("mobileNumber","")
    categoryName = request.json.get("categoryName","")
    serviceName = request.json.get("serviceName","")
    operatorName = request.json.get("operatorName","")
    amount = request.json.get("amount")
    operatorReference = request.json.get("operatorReference","")
    paymentGatewayId = request.json.get("paymentGatewayId",None)
    status = request.json.get("status")

    transactionData = [transactionData]
    if categoryName and serviceName and operatorName and transactionId and mobileNumber and amount:
        try:
            user_queryset = Users.objects(id=userId,status__in=[1]).first()
            if not user_queryset:
                data_status["result"] = "Invalid user Id"
                return data_status
            commissionCharges = {}
            chargeAmount = 0.0
            if user_queryset.commissionId:
                commissionId = str(user_queryset.commissionId.id)
                commissions_queryset = Commissions.objects(id=commissionId,status=1).order_by("-id").first()
                for each_record in commissions_queryset.commissionList:
                    if each_record.get("operatorId") == operatorId and each_record.get("transactionAPIId") == transactionAPIId:
                        commissionDict = {
                        # "operatorId": each_record.get("operatorId"),
                        # "transactionAPIId": each_record.get("transactionAPIId"),
                        "chargeType": each_record.get("chargeType"),
                        "chargeValue": each_record.get("chargeValue"),
                        "commissionType": each_record.get("commissionType"),
                        "commissionValue": each_record.get("commissionValue")
                        }

                        if commissionDict.get("chargeType") == "Percentage":
                            chargeAmount = (float(amount)*float(commissionDict.get("chargeValue")))/100
                        elif commissionDict.get("chargeType") == "Fixed":
                            chargeAmount = float(commissionDict.get("chargeValue"))
                        if commissionType.get("commissionType") == "Percentage":
                            commissionAmount = (float(amount)*float(commissionDict.get("commissionValue")))/100
                        elif commissionDict.get("commissionType") == "Fixed":
                            commissionAmount = float(commissionDict.get("commissionValue"))
                        
                        #Updating user commission balance
                        if commissionAmount:
                            commissionBalance = user_queryset.commissionBalance
                            commissionBalance += commissionAmount
                            user_queryset.update(commissionBalance=commissionBalance)
                        
                        commissionCharges = {
                        "chargeType": commissionDict.get("chargeType"),
                        "chargeValue": commissionDict.get("chargeValue"),
                        "commissionType": commissionDict.get("commissionType"),
                        "commissionValue": commissionDict.get("commissionValue"),
                        "chargeAmount": chargeAmount,
                        "commissionAmount": commissionAmount
                        }
                        operator_queryset = Operators.objects(id=operatorId).first()
                        user_commission_table = UserCommissions(
                            userId = userId,
                            childUserId =None,
                            operatorId = operatorId,
                            serviceId = str(operator_queryset.serviceId.id),
                            transactionId = transactionId,
                            transactionAPIId = transactionAPIId,
                            totalAmount = amount,
                            commissionType = commissionDict.get("chargeType"),
                            commissionAmount = commissionAmount,
                            createdOn = datetime.datetime.now(),
                            status = 1,
                            ).save()
            #Calulate total amount
            totalAmount = float(amount) - chargeAmount
            transaction_table = Transactions(
                userId = userId,
                categoryId = categoryId,
                serviceId = serviceId,
                operatorId = operatorId,
                categoryName = categoryName,
                serviceName = serviceName,
                operatorName = operatorName,
                paymentType  = paymentType,
                paymentGatewayId = paymentGatewayId,
                transactionAPIId = transactionAPIId,
                transactionId = transactionId,
                transactionData = transactionData,
                mobileNumber = mobileNumber,
                amount = amount,
                totalAmount = totalAmount,
                commissionCharges = commissionCharges,
                operatorReference = operatorReference,
                createdOn = datetime.datetime.now(),
                status = status
                ).save()
            transactionTableId = str(transaction_table.id)
            if transactionTableId:
                user_parent_method_commission_charges_details(userId,amount,operatorId,transactionAPIId,transactionId)
                # service_queryset = Service.objects(id=serviceId,status__in=[1]).first()
                # if service_queryset:
                #     serviceName = service_queryset.serviceName
                # else:
                #     serviceName = ""

                if status in [1,2]:
                    currentBalance = user_queryset.walletBalance
                    updateBalance = float(currentBalance)-float(amount)
                    user_queryset.update(walletBalance = updateBalance)

                    #Here we need update this transaction to wallet also
                    wallet_trasaction_table = WalletTransactions(
                        userId = userId,
                        amount =amount,
                        paymentGatewayId = paymentGatewayId,
                        creditType = "debit",
                        transactionId = transactionId,
                        paymentType = paymentType,
                        settlementPayId = None,
                        walletLog = serviceName + " " + str(mobileNumber) + " is recharged with the amount of " + str(int(amount)) + ".",
                        userType = "user",
                        createdBy = None,
                        createdOn = datetime.datetime.now(),
                        status = 1,
                        ).save()
                # except Exception as e:
                #     app.logger.error(traceback.format_exc())
                #     data_status["result"] = "Unable to make transaction"
                #     return data_status
            if status:
                data_status["responseStatus"] = status
                data_status["id"] = transactionTableId
                data_status["result"] = "Transaction successful"
                # data_status["transactionId"] = transactionTableId
                return data_status
            else:
                data_status["responseStatus"] = status
                data_status["id"] = transactionTableId
                data_status["result"] = "Transaction unsuccessful"
                return data_status
        except Exception as e:
            app.logger.error(traceback.format_exc())
            data_status["result"] = "Unable to make transaction"
            return data_status
    else:
        data_status['result'] = "Required fields are missing"
        return data_status


def user_parent_method_commission_charges_details(userId,amount,operatorId,transactionAPIId,transactionId):
    try:
        user_queryset = Users.objects(id=userId).first()
        commissionCharges = {}
        childcommissionDict = {}
        parentcommissionDict = {}
        chargeAmount = 0.0
        if user_queryset.commissionId:
            childcommissionId = str(user_queryset.commissionId.id)
            childcommissions_queryset = Commissions.objects(id=childcommissionId,status=1).order_by("-id").first()
            for childeach_record in childcommissions_queryset.commissionList:
                if childeach_record.get("operatorId") == operatorId and childeach_record.get("transactionAPIId") == transactionAPIId:
                    childcommissionDict = {
                    "chargeType": childeach_record.get("chargeType"),
                    "chargeValue": childeach_record.get("chargeValue"),
                    "commissionType": childeach_record.get("commissionType"),
                    "commissionValue": childeach_record.get("commissionValue")
                    }

            if user_queryset.parentId:
                parent_queryset = Users.objects(id=user_queryset.parentId).first()
                if parent_queryset.commissionId:
                    parentcommissionId = str(parent_queryset.commissionId.id)
                    parentcommissions_queryset = Commissions.objects(id=parentcommissionId,status=1).order_by("-id").first()
                    for parenteach_record in parentcommissions_queryset.commissionList:
                        if parenteach_record.get("operatorId") == operatorId and parenteach_record.get("transactionAPIId") == transactionAPIId:
                            parentcommissionDict = {
                            "chargeType": parenteach_record.get("chargeType"),
                            "chargeValue": parenteach_record.get("chargeValue"),
                            "commissionType": parenteach_record.get("commissionType"),
                            "commissionValue": parenteach_record.get("commissionValue")
                            }

                    # if parentcommissionDict.get("chargeType")==childcommissionDict.get("chargeType"):
                    #     parentcommisionval=childcommissionDict.get("chargeValue")-parentcommissionDict.get("chargeValue")
                    #     if parentcommissionDict.get("chargeType") == "Percentage":
                    #         chargeAmount = (float(amount)*float(parentcommisionval))/100
                    #     elif parentcommissionDict.get("chargeType") == "Fixed":
                    #         chargeAmount = float(parentcommisionval)
                    # else:
                    if parentcommissionDict.get("chargeType") == "Percentage":
                        parentchargeAmount = (float(amount)*float(parentcommissionDict.get("chargeValue")))/100
                    elif parentcommissionDict.get("chargeType") == "Fixed":
                        parentchargeAmount = float(parentcommissionDict.get("chargeValue"))

                    if childcommissionDict.get("chargeType") == "Percentage":
                        childchargeAmount = (float(amount)*float(childcommissionDict.get("chargeValue")))/100
                    elif childcommissionDict.get("chargeType") == "Fixed":
                        childchargeAmount = float(childcommissionDict.get("chargeValue"))
                    parentcommissionamount=childchargeAmount-parentchargeAmount

                    operator_queryset = Operators.objects(id=operatorId).first()
                    if parentcommissionamount:
                        user_commission_table = UserCommissions(
                            userId = str(parent_queryset.id),
                            childUserId =userId,
                            operatorId = operatorId,
                            serviceId = str(operator_queryset.serviceId.id),
                            transactionId = transactionId,
                            transactionAPIId = transactionAPIId,
                            totalAmount = amount,
                            commissionType = parentcommissionDict.get("chargeType"),
                            commissionAmount = parentcommissionamount,
                            createdOn = datetime.datetime.now(),
                            status = 1,
                            ).save()
                        commissionBalance = parent_queryset.commissionBalance
                        commissionBalance += parentcommissionamount
                        parent_queryset.update(commissionBalance=commissionBalance)

                user_parent_method_commission_charges_details(str(parent_queryset.id),amount,operatorId,transactionAPIId,transactionId)
            else:
                False

    except Exception as e:
        app.logger.error(traceback.format_exc())
        return False



#Get all transactions
@merchants.route("/get_all_transactions",methods=["POST"])
def get_all_transactions():
    data_status = {"responseStatus": 0, "result": ""}
    userId = request.json.get("userId","")
    startDate = request.json.get("startDate","")
    endDate = request.json.get("endDate","")
    transactionsList = []

    if userId:

        if startDate and endDate:
            startDate = startDate + " 00:00:00"
            endDate = endDate + " 23:59:59"
            start_date = datetime.datetime.strptime(startDate, "%m-%d-%Y %H:%M:%S")
            end_date = datetime.datetime.strptime(endDate, "%m-%d-%Y %H:%M:%S")
            transactions_queryset = Transactions.objects(
                userId=userId,
                createdOn__gte=start_date,
                createdOn__lte=end_date,
                ).order_by("-id").all()
        else:
            transactions_queryset = Transactions.objects(
                userId=userId,
                ).order_by("-id").all()


        # transactions_queryset = Transactions.objects(userId=userId).order_by('-id').all()
        for each_transaction in transactions_queryset:
            transaction_data = {
            "id":str(each_transaction.id),
            # "categoryId":str(each_transaction.categoryId.id),
            "categoryName":each_transaction.categoryName,
            "serviceName":each_transaction.serviceName,
            "operatorName":each_transaction.operatorName,
            # "serviceId":str(each_transaction.serviceId.id),
            # "operatorId":str(each_transaction.operatorId.id),
            "transactionId":each_transaction.transactionId,
            "mobileNumber":each_transaction.mobileNumber,
            "amount":each_transaction.amount,
            "operatorReference":each_transaction.operatorReference,
            # "createdOn":each_transaction.createdOn.strftime("%d %b,%I:%M %p"),
            }
            if each_transaction.ifscCode:
                transaction_data["ifscCode"] = each_transaction.ifscCode
            else:
                transaction_data["ifscCode"] = ""
            if each_transaction.accountNumber:
                transaction_data["accountNumber"] = each_transaction.accountNumber
            else:
                transaction_data["accountNumber"] = ""
                
            if each_transaction.createdOn:
                ist_time=each_transaction.createdOn.replace(tzinfo=pytz.utc).astimezone(ist_timezone)
                transaction_data["createdOn"] = ist_time.strftime("%m-%d-%Y %I:%M %p")
            try:
                if each_transaction.categoryId:
                    transaction_data["categoryId"] = str(each_transaction.categoryId.id)
                    transaction_data["categoryName"] = each_transaction.categoryId.categoryName
                else:
                    transaction_data["categoryId"] = ""
                    # transaction_data["categoryName"] = ""
            except:
                transaction_data["categoryId"] = ""

            try:
                if each_transaction.serviceId:
                    transaction_data["serviceId"] = str(each_transaction.serviceId.id)
                    transaction_data["serviceName"] = each_transaction.serviceId.serviceName
                else:
                    transaction_data["serviceId"] = ""
                    # transaction_data["serviceName"] = ""
            except:
                transaction_data["serviceId"] = ""

            try:
                if each_transaction.operatorId:
                    transaction_data["operatorId"] = str(each_transaction.operatorId.id)
                    transaction_data["operatorName"] = each_transaction.operatorId.operatorName
                else:
                    transaction_data["operatorId"] = ""
                    # transaction_data["operatorName"] = ""
            except:
                transaction_data["operatorId"] = ""


            if each_transaction.status == 1:
                transaction_data["status"] = "successful"
            elif each_transaction.status == 0:
                transaction_data["status"] = "failed"
            else:
                transaction_data["status"] = "pending"

            transactionsList.append(transaction_data)
        data_status["result"] = "Transaction details fetched successfully"
        data_status["responseStatus"] = 1
        data_status["transactionsList"] = transactionsList
        return data_status
    else:
        data_status["result"] = "Required fields are missing"
        return data_status


#Get single transactions
@merchants.route("/get_single_transaction",methods=["POST"])
def get_single_transaction():
    data_status = {"responseStatus": 0, "result": "",}
    transactionId = request.json.get("transactionId","")

    if transactionId:
        try:
            transaction_data = {}
            each_transaction = Transactions.objects(id=transactionId).order_by('-id').first()
            if each_transaction:
                if each_transaction.categoryName == "Recharge" or each_transaction.categoryName == "BBPS" or each_transaction.categoryName == "Telecom":
                    transaction_data = {
                    "id":str(each_transaction.id),
                    "categoryName":each_transaction.categoryName,
                    "serviceName":each_transaction.serviceName,
                    "operatorName":each_transaction.operatorName,
                    # "transactionId":each_transaction.transactionId,
                    "mobileNumber":each_transaction.mobileNumber,
                    "amount":each_transaction.amount,
                    "commissionCharges":each_transaction.commissionCharges,
                    "accountNumber":"",
                    }
                    if each_transaction.createdOn:
                        ist_time=each_transaction.createdOn.replace(tzinfo=pytz.utc).astimezone(ist_timezone)
                        transaction_data["createdOn"] = ist_time.strftime("%m-%d-%Y %I:%M %p")

                    payment_details = {}
                    payment_details["transactionId"] = each_transaction.transactionId
                    if each_transaction.operatorReference:
                        payment_details["operatorReference"] = each_transaction.operatorReference.strip()
                    else:
                        payment_details["operatorReference"] = ""

                    if each_transaction.paymentType:
                        payment_details["debitedFrom"] = each_transaction.paymentType
                    else:
                        payment_details["debitedFrom"] = ""

                    if not each_transaction.paymentType:
                        wallet_transaction = WalletTransactions.objects(transactionId=each_transaction.transactionId).order_by('-id').first()
                        if wallet_transaction:
                            payment_details["debitedFrom"] = wallet_transaction.paymentType
                        else:
                            payment_details["debitedFrom"] = ""

                    transaction_data["paymentDetails"] = payment_details

                    transaction_data["accountHolderName"] = ""

                    try:
                        if each_transaction.operatorId.image:
                            transaction_data["image"] = domain+each_transaction.operatorId.image
                        else:
                            transaction_data["image"] = ""
                    except:
                        transaction_data["image"] = ""

                    if each_transaction.status == 1:
                        transaction_data["status"] = "Successful"
                    elif each_transaction.status == 0:
                        transaction_data["status"] = "Failed"
                    else:
                        transaction_data["status"] = "Pending"

                    # if each_transaction.ifscCode:
                    #     transaction_data["ifscCode"] = each_transaction.ifscCode
                    # else:
                    #     transaction_data["ifscCode"] = ""
                    # if each_transaction.accountNumber:
                    #     transaction_data["accountNumber"] = each_transaction.accountNumber
                    # else:
                    #     transaction_data["accountNumber"] = ""
                        
                    
                    # try:
                    #     if each_transaction.categoryId:
                    #         transaction_data["categoryId"] = str(each_transaction.categoryId.id)
                    #         transaction_data["categoryName"] = each_transaction.categoryId.categoryName
                    #     else:
                    #         transaction_data["categoryId"] = ""
                    #         # transaction_data["categoryName"] = ""
                    # except:
                    #     transaction_data["categoryId"] = ""

                    # try:
                    #     if each_transaction.serviceId:
                    #         transaction_data["serviceId"] = str(each_transaction.serviceId.id)
                    #         transaction_data["serviceName"] = each_transaction.serviceId.serviceName
                    #     else:
                    #         transaction_data["serviceId"] = ""
                    #         # transaction_data["serviceName"] = ""
                    # except:
                    #     transaction_data["serviceId"] = ""

                    # try:
                    #     if each_transaction.operatorId:
                    #         transaction_data["operatorId"] = str(each_transaction.operatorId.id)
                    #         transaction_data["operatorName"] = each_transaction.operatorId.operatorName
                    #     else:
                    #         transaction_data["operatorId"] = ""
                    #         # transaction_data["operatorName"] = ""
                    # except:
                    #     transaction_data["operatorId"] = ""

                elif each_transaction.categoryName == "Payout":
                    transaction_data = {
                    "id":str(each_transaction.id),
                    "categoryName":each_transaction.categoryName,
                    "serviceName":each_transaction.serviceName,
                    "operatorName":each_transaction.operatorName,
                    "mobileNumber":each_transaction.mobileNumber,
                    "accountNumber":each_transaction.accountNumber,
                    "amount":each_transaction.amount,
                    "commissionCharges":each_transaction.commissionCharges,
                    }
                    if each_transaction.createdOn:
                        ist_time=each_transaction.createdOn.replace(tzinfo=pytz.utc).astimezone(ist_timezone)
                        transaction_data["createdOn"] = ist_time.strftime("%m-%d-%Y %I:%M %p")

                    payment_details = {}
                    payment_details["transactionId"] = each_transaction.transactionId

                    if each_transaction.paymentType:
                        payment_details["debitedFrom"] = each_transaction.paymentType
                    else:
                        payment_details["debitedFrom"] = ""
                    transaction_data["paymentDetails"] = payment_details

                    if each_transaction.operatorReference:
                        payment_details["operatorReference"] = each_transaction.operatorReference.strip()
                    else:
                        payment_details["operatorReference"] = ""

                    if each_transaction.accountHolderName:
                        transaction_data["accountHolderName"] = each_transaction.accountHolderName
                    else:
                        transaction_data["accountHolderName"] = ""

                    try:
                        if each_transaction.image:
                            transaction_data["image"] = domain+each_transaction.image
                        else:
                            transaction_data["image"] = ""
                    except:
                        transaction_data["image"] = ""

                    if each_transaction.status == 1:
                        transaction_data["status"] = "Successful"
                    elif each_transaction.status == 0:
                        transaction_data["status"] = "Failed"
                    else:
                        transaction_data["status"] = "Pending"

                    # if each_transaction.ifscCode:
                    #     transaction_data["ifscCode"] = each_transaction.ifscCode
                    # else:
                    #     transaction_data["ifscCode"] = ""
                    # if each_transaction.accountNumber:
                    #     transaction_data["accountNumber"] = each_transaction.accountNumber
                    # else:
                    #     transaction_data["accountNumber"] = ""
                        
                    
                    # try:
                    #     if each_transaction.categoryId:
                    #         transaction_data["categoryId"] = str(each_transaction.categoryId.id)
                    #         transaction_data["categoryName"] = each_transaction.categoryId.categoryName
                    #     else:
                    #         transaction_data["categoryId"] = ""
                    #         # transaction_data["categoryName"] = ""
                    # except:
                    #     transaction_data["categoryId"] = ""

                    # try:
                    #     if each_transaction.serviceId:
                    #         transaction_data["serviceId"] = str(each_transaction.serviceId.id)
                    #         transaction_data["serviceName"] = each_transaction.serviceId.serviceName
                    #     else:
                    #         transaction_data["serviceId"] = ""
                    #         # transaction_data["serviceName"] = ""
                    # except:
                    #     transaction_data["serviceId"] = ""

                    # try:
                    #     if each_transaction.operatorId:
                    #         transaction_data["operatorId"] = str(each_transaction.operatorId.id)
                    #         transaction_data["operatorName"] = each_transaction.operatorId.operatorName
                    #     else:
                    #         transaction_data["operatorId"] = ""
                    #         # transaction_data["operatorName"] = ""
                    # except:
                    #     transaction_data["operatorId"] = ""

                elif each_transaction.categoryName == "DMT":
                    transaction_data = {
                    "id":str(each_transaction.id),
                    "categoryName":each_transaction.categoryName,
                    "serviceName":each_transaction.serviceName,
                    "operatorName":each_transaction.operatorName,
                    # "mobileNumber":each_transaction.mobileNumber,
                    # "accountNumber":each_transaction.accountNumber,
                    "amount":each_transaction.amount,
                    "commissionCharges":each_transaction.commissionCharges,
                    }
                    if each_transaction.beneficiaryId:
                        transaction_data["mobileNumber"] = each_transaction.beneficiaryId.mobileNumber
                        transaction_data["accountNumber"] = str(each_transaction.beneficiaryId.accountNumber)
                        transaction_data["accountHolderName"] = each_transaction.beneficiaryId.fullName
                        masterIfscBank = MasterIFSCBank.objects(id=each_transaction.beneficiaryId.masterBankId.id).first()
                        if masterIfscBank:
                            transaction_data["ifscCode"] = masterIfscBank.ifscCode
                    else:
                        transaction_data["mobileNumber"] = ""
                        transaction_data["accountNumber"] = ""
                        transaction_data["accountHolderName"] = ""
                        transaction_data["ifsc"] = ""

                    if each_transaction.createdOn:
                        ist_time=each_transaction.createdOn.replace(tzinfo=pytz.utc).astimezone(ist_timezone)
                        transaction_data["createdOn"] = ist_time.strftime("%m-%d-%Y %I:%M %p")

                    payment_details = {}
                    payment_details["transactionId"] = each_transaction.transactionId

                    if each_transaction.paymentType:
                        payment_details["debitedFrom"] = each_transaction.paymentType
                    else:
                        payment_details["debitedFrom"] = ""

                    transaction_data["paymentDetails"] = payment_details

                    if each_transaction.operatorReference:
                        payment_details["operatorReference"] = each_transaction.operatorReference.strip()
                    else:
                        payment_details["operatorReference"] = ""

                    try:
                        if each_transaction.image:
                            transaction_data["image"] = domain+each_transaction.image
                        else:
                            transaction_data["image"] = ""
                    except:
                        transaction_data["image"] = ""

                    if each_transaction.status == 1:
                        transaction_data["status"] = "Successful"
                    elif each_transaction.status == 0:
                        transaction_data["status"] = "Failed"
                    else:
                        transaction_data["status"] = "Pending"
                    
                    # try:
                    #     if each_transaction.categoryId:
                    #         transaction_data["categoryId"] = str(each_transaction.categoryId.id)
                    #         transaction_data["categoryName"] = each_transaction.categoryId.categoryName
                    #     else:
                    #         transaction_data["categoryId"] = ""
                    #         # transaction_data["categoryName"] = ""
                    # except:
                    #     transaction_data["categoryId"] = ""

                    # try:
                    #     if each_transaction.serviceId:
                    #         transaction_data["serviceId"] = str(each_transaction.serviceId.id)
                    #         transaction_data["serviceName"] = each_transaction.serviceId.serviceName
                    #     else:
                    #         transaction_data["serviceId"] = ""
                    #         # transaction_data["serviceName"] = ""
                    # except:
                    #     transaction_data["serviceId"] = ""

                    # try:
                    #     if each_transaction.operatorId:
                    #         transaction_data["operatorId"] = str(each_transaction.operatorId.id)
                    #         transaction_data["operatorName"] = each_transaction.operatorId.operatorName
                    #     else:
                    #         transaction_data["operatorId"] = ""
                    #         # transaction_data["operatorName"] = ""
                    # except:
                    #     transaction_data["operatorId"] = ""


            data_status["result"] = "Transaction details fetched successfully"
            data_status["responseStatus"] = 1
            data_status["transactionData"] = transaction_data
            return data_status
        except Exception as e:
            app.logger.error(traceback.format_exc())
            data_status["result"] = "Unable to fetch transaction details"
            return data_status 
    else:
        data_status["result"] = "Required field is missing"
        return data_status



# #Get single transactions
# @merchants.route("/get_single_transaction",methods=["POST"])
# def get_single_transaction():
#     data_status = {"responseStatus": 0, "result": ""}
#     transactionId = request.json.get("transactionId","")

#     if transactionId:

#         each_transaction = Transactions.objects(id=transactionId).order_by('-id').first()

#         transaction_data = {
#         "id":str(each_transaction.id),
#         "categoryName":each_transaction.categoryName,
#         "serviceName":each_transaction.serviceName,
#         "operatorName":each_transaction.operatorName,
#         "transactionId":each_transaction.transactionId,
#         "mobileNumber":each_transaction.mobileNumber,
#         "amount":each_transaction.amount,
#         "operatorReference":each_transaction.operatorReference,
#         }
#         if each_transaction.ifscCode:
#             transaction_data["ifscCode"] = each_transaction.ifscCode
#         else:
#             transaction_data["ifscCode"] = ""
#         if each_transaction.accountNumber:
#             transaction_data["accountNumber"] = each_transaction.accountNumber
#         else:
#             transaction_data["accountNumber"] = ""
            
#         if each_transaction.createdOn:
#             ist_time=each_transaction.createdOn.replace(tzinfo=pytz.utc).astimezone(ist_timezone)
#             transaction_data["createdOn"] = ist_time.strftime("%m-%d-%Y %I:%M %p")
#         try:
#             if each_transaction.categoryId:
#                 transaction_data["categoryId"] = str(each_transaction.categoryId.id)
#                 transaction_data["categoryName"] = each_transaction.categoryId.categoryName
#             else:
#                 transaction_data["categoryId"] = ""
#                 # transaction_data["categoryName"] = ""
#         except:
#             transaction_data["categoryId"] = ""

#         try:
#             if each_transaction.serviceId:
#                 transaction_data["serviceId"] = str(each_transaction.serviceId.id)
#                 transaction_data["serviceName"] = each_transaction.serviceId.serviceName
#             else:
#                 transaction_data["serviceId"] = ""
#                 # transaction_data["serviceName"] = ""
#         except:
#             transaction_data["serviceId"] = ""

#         try:
#             if each_transaction.operatorId:
#                 transaction_data["operatorId"] = str(each_transaction.operatorId.id)
#                 transaction_data["operatorName"] = each_transaction.operatorId.operatorName
#             else:
#                 transaction_data["operatorId"] = ""
#                 # transaction_data["operatorName"] = ""
#         except:
#             transaction_data["operatorId"] = ""


#         if each_transaction.status == 1:
#             transaction_data["status"] = "successful"
#         elif each_transaction.status == 0:
#             transaction_data["status"] = "failed"
#         else:
#             transaction_data["status"] = "pending"

#         data_status["result"] = "Transaction details fetched successfully"
#         data_status["responseStatus"] = 1
#         data_status["transactionData"] = transaction_data
#         return data_status
#     else:
#         data_status["result"] = "Required fields are missing"
#         return data_status


#Add Profile Picture
@merchants.route("/add_profile_picture",methods=["POST"])
def add_profile_picture():
    data_status = {"responseStatus": 0, "result": ""}
    userId = request.json.get("userId","")
    profilePicture = request.json.get("profilePicture","")

    if userId and profilePicture:
        try:
            user_queryset = Users.objects(id=userId,status__nin=[2]).first()
            if not user_queryset:
                data_status["result"] = "Invalid user id"
                return data_status

            profile = upload_file_image(profilePicture, "userProfiles", str(get_epoch_milli_time()), "")
            if profile:
                user_queryset.update(profilePicture=profile)


            data_status["responseStatus"] = 1
            data_status["result"] = "Profile picture added successfully"
            return data_status
        except Exception as e:
            app.logger.error(traceback.format_exc())
            data_status["result"] = "Unable to add profile picture"
            return data_status
    else:
        data_status["result"] = "Required fields are missing"
        return data_status

########### Internal Transfer API ##########

@merchants.route("/add_internal_transfer",methods=["POST"])
def add_internal_transfer():
    data_status = {"responseStatus": 0, "result": ""}
    userId = request.json.get("userId","")
    paymentType = request.json.get("paymentType","")
    transactionId = request.json.get("transactionId","")
    mobileNumber = request.json.get("mobileNumber","")
    amount = request.json.get("amount")
    remarks = request.json.get("remarks")
    paymentGatewayId = request.json.get("paymentGatewayId",None)

    if transactionId and mobileNumber and amount and remarks and userId:
        try:
            user_queryset = Users.objects(id=userId,status__in=[1]).first()
            if not user_queryset:
                data_status["result"] = "Invalid user Id"
                return data_status
            otheruser_queryset = Users.objects(phoneNumber=mobileNumber,status__in=[1]).first()
            if not otheruser_queryset:
                data_status["result"] = "Invalid user Id"
                return data_status
            currentBalance = user_queryset.walletBalance
            updateBalance = float(currentBalance)-float(amount)
            user_queryset.update(walletBalance = updateBalance)

            #Here we need update this transaction to wallet also
            wallet_trasaction_table = WalletTransactions(
                userId = userId,
                amount =amount,
                paymentGatewayId = paymentGatewayId,
                creditType = "debit",
                transactionId = transactionId,
                paymentType = paymentType,
                settlementPayId = None,
                walletLog = str(int(amount)) + " is transferd to " + otheruser_queryset.fullName + " (" + str(mobileNumber)+ ")",
                remarks = remarks,
                userType = "user",
                createdBy = None,
                createdOn = datetime.datetime.now(),
                status = 1,
                ).save()

            othercurrentBalance = otheruser_queryset.walletBalance
            otherupdateBalance = float(othercurrentBalance)+float(amount)
            otheruser_queryset.update(walletBalance = otherupdateBalance)

            #Here we need update this transaction to wallet also
            wallet_trasaction_table1 = WalletTransactions(
                userId = str(otheruser_queryset.id),
                amount =amount,
                paymentGatewayId = paymentGatewayId,
                creditType = "credit",
                transactionId = transactionId,
                paymentType = paymentType,
                settlementPayId = None,
                walletLog = str(int(amount)) + " is transferd from " + user_queryset.fullName + " (" + str(user_queryset.phoneNumber)+ ")",
                remarks = remarks,
                userType = "user",
                createdBy = None,
                createdOn = datetime.datetime.now(),
                status = 1,
                ).save()
            wtransactionId = str(wallet_trasaction_table1.id)
            if wtransactionId:
                data_status["responseStatus"] = 1
                data_status["result"] = "Transaction successful"
                data_status["transactionId"] = wtransactionId
                return data_status
            else:
                data_status["responseStatus"] = 0
                data_status["result"] = "Transaction transfered failed."
                return data_status
        except Exception as e:
            app.logger.error(traceback.format_exc())
            data_status["result"] = "Transaction unsuccessful"
            return data_status
    else:
        data_status['result'] = "Required fields are missing"
        return data_status


########### User Mobile Number Verify API ##########

@merchants.route("/user_mobileNumber_verify",methods=["POST"])
def user_mobileNumber_verify():
    data_status = {"responseStatus": 0, "result": ""}
    userId = request.json.get("userId","")
    mobileNumber = request.json.get("mobileNumber","")

    if userId and mobileNumber:
        try:
            user_queryset = Users.objects(id=userId,status__in=[1]).first()
            if not user_queryset:
                data_status["result"] = "Invalid user Id"
                return data_status
            otheruser_queryset = Users.objects(phoneNumber=mobileNumber,status__in=[1]).first()
            if not otheruser_queryset:
                data_status["result"] = "Invalid Mobile Number"
                return data_status
            else:
                data_status["responseStatus"] = 1
                data_status["result"] = "Mobile Number Valid."
                return data_status
        except Exception as e:
            app.logger.error(traceback.format_exc())
            data_status["result"] = "Transaction unsuccessful"
            return data_status
    else:
        data_status['result'] = "Required fields are missing"
        return data_status

@merchants.route("/user_upload_video",methods=["POST"])
def user_upload_video():
    data_status = {"responseStatus": 0, "result": ""}
    userId = request.form.get("userId","")
    uploadVideo = request.files.get("uploadVideo","")
    videoVerificationStatus = request.form.get("videoVerificationStatus","")
    videoVerificationReason = request.form.get("videoVerificationReason","")

    print(uploadVideo,"((((((((((((((((((((uploadVideo))))))))))))))))))))")
    if not userId and not uploadVideo and not videoVerificationStatus and not videoVerificationReason:
        data_status["result"]="Required fields are missing!!"
        return data_status
    try:
        user_kyc_queryset = UserKYC.objects(userId=userId).first()
        if not user_kyc_queryset:
            data_status["result"]="Invalid user id!!"
            return data_status
        if uploadVideo:
            video_file = upload_file_video("uploadKYCVideos", userId, ".mp4", uploadVideo)
            if video_file:
                user_kyc_queryset.update(
                    uploadVideo=video_file,
                    videoVerificationStatus=videoVerificationStatus,
                    videoVerificationReason=videoVerificationReason
                    )

            print(video_file,"video_filevideo_file")
        print(uploadVideo,"uploadVideo")
        data_status["responseStatus"] = 1
        data_status["result"] = "Video uploaded successfully!"
        return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"] = "Unable to upload video!!"
        return data_status

# @merchants.route("/operator_grouping_based_operator_parameters_list",methods=["POST"])
# def operator_grouping_based_operator_parameters_list():
#     data_status = {"responseStatus": 0, "result": ""}
#     operatorGroupingsList = []
#     try:
#         operator_grouping_queryset = OperatorGrouping.objects(status__in=[1]).order_by('-id').all()
#         for each_operator_grouping in operator_grouping_queryset:
#             operator_grouping_data = {
#             "id":str(each_operator_grouping.id),
#             "groupName":each_operator_grouping.groupName,
#             "value":each_operator_grouping.value,
#             }
#             operatorParametersList = []
#             if each_operator_grouping.operatorParameterId:
#                 operator_parameters_queryset = OperatorParameter.objects(
#                     id=str(each_operator_grouping.operatorParameterId.id),
#                     status__in=[1]
#                     ).order_by("-id").all()
#                 for each_operator_parameter in operator_parameters_queryset:
#                     operator_parameter_dict = fetching_operator_parameter_details(each_operator_parameter)
#                     operatorParametersList.append(operator_parameter_dict)
#             operator_grouping_data["operatorParametersList"] = operatorParametersList
#             operatorGroupingsList.append(operator_grouping_data)
#         data_status["responseStatus"] = 1
#         data_status["result"] = "Operator grouping based operator parameters data fetched successfully!"
#         data_status["operatorGroupingsList"] = operatorGroupingsList
#         return data_status
#     except Exception as e:
#         app.logger.error(traceback.format_exc())
#         data_status["result"] = "Unable to fetch operator parameters data!!"
#         return data_status



################################################

# @merchants.route("/get_single_transaction1111", methods=["POST"])
# def get_single_transaction1111():
#     data_status = {"responseStatus": 0, "result": "", "transactionData": {}}
#     transaction_id = request.json.get("transactionId", "")

#     if not transaction_id:
#         data_status["result"] = "Required field 'transactionId' is missing"
#         return jsonify(data_status)

#     try:
#         each_transaction = Transactions.objects(id=transaction_id).order_by('-id').first()

#         if not each_transaction:
#             data_status["result"] = "Transaction not found"
#             return jsonify(data_status)

#         transaction_data = format_transaction_data(each_transaction)
#         data_status["result"] = "Transaction details fetched successfully"
#         data_status["responseStatus"] = 1
#         data_status["transactionData"] = transaction_data
#         return jsonify(data_status)

#     except Exception as e:
#         app.logger.error(traceback.format_exc())
#         data_status["result"] = "Unable to fetch transaction details"
#         return jsonify(data_status)


# def format_transaction_data(transaction):
#     transaction_data = {
#         "id": str(transaction.id),
#         "categoryName": transaction.categoryName,
#         "serviceName": transaction.serviceName,
#         "operatorName": transaction.operatorName,
#         "mobileNumber": transaction.mobileNumber,
#         "amount": transaction.amount,
#         "createdOn": format_created_on(transaction.createdOn),
#         "paymentDetails": format_payment_details(transaction),
#         "accountHolderName": transaction.accountHolderName if transaction.categoryName == "Payout" else "",
#         "image": domain + transaction.image if hasattr(transaction, 'image') and transaction.image else "",
#         "status": format_transaction_status(transaction.status),
#     }

#     return transaction_data


# def format_created_on(created_on):
#     if created_on:
#         ist_time = created_on.replace(tzinfo=pytz.utc).astimezone(ist_timezone)
#         return ist_time.strftime("%m-%d-%Y %I:%M %p")
#     return ""


# def format_payment_details(transaction):
#     payment_details = {"transactionId": transaction.transactionId}

#     if transaction.operatorReference:
#         payment_details["operatorReference"] = transaction.operatorReference.strip()
#     else:
#         payment_details["operatorReference"] = ""

#     if transaction.paymentType:
#         payment_details["debitedFrom"] = transaction.paymentType
#     else:
#         wallet_transaction = WalletTransactions.objects(transactionId=transaction.transactionId).order_by('-id').first()
#         payment_details["debitedFrom"] = wallet_transaction.paymentType if wallet_transaction else ""

#     return payment_details


# def format_transaction_status(status):
#     if status == 1:
#         return "Successful"
#     elif status == 0:
#         return "Failed"
#     else:
#         return "Pending"



@merchants.route("/add_remitter_beneficiaries",methods=["POST"])
def add_remitter_beneficiaries():
    data_status = {"responseStatus": 0, "result": ""}
    userId = request.json.get("userId","")
    firstName = request.json.get("firstName","")
    lastName = request.json.get("lastName","")
    phoneNumber = request.json.get("phoneNumber","")
    pincode = request.json.get("pincode","")
    moneyArtRemitterId = request.json.get("moneyArtRemitterId","")
    monthlyLimit = request.json.get("monthlyLimit","")
    availableBalance = request.json.get("availableBalance","")
    recipientsList = request.json.get("recipientsList",[])
    print(recipientsList)
    print("((((((((((((((recipientsList))))))))))))))")

    if userId:
        try:
            remitter_queryset = Remitters.objects(phoneNumber__iexact=phoneNumber,status__in=[1]).first()
            if not remitter_queryset:
                remitters_table = Remitters(
                    userId = userId,
                    firstName = firstName,
                    lastName = lastName,
                    phoneNumber = phoneNumber,
                    pincode = pincode,
                    moneyArtRemitterId = moneyArtRemitterId,
                    monthlyLimit = monthlyLimit,
                    availableBalance = availableBalance,
                    createdOn = datetime.datetime.now(),
                    status = 1,
                    ).save()
                remitterId = str(remitters_table.id)
                for each_recipient in recipientsList:
                    print(each_recipient)
                    print("((((((((((each_recipient))))))))))")
                    ifscCode=each_recipient.get("ifscCode")
                    master_bank_queryset = MasterIFSCBank.objects(ifscCode=ifscCode,status__in=[1]).first()
                    if master_bank_queryset:
                        beneficiary_table = Beneficiaries(
                            userId = userId,
                            masterBankId = str(master_bank_queryset.id),
                            beneficiaryId = beneficiaryId,
                            fullName = fullName,
                            mobileNumber = mobileNumber,
                            verifyStatus = verifyStatus,
                            accountNumber = accountNumber,
                            createdOn = datetime.datetime.now(),
                            status = 1,
                            ).save()
                    else:
                        bankCode = ifscCode[-6:]
                        master_bank_table = MasterIFSCBank(
                            bankName = each_recipient.get("bankName",""),
                            bankCode = bankCode,
                            ifscCode = each_recipient.get("ifscCode",""),
                            isCreditCard = False,
                            isSettlement = False,
                            createdOn = datetime.datetime.now(),
                            status = 1,
                            ).save()
                        master_bank_table_id = str(master_bank_table.id)
                        beneficiary_table = Beneficiaries(
                            userId = userId,
                            masterBankId = master_bank_table_id,
                            beneficiaryId = each_recipient.get("beneficiaryId",""),
                            fullName = each_recipient.get("fullName",""),
                            mobileNumber = each_recipient.get("mobileNumber",""),
                            verifyStatus = each_recipient.get("verifyStatus",False),
                            accountNumber = each_recipient.get("accountNumber"),
                            createdOn = datetime.datetime.now(),
                            status = 1,
                            ).save()
                
                remitter_queryset = Remitters.objects(id=remitterId,status__in=[1]).first()
                remittersData={
                'remitterId':str(remitter_queryset.id),
                # 'moneyArtRemitterId':str(remitter_queryset.moneyArtRemitterId),
                'phoneNumber':remitter_queryset.phoneNumber,
                'firstName':remitter_queryset.firstName,
                'lastName':remitter_queryset.lastName,
                'availableBalance':remitter_queryset.availableBalance,
                'monthlyLimit':remitter_queryset.monthlyLimit,
                }
                if remitter_queryset.moneyArtRemitterId:
                    remittersData["moneyArtRemitterId"] = remitter_queryset.moneyArtRemitterId
                else:
                    remittersData["moneyArtRemitterId"] = ""

                
                data_status["responseStatus"] = 1
                data_status ["result"] = "Remitters and beneficiaries added successfully"
                data_status["remittersData"]=remittersData
                return data_status
            else:
                remittersData={
                'remitterId':str(remitter_queryset.id),
                # 'moneyArtRemitterId':str(remitter_queryset.moneyArtRemitterId),
                'phoneNumber':remitter_queryset.phoneNumber,
                'firstName':remitter_queryset.firstName,
                'lastName':remitter_queryset.lastName,
                'availableBalance':remitter_queryset.availableBalance,
                'monthlyLimit':remitter_queryset.monthlyLimit,
                }
                if remitter_queryset.moneyArtRemitterId:
                    remittersData["moneyArtRemitterId"] = remitter_queryset.moneyArtRemitterId
                else:
                    remittersData["moneyArtRemitterId"] = ""

                data_status["remittersData"]=remittersData
                data_status["responseStatus"] = 1
                data_status["result"]="This mobile number is already in use!!"
                return data_status
        except Exception as e:
            app.logger.error(traceback.format_exc())
            data_status["result"] = "Unable to add data"
            return data_status
    else:
        data_status["result"] = "The required fields are missing."
        return data_status

@merchants.route("/user_based_commissions", methods=["POST"])
def user_based_commissions():
    data_status = {"responseStatus": 0, "result": ""}
    userId = request.json.get("userId", "")
    commissionList = []
    if not userId:
        data_status["result"] = "Required fields are missing!!"
        return data_status

    try:
        user_queryset = Users.objects(id=userId,status__in=[0,1]).first()
        if not user_queryset:
            data_status["result"]="Invalid user id!!"
            return data_status
        commissionId = str(user_queryset.commissionId.id)
        commissions_queryset = Commissions.objects(id=commissionId,status__in=[1]).order_by("-id").first()
        commissionDict = {
        "id":str(commissions_queryset.id),
        "commissionName":commissions_queryset.commissionName
        }
        modifiedCommissionsList = []
        for each_commission in commissions_queryset.commissionList:
            operator_queryset = Operators.objects(id=each_commission.get("operatorId")).first()
            operatorName = operator_queryset.operatorName

            transaction_api_queryset = TransactionAPI.objects(id=each_commission.get("transactionAPIId")).first()
            apiName = transaction_api_queryset.apiName

            service_queryset = Service.objects(id=each_commission.get("serviceId")).first()
            serviceName = service_queryset.serviceName

            modifiedDict = {
            "id":str(commissions_queryset.id),
            "commissionName":commissions_queryset.commissionName,
            "operatorId":each_commission.get("operatorId"),
            "transactionAPIId":each_commission.get("transactionAPIId"),
            "serviceId":each_commission.get("serviceId"),
            "operatorName":operatorName,
            "apiName":apiName,
            "serviceName":serviceName,
            "chargeType": each_commission.get("chargeType"),
            "chargeValue": each_commission.get("chargeValue"),
            "commissionType": each_commission.get("commissionType"),
            "commissionValue": each_commission.get("commissionValue")
            }
            modifiedCommissionsList.append(modifiedDict)
        commissionDict["commissionList"]=modifiedCommissionsList

        data_status["result"] = "Commissions details fetched successfully"
        data_status["responseStatus"] = 1
        data_status["commissionDetails"] = commissionDict
        return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"] = "Unable to fetch commissions data!!"
        return data_status


@merchants.route("/operator_based_commissions", methods=["POST"])
def operator_based_commissions():
    data_status = {"responseStatus": 0, "result": "", "commissionDict": {}}
    userId = request.json.get("userId", "")
    operatorId = request.json.get("operatorId", "")
    transactionAPIId = request.json.get("transactionAPIId", "")

    if userId and operatorId and transactionAPIId:
        try:
            commissionDict = {}
            user_queryset = Users.objects(id=userId,status__in=[0,1]).first()
            if not user_queryset:
                data_status["result"]="Invalid user id!!"
                return data_status

            commissionId = str(user_queryset.commissionId.id)
            commissions_queryset = Commissions.objects(id=commissionId,status=1).order_by("-id").first()
            for each_record in commissions_queryset.commissionList:
                if each_record.get("operatorId") == operatorId and each_record.get("transactionAPIId") == transactionAPIId:
                    commissionDict = {
                    "operatorId": each_record.get("operatorId"),
                    "transactionAPIId": each_record.get("transactionAPIId"),
                    "chargeType": each_record.get("chargeType"),
                    "chargeValue": each_record.get("chargeValue"),
                    "commissionType": each_record.get("commissionType"),
                    "commissionValue": each_record.get("commissionValue")
                    }
            data_status["result"] = "Commissions details fetched successfully"
            data_status["responseStatus"] = 1
            data_status["commissionDict"] = commissionDict
            return data_status
        except Exception as e:
            app.logger.error(traceback.format_exc())
            data_status["result"] = "Unable to fetch commissions data!!"
            return data_status
    else:
        data_status["result"] = "Required fields are missing!!"
        return data_status


@merchants.route("/get_agents_list", methods=["POST"])
def get_agents_list():
    data_status = {"responseStatus": 0, "result": ""}
    userId = request.json.get("userId", "")

    agentsList =[]
    if userId:
        try:
            user_queryset = Users.objects(parentId=userId,status__nin=[2]).order_by("-id")
            if user_queryset:
                for each_user in user_queryset:
                    userDict = fetching_user_details(each_user)
                    agentsList.append(userDict)

            data_status["result"] = "Agents details fetched successfully"
            data_status["responseStatus"] = 1
            data_status["agentsList"] = agentsList
            return data_status
        except Exception as e:
            app.logger.error(traceback.format_exc())
            data_status["result"] = "Unable to fetch agents data!!"
            return data_status
    else:
        data_status["result"] = "Required fields are missing!!"
        return data_status



@merchants.route("/get_single_agent_details", methods=["POST"])
def get_single_agent_details():
    data_status = {"responseStatus": 0, "result": ""}
    userId = request.json.get("userId", "")
    if userId:
        try:
            user_queryset = Users.objects(id=userId,status__nin=[2]).first()
            if not user_queryset:
                data_status["result"]="Invalid user id!!"
                return data_status
            agent_dict = fetching_user_details(user_queryset)
            data_status["result"] = "Agent details fetched successfully"
            data_status["responseStatus"] = 1
            data_status["agentData"] = agent_dict
            return data_status
        except Exception as e:
            app.logger.error(traceback.format_exc())
            data_status["result"] = "Unable to fetch agent data!!"
            return data_status
    else:
        data_status["result"] = "Required fields are missing!!"
        return data_status



@merchants.route("/get_commisssion_list", methods=["POST"])
def get_commisssion_list():
    data_status = {"responseStatus": 0, "result": ""}
    userId = request.json.get("userId", "")

    commissionsList = []
    if userId:
        try:
            commissions_queryset = Commissions.objects(createdBy=userId,status__nin=[2]).order_by("-id").all()
            if commissions_queryset:
                for each_commission in commissions_queryset:
                    commissions_data = fetching_commission_details(each_commission)
                    commissionsList.append(commissions_data)
            data_status["result"] = "Commission details fetched successfully"
            data_status["responseStatus"] = 1
            data_status["commissionsList"] = commissionsList
            return data_status
        except Exception as e:
            app.logger.error(traceback.format_exc())
            data_status["result"] = "Unable to fetch commissions data!!"
            return data_status
    else:
        data_status["result"] = "Required fields are missing!!"
        return data_status

@merchants.route("/assigned_commisssions_list", methods=["POST"])
def assigned_commisssions_list():
    data_status = {"responseStatus": 0, "result": ""}
    userId = request.json.get("userId", "")

    commissionsList = []
    if userId:
        try:
            commissions_queryset = Commissions.objects(
                Q(createdBy=userId) | Q(createdBy=None),
                status__in=[1]
                ).order_by("-id").all()
            if commissions_queryset:
                for each_commission in commissions_queryset:
                    commissions_data = fetching_commission_details(each_commission)
                    commissionsList.append(commissions_data)
            data_status["result"] = "Commission details fetched successfully"
            data_status["responseStatus"] = 1
            data_status["commissionsList"] = commissionsList
            return data_status
        except Exception as e:
            app.logger.error(traceback.format_exc())
            data_status["result"] = "Unable to fetch commissions data!!"
            return data_status
    else:
        data_status["result"] = "Required fields are missing!!"
        return data_status

def fetching_operator_details(operator_queryset):
    operator_dict = {}
    try:
        operator_dict={
        "id":str(operator_queryset.id),
        "operatorName":operator_queryset.operatorName,
        "serviceId":str(operator_queryset.serviceId.id),
        "serviceName":operator_queryset.serviceId.serviceName,
        }
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return operator_dict


def fetching_transaction_api_details(transaction_api_queryset):
    transaction_api_dict = {}
    try:
        transaction_api_dict={
        "id":str(transaction_api_queryset.id),
        "apiName":transaction_api_queryset.apiName,
        "code":transaction_api_queryset.code,
        "isActive":transaction_api_queryset.isActive,
        "isUserWise":transaction_api_queryset.isUserWise,
        "transactionType":transaction_api_queryset.transactionType,
        "paramsList":transaction_api_queryset.paramsList
        }
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return transaction_api_dict

#Get Commsion Operators List API
@merchants.route("/get_commission_operators_list",methods=["POST","GET"])
def get_commission_operators_list():
    data_status = {"responseStatus": 0, "result": ""}
    operatorsList = []
    transactionApisList = []
    try:
        operators_queryset = Operators.objects(status__in=[1]).order_by("-id").all()
        for each_operator in operators_queryset:
            operator_data = fetching_operator_details(each_operator)
            operatorsList.append(operator_data)

        transaction_apis_queryset = TransactionAPI.objects(status__in=[1]).order_by("-id").all()
        for each_transaction_api in transaction_apis_queryset:
            transaction_api_data = fetching_transaction_api_details(each_transaction_api)
            transactionApisList.append(transaction_api_data)

        data_status["responseStatus"] = 1
        data_status["operatorsList"] = operatorsList
        data_status["transactionApisList"] = transactionApisList
        data_status["result"] = "Commission operators data fetched successfully"
        # return jsonify(data_status)
        return data_status
    except Exception as e:
        data_status["result"] = "Unable to fecth data"
        return data_status

def fetching_commission_details(commission_queryset):
    commissions_dict = {}
    try:
        commissions_dict = {
        "id":str(commission_queryset.id),
        "commissionName":commission_queryset.commissionName,
        # "createdOn":commission_queryset.createdOn,
        }
        if commission_queryset.createdOn:
            ist_time=commission_queryset.createdOn.replace(tzinfo=pytz.utc).astimezone(ist_timezone)
            commissions_dict["createdOn"] = ist_time.strftime("%m-%d-%Y %I:%M %p")
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return commissions_dict



#Add commission API
@merchants.route("/add_user_commission", methods=["POST"])
def add_user_commission():
    data_status = {"responseStatus": 0, "result": ""}
    userId = request.json.get("userId", "")
    commissionName = request.json.get("commissionName","")
    commissionLists = request.json.get("commissionLists",[])

    try:
        if commissionName:
            try:
                user_commission_table = Commissions(
                    commissionName = commissionName,
                    commissionList = commissionLists,
                    userType = "agent",
                    createdBy = userId,
                    createdOn = datetime.datetime.now(),
                    status = 1,
                    )
                save_table = user_commission_table.save()
                userCommissionId = str(save_table.id)

                data_status["result"] = "User commissions added successfully"
                data_status["responseStatus"] = 1
                return data_status
            except Exception as e:
                app.logger.error(traceback.format_exc())
                data_status["result"] = "Unable to add user commission"
                return data_status
        else:
            data_status["result"] = "Required fields are missing"
            return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"] = "Unable to add user commission"
        return data_status



@merchants.route("/get_single_user_commission",methods=["POST","GET"])
def get_single_user_commission():
    data_status = {"responseStatus": 0, "result": ""}
    commissionId = request.json.get("commissionId","")
    userId = request.json.get("userId","")
    commission_data ={}
    try:
        commission_queryset = Commissions.objects(
            id=commissionId,
            createdBy=userId,
            status__in=[0,1]
            ).first()
        if commission_queryset:
            # commission_data = fetching_user_commission_details(commission_queryset)

            commission_data = {
            "id":str(commission_queryset.id),
            "commissionName":commission_queryset.commissionName
            }

            modifiedCommissionsList = []
            for each_commission in commission_queryset.commissionList:
                operator_queryset = Operators.objects(id=each_commission.get("operatorId")).first()
                operatorName = operator_queryset.operatorName

                transaction_api_queryset = TransactionAPI.objects(id=each_commission.get("transactionAPIId")).first()
                apiName = transaction_api_queryset.apiName

                service_queryset = Service.objects(id=each_commission.get("serviceId")).first()
                serviceName = service_queryset.serviceName

                modifiedDict = {
                # "id":str(commission_queryset.id),
                # "commissionName":commission_queryset.commissionName,
                "operatorId":each_commission.get("operatorId"),
                "transactionAPIId":each_commission.get("transactionAPIId"),
                "serviceId":each_commission.get("serviceId"),
                "operatorName":operatorName,
                "apiName":apiName,
                "serviceName":serviceName,
                "chargeType": each_commission.get("chargeType"),
                "chargeValue": each_commission.get("chargeValue"),
                "commissionType": each_commission.get("commissionType"),
                "commissionValue": each_commission.get("commissionValue")
                }
                modifiedCommissionsList.append(modifiedDict)
            commission_data["commissionList"]=modifiedCommissionsList

        data_status["responseStatus"] = 1
        data_status["result"] = "Commission details fetched successfully"
        data_status["commissionData"] = commission_data
        return data_status

    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"] = "Unable to fetch commission details"
        return data_status

@merchants.route("/update_user_commission",methods=["POST","GET"])
def update_user_commission():
    data_status = {"responseStatus": 0, "result": ""}
    commissionId = request.json.get("commissionId","")
    userId = request.json.get("userId","")
    commissionName = request.json.get("commissionName","")
    commissionLists = request.json.get("commissionLists",[])
    # operatorIdslist = request.json.get("operatorIdslist",[])
    # chargeTypesList = request.json.get("chargeTypesList",[])
    # chargeValuesList = request.json.get("chargeValuesList",[])
    # commissionTypesList = request.json.get("commissionTypesList",[])
    # commissionValuesList = request.json.get("commissionValuesList",[])
    # transactionApiIdsList = request.json.get("transactionApiIdsList",[])

    if commissionName:
        try:
            commission_queryset = Commissions.objects(id=commissionId,createdBy=userId).first()
            if not commission_queryset:
                data_status["result"] = "Commission does not exist"
                return data_status

            # if commission_queryset:
            #     updateCommissionList = []
            #     for i in range(len(operatorslist)):
            #         operator_queryset = Operators.objects(id=operatorslist[i]).first()
            #         serviceId = str(operator_queryset.serviceId.id)
            #         commissionDict1 = {
            #             "operatorId": operatorIdslist[i],
            #             "chargeType": chargeTypesList[i],
            #             "chargeValue": chargeTypesList[i],
            #             "commissionType": commissionTypesList[i],
            #             "commissionValue": commissionValuesList[i],
            #             "transactionAPIId": transactionApiIdsList[i],
            #             "serviceId":serviceId
            #         }
            #         updateCommissionList.append(commissionDict1)

            commission_queryset.update(
                commissionName=commissionName,
                commissionList = commissionLists
                )
            data_status["result"] = "User Commissions updated successfully"
            data_status["responseStatus"] = 1
            return data_status
        except Exception as e:
            app.logger.error(traceback.format_exc())
            data_status["result"] = "Unable to update user commission!!"
            return data_status
    else:
        data_status["result"] = "The required field is missing"
        return data_status



@merchants.route("/assign_user_commission",methods=["POST","GET"])
def assign_user_commission():
    data_status = {"responseStatus": 0, "result": ""}
    commissionId = request.json.get("commissionId","")
    userId = request.json.get("userId","")
    parentId = request.json.get("parentId","") #Login user Id

    if commissionId and userId and parentId:
        try:
            user_queryset = Users.objects(id=userId,parentId=parentId).first()
            if not user_queryset:
                data_status["result"] = "User does not exist"
                return data_status
            user_queryset.update(
                commissionId=ObjectId(commissionId)
                )
            data_status["result"] = "User commissions assigned successfully"
            data_status["responseStatus"] = 1
            return data_status
        except Exception as e:
            app.logger.error(traceback.format_exc())
            data_status["result"] = "Unable to assign user commission!!"
            return data_status
    else:
        data_status["result"] = "The required field is missing"
        return data_status

@merchants.route("/payemnt_gateways_credentials_list",methods=["POST","GET"])
def payemnt_gateways_credentials_list():
    data_status = {"responseStatus": 0, "result": ""}
    transactionApisList = []
    try:
        transaction_apis_queryset = TransactionAPI.objects(transactionType="PaymentGateway",status__in=[1]).order_by("-id").all()
        for each_transaction_api in transaction_apis_queryset:
            transaction_api_data = fetching_transaction_api_details(each_transaction_api)
            transactionApisList.append(transaction_api_data)

        data_status["responseStatus"] = 1
        data_status["transactionApisList"] = transactionApisList
        data_status["result"] = "Transaction API's data fetched successfully!"
        return data_status
    except Exception as e:
        data_status["result"] = "Unable to fecth transaction api data!!"
        return data_status


@merchants.route("/get_merchant_wallet_balance", methods=["POST"])
def get_merchant_wallet_balance():
    data_status = {"responseStatus": 0, "result": ""}
    userId = request.json.get("userId", "")
    if userId:
        try:
            user_queryset = Users.objects(id=userId,status__nin=[2]).first()
            if not user_queryset:
                data_status["result"]="Invalid merchant id!!"
                return data_status

            # print(type("{:.2f}".format(float(user_queryset.walletBalance))),"***********")
            data_status["result"] = "Merchant wallet balance fetched successfully"
            data_status["responseStatus"] = 1
            data_status["walletBalance"] = formatINR("{:.2f}".format(float(user_queryset.walletBalance)))
            data_status["payoutBalance"] = formatINR("{:.2f}".format(float(user_queryset.payoutBalance)))
            data_status["usdtBalance"] = formatINR("{:.2f}".format(float(user_queryset.usdtBalance)))
            return data_status
        except Exception as e:
            app.logger.error(traceback.format_exc())
            data_status["result"] = "Unable to get merchant wallet balance!!"
            return data_status
    else:
        data_status["result"] = "Required fields are missing!!"
        return data_status

@merchants.route("/user_profile_details",methods=["POST"])
@user_required
def user_profile_details():
    data_status = {"responseStatus": 0, "result": ""}
    userId = request.json.get("userId","")
    try:
        merchant_queryset = Users.objects(id=userId).first()
        merchantDetails = fetching_user_details(merchant_queryset)

        data_status["responseStatus"] = 1
        data_status["result"] = "User profile details fetched successfull!"
        data_status["merchantDetails"] = merchantDetails
        return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"]="Unable to fetch user profile details!!"
        return data_status

@merchants.route("/payin_dashboard_details",methods=["POST"])
@user_required
def payin_dashboard_details():
    data_status = {"responseStatus": 0, "result": ""}
    userId = request.json.get("userId","")
    payInDashboardList = []
    try:
        payin_transaction_queryset = WalletTransactions.objects(userId=userId,userType='user').order_by("-createdOn").limit(10)
        for each_transaction in payin_transaction_queryset:
            payInDict = fetching_payin_details(each_transaction)
            payInDashboardList.append(payInDict)

        transactions_queryset = WalletTransactions.objects(userId=userId,userType='user').order_by("-id").all()
        totalTransactionAmount=transactions_queryset.filter(status=1,creditType="Credit").sum("amount")
        numberOfTransactions = transactions_queryset.filter(status__in=[0,1]).count()
        

        data_status["responseStatus"] = 1
        data_status["result"] = "Payin dashboard details fetched successfull!"
        data_status["payInDashboardList"] = payInDashboardList
        data_status["numberOfTransactions"] = numberOfTransactions
        data_status["totalTransactionAmount"] = formatINR("{:.2f}".format(float(totalTransactionAmount)))
        data_status["refundAmount"] = 0
        data_status["settlementAmount"] = 0
        return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"]="Unable to fetch payin dashboard details!!"
        return data_status


@merchants.route("/payout_dashboard_details",methods=["POST"])
@user_required
def payout_dashboard_details():
    data_status = {"responseStatus": 0, "result": ""}
    userId = request.json.get("userId","")
    payoutDashboardList = []
    try:
        payout_transaction_queryset = FundTransfers.objects(userId=userId,userType__nin='admin').order_by("-createdOn").limit(10)
        for each_transaction in payout_transaction_queryset:
            payOutDict = fetching_payouts_details(each_transaction)
            payoutDashboardList.append(payOutDict)

        transactions_queryset = FundTransfers.objects(userId=userId,userType__nin='admin').order_by("-id").all()
        totalTransactions = transactions_queryset.count()
        successfullTransactions = transactions_queryset.filter(status=1).count()
        processingTransactions = transactions_queryset.filter(status=2).count()
        failedTransactions = transactions_queryset.filter(status=0).count()

        data_status["responseStatus"] = 1
        data_status["result"] = "Payout dashboard details fetched successfull!"
        data_status["payoutDashboardList"] = payoutDashboardList
        data_status["totalTransactions"] = totalTransactions
        data_status["successfullTransactions"] = successfullTransactions
        data_status["processingTransactions"] = processingTransactions
        data_status["failedTransactions"] = failedTransactions
        return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"]="Unable to fetch payout dashboard details!!"
        return data_status

#OTP Generate API
@merchants.route("/generate_fundtransfer_otp",methods=["GET","POST"])
def generate_fundtransfer_otp():
    data_status = {"responseStatus": 0, "result": "","otpCheckId":""}
    userId = request.json.get("userId")
    reason = request.json.get("reason","")
    try:
        if userId and reason:
            user_queryset = Users.objects(id=userId,status__in=[1]).first()
            if user_queryset:
                phoneNumber = user_queryset.phoneNumber
                otpCode = random.randint(100000,999999)
                otp = random.randint(100000,999999)
                try:
                    smsmessage="Your Graam Pay Merchant Verification Code is "+str(otpCode)
                    send_sms(phoneNumber,smsmessage)
                except Exception as e:
                    pass
                otpcheck_queryset=OtpChecks(
                    userId=userId,
                    otpCode=str(otpCode),
                    phoneNumber=str(phoneNumber),
                    attempts=0,
                    status=0,
                    createdOn=datetime.datetime.now(),
                    otpReason=reason
                    ).save()
                otpCheckId=str(otpcheck_queryset.id)
                data_status["responseStatus"] = 1
                data_status["otpCheckId"] = otpCheckId
                data_status["result"]="Otp generated successfully"
                return data_status
            else:
                data_status["result"]="Invalid Merchant."
                return data_status
        else:
            data_status["result"]="Required fields are missing."
            return data_status      
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"]="Unable to generate OTP."
        return data_status

#OTP Generate API
@merchants.route("/resend_fundtransfer_otp",methods=["GET","POST"])
def resend_fundtransfer_otp():
    data_status = {"responseStatus": 0, "result": "","otpCheckId":""}
    userId = request.json.get("userId")
    otpCheckId = request.json.get("otpCheckId")
    try:
        if otpCheckId and userId:
            user_queryset = Users.objects(id=userId,status__in=[1]).first()
            if user_queryset:
                phoneNumber = user_queryset.phoneNumber
                otpCode = random.randint(100000,999999)
                try:
                    smsmessage="Your Apex Pay Merchant Transfer Verification Code is "+str(otpCode)
                    send_sms(phoneNumber,smsmessage)
                except Exception as e:
                    pass
                otpcheck_querryset=OtpChecks.objects(userId=str(userId),id=str(otpCheckId)).first()
                if otpcheck_querryset:
                    otpcheck_querryset.update(status=0,otpCode=str(otpCode))
                    otpCheckId=str(otpcheck_querryset.id)
                    data_status["responseStatus"] = 1
                    data_status["otpCheckId"] = otpCheckId
                    data_status["result"]="Otp generated successfully"
                    return data_status
                else:
                    data_status["result"]="Invalid Request."
                    return data_status
            else:
                data_status["result"]="Invalid Merchant."
                return data_status
        else:
            data_status["result"]="Required fields are missing."
            return data_status      
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"]="Unable to generate OTP."
        return data_status

@merchants.route("/check_fundtransfer_otp",methods=["POST"])
def check_fundtransfer_otp():
    data_status = {"responseStatus": 0, "result": ""}
    userId = request.json.get("userId","")
    otpCheckId = request.json.get("otpCheckId","")
    otpCode = request.json.get("otpCode","")
    if userId and otpCode and otpCheckId:
        try:
            user_queryset = Users.objects(id=str(userId),status__nin=[2]).first()
            if not user_queryset:
                data_status["result"]="Invalid phone number!!"
                return data_status
            if user_queryset.status == 3:
                data_status["result"]="Your account has been blocked by the admin. Please get in touch with the admin for assistance."
                return data_status
            elif user_queryset.status == 0:
                data_status["result"]="Your account is in-active please contact admin."
                return data_status
            elif user_queryset.status != 1:
                data_status["result"]="Invalid phone number!!"
                return data_status
            
            if otpCheckId!="":
                otpcheck_querryset=OtpChecks.objects(userId=str(userId),id=str(otpCheckId),status=0).first()
                if otpcheck_querryset:
                    attempts=otpcheck_querryset.attempts+1
                    if otpcheck_querryset.otpCode==otpCode:
                        otpcheck_querryset.update(status=1,attempts=attempts)
                        data_status["responseStatus"] = 1
                        data_status["result"] = "Otp validated."
                        return data_status
                    else:
                        otpcheck_querryset.update(attempts=attempts)
                        data_status["result"] = "Invalid Otp."
                        return data_status
                else:
                    data_status["result"] = "Invalid Otp."
                    return data_status
            else:
                data_status["result"] = "Invalid Otp."
                return data_status
        except Exception as e:
            app.logger.error(traceback.format_exc())
            data_status["result"]="Unable to user login!!"
            return data_status
    else:
        data_status["result"] = "Required fields are missing!!"
        return data_status

@merchants.route("/pincodes_based_address",methods=["POST"])
def pincodes_based_address():
    data_status = {"responseStatus":0,"result":""}
    addressDetails = {}
    try:
        pincode = request.json.get("pincode","")
        if not pincode:
            data_status["result"]="Required fields are missing!!"
            return data_status
        pincode_queryset = Pincodes.objects(pincode=pincode,status=1).first()
        if not pincode_queryset:
            data_status["result"]="Invalid pincode!!"
            return data_status
        addressDetails={
        "id":str(pincode_queryset.id),
        "pincode":pincode_queryset.pincode,
        "blockName":pincode_queryset.blockPoId.name,
        "blockPoId":str(pincode_queryset.blockPoId.id),
        "cityId":str(pincode_queryset.blockPoId.cityId.id),
        "cityName":pincode_queryset.blockPoId.cityId.cityName,
        "stateId":str(pincode_queryset.blockPoId.cityId.stateId.id),
        "stateName":pincode_queryset.blockPoId.cityId.stateId.stateName,
        "countryId":str(pincode_queryset.blockPoId.cityId.stateId.countryId.id),
        "countryName":pincode_queryset.blockPoId.cityId.stateId.countryId.countryName
        }
        data_status["responseStatus"]=1
        data_status["result"]="Pincode based address details fetched successfully!"
        data_status["addressDetails"]=addressDetails
        return data_status   
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"]="Unable to fetch pincode based address data!!"
        return data_status


@merchants.route("/view_all_merchant_categories",methods=["GET"])
def view_all_merchant_categories():
    data_status = {"responseStatus":0,"result":""}
    categoriesList = []
    try:
        categories_queryset = MerchantCategories.objects(isUserWise=True,status=1).order_by("-id").all()
        for each_category in categories_queryset:
            categoriesDict = {
            "id":str(each_category.id),
            "name":each_category.name,
            "categoryCode":each_category.categoryCode
            }
            categoriesList.append(categoriesDict)
        data_status["responseStatus"]=1
        data_status["result"]="Categories data fetched successfully!"
        data_status["categoriesList"]=categoriesList
        return data_status   
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"]="Unable to fetched categories data!!"
        return data_status

@merchants.route("/merchant_based_sub_categories",methods=["POST"])
def merchant_based_sub_categories():
    data_status = {"responseStatus":0,"result":""}
    categoryId = request.json.get("categoryId","")
    subCategoriesList = []
    try:
        if not categoryId:
            data_status["result"]="Required fields are missing!!"
            return data_status
        category_queryset = MerchantCategories.objects(id=categoryId,status=1).first()
        if not category_queryset:
            data_status["result"]="Invalid category id!!"
            return data_status
        subcategories_queryset = MerchantSubCategories.objects(categoryId=categoryId,status=1).order_by("-id").all()
        for each_category in subcategories_queryset:
            categoriesDict = {
            "id":str(each_category.id),
            "name":each_category.name,
            "categoryId":str(each_category.categoryId.id),
            "categoryName":each_category.categoryId.name
            }
            subCategoriesList.append(categoriesDict)
        data_status["responseStatus"]=1
        data_status["result"]="Subcategories data fetched successfully!"
        data_status["subCategoriesList"]=subCategoriesList
        return data_status   
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"]="Unable to fetched subcategories data!!"
        return data_status

@merchants.route("/view_all_patterns",methods=["GET"])
def view_all_patterns():
    data_status = {"responseStatus":0,"result":""}
    patternsList = []
    try:
        patterns_queryset = Patterns.objects(isUserWise=True,status=1).order_by("-id").all()
        for each_pattern in patterns_queryset:
            patternDict = {
            "id":str(each_pattern.id),
            "name":each_pattern.name
            }
            patternsList.append(patternDict)
        data_status["responseStatus"]=1
        data_status["result"]="Patterns data fetched successfully!"
        data_status["patternsList"]=patternsList
        return data_status   
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"]="Unable to fetched patterns data!!"
        return data_status


@merchants.route("/view_all_entities",methods=["GET"])
def view_all_entities():
    data_status = {"responseStatus":0,"result":""}
    entityTypesList = []
    try:
        entity_types_queryset = UserEntity.objects(status=1).order_by("-id").all()
        for each_entity in entity_types_queryset:
            entityTypeDict = {
            "id":str(each_entity.id),
            "name":each_entity.entityType
            }
            entityTypesList.append(entityTypeDict)
        data_status["responseStatus"]=1
        data_status["result"]="Entity types data fetched successfully!"
        data_status["entityTypesList"]=entityTypesList
        return data_status   
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"]="Unable to fetched entity types data!!"
        return data_status


@merchants.route("/merchant_aggrement_details",methods=["POST"])
@user_required
def merchant_aggrement_details():
    data_status = {"responseStatus":0,"result":""}
    userId = request.json.get("userId","")
    aggrementDict = {}
    try:
        merchant_queryset = Users.objects(id=userId,status=1).first()
        aggrementDict = {
        "id":str(merchant_queryset.id),
        "merchantName":merchant_queryset.fullName,
        "agreementAutherized":merchant_queryset.agreementAutherized
        }
        if merchant_queryset.agreementDocument:
            aggrementDict["agreementDocument"]=domain+merchant_queryset.agreementDocument
        else:
            aggrementDict["agreementDocument"]=""

        if merchant_queryset.signatureImage:
            aggrementDict["signatureImage"]=domain+merchant_queryset.signatureImage
        else:
            aggrementDict["signatureImage"]=""

        document_queryset = Documents.objects(status=1).order_by("-id").first()

        if document_queryset:
            aggrementDict["documentContent"]=document_queryset.documentContent.replace("$$NAME$$",merchant_queryset.fullName)
        else:
            aggrementDict["documentContent"]=""

        data_status["responseStatus"]=1
        data_status["result"]="Merchant aggrement data fetched successfully!"
        data_status["aggrementDocumentDetails"]=aggrementDict
        return data_status   
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"]="Unable to fetched merchant aggrement data!!"
        return data_status





  
# @merchants.route("/lyrareturnurl", methods=["POST"])
# def lyrareturnurl():
#     resultdata = {"responseStatus":0,"result":"Pending"}
#     print(request.form,"lyrareturnurl")
#     pgOrderId=request.form.get('vads_order_id')
#     charge_status=request.form.get('vads_charge_status')
#     order_queryset = WalletTransactions.objects(pgOrderId=pgOrderId,status__nin=[5]).first()
#     if order_queryset:
#         transactionId=str(order_queryset.id)
#         return redirect(url_for("merchants.lyrareturnsuccessurl",transactionId=transactionId))
#     else:
#         resultdata["result"]="Invalid Order id!!"
#     return render_template("frontend/lyrareturnpage.html",resultdata=resultdata)



    

@merchants.route("/lyra_payin_call", methods=["POST", "GET"])
def lyra_payin_call():
    try:

        get_base_url = "https://api.in.lyra.com/pg/rest/v1"
        
        
        orderId = "8465914252"
        orderInfo = "Payment for order"
        amount = 1000  
        currency = "INR"
        name = "Sai Krishna"
        phone = "+911234567890"
        email = "saikrishna@viyonafintech.com"
        
        webhook_url = "https://stg.graampay.com/api/v1/webhooks/lyrapaymentcallbackurl"
        return_url = "https://www.google.com"
        
        responsedata = lyra_payin_payment(
            get_base_url,
            orderId,
            orderInfo,
            amount,
            currency,
            name,
            phone,
            email,
            webhook_url,
            return_url
        )
        
        return responsedata
    except Exception as e:
        app.logger.error(traceback.format_exc())
        return "Error occurred"







# import csv
# import datetime
# import base64
# import traceback
# from flask import request, jsonify
# from io import StringIO

# def julian_to_date(julian_date):
#     """
#     Convert Julian date to standard date.
#     Assume Julian date starts from 1900-01-01.
#     """
#     try:
#         julian_start = datetime.datetime(1900, 1, 1)
#         delta = datetime.timedelta(days=int(julian_date))
#         return julian_start + delta
#     except ValueError as e:
#         raise ValueError(f"Invalid Julian date: {julian_date}")

# @merchants.route("/upload_csv_data", methods=["POST"])
# def upload_csv_data():
#     print("HIIIIIIIIIIIIII")
#     upload_csv_file = request.json.get("upload_csv_file", "S")
#     if not upload_csv_file:
#         return jsonify({'error': 'No file data provided'}), 400

#     try:
#         # Decode the base64 string
#         file_content = base64.b64decode(upload_csv_file).decode('utf-8')
        
#         # Use StringIO to read the string as a file object
#         csvfile = StringIO(file_content)
#         csvreader = csv.DictReader(csvfile)
        
#         userId = "667d13c17ebce740151a9437"

#         # Iterate through the CSV rows and create records
#         for row in csvreader:
#             try:
#                 adjustDate = julian_to_date(row['Adj Date'])
#                 txnDate = julian_to_date(row['Txn Date'])
#             except ValueError as e:
#                 return jsonify({'error': f'Date parsing error: {str(e)}'}), 400

#             adjustType = row['Adj Type']
#             remitter = row['Remitter']
#             beneficiaryName = row['Benefeciary']
#             reasonCode = row['Reason Code']
#             remarks = row['Remarks']
            
#             # Convert RRN to string to avoid scientific notation
#             rrn = str(int(float(row['Rrn'])))
            
#             txnAmount = row['Txn Amount']
#             adjAmount = row['Adj Amount']
#             payee = row['Payee']

#             # Assuming ChargeBacks is your model and it has a save method
#             create_chargeback_table = ChargeBacks(
#                 userId=userId,
#                 adjustDate=adjustDate,
#                 adjustType=adjustType,
#                 remitter=remitter,
#                 beneficiaryName=beneficiaryName,
#                 reasonCode=reasonCode,
#                 remarks=remarks,
#                 rrn=rrn,
#                 txnAmount=txnAmount,
#                 adjAmount=adjAmount,
#                 txnDate=txnDate,
#                 payee=payee,
#                 createdOn=datetime.datetime.now(),
#                 status=1
#             ).save()

#         return jsonify({'success': 'Data uploaded and records created successfully'}), 201

#     except Exception as e:
#         app.logger.error(traceback.format_exc())
#         return jsonify({'error': str(e)}), 500


# import csv
# import datetime
# import base64
# import traceback
# from flask import request, jsonify
# from io import StringIO

# def parse_date(date_str):
#     """
#     Parse date from string in format 'DD-MM-YYYY'.
#     """
#     try:
#         return datetime.datetime.strptime(date_str, '%d-%m-%Y')
#     except ValueError as e:
#         raise ValueError(f"Invalid date format: {date_str}")

# def clean_numeric_string(num_str):
#     """
#     Remove commas and any non-numeric characters from the string.
#     """
#     try:
#         # Remove commas and any non-numeric characters, then convert to float
#         cleaned_str = num_str.replace(',', '').replace('₹', '').replace('$', '')
#         return float(cleaned_str)
#     except ValueError as e:
#         raise ValueError(f"Invalid number format: {num_str}")

# @merchants.route("/upload_csv_data", methods=["POST"])
# def upload_csv_data():
#     print("HIIIIIIIIIIIIII")
#     upload_csv_file = request.json.get("upload_csv_file", "S")
#     if not upload_csv_file:
#         return jsonify({'error': 'No file data provided'}), 400

#     try:
#         # Decode the base64 string
#         file_content = base64.b64decode(upload_csv_file).decode('utf-8')
        
#         # Use StringIO to read the string as a file object
#         csvfile = StringIO(file_content)
#         csvreader = csv.DictReader(csvfile)
        
#         userId = "667d13c17ebce740151a9437"

#         # Iterate through the CSV rows and create records
#         for row in csvreader:
#             try:
#                 adjustDate = parse_date(row['Adj Date'])
#                 txnDate = parse_date(row['Txn Date'])
#             except ValueError as e:
#                 return jsonify({'error': f'Date parsing error: {str(e)}'}), 400

#             adjustType = row['Adj Type']
#             remitter = row['Remitter']
#             beneficiaryName = row['Benefeciary']
#             reasonCode = row['Reason Code']
#             remarks = row['Remarks']
            
#             # Convert RRN to string to avoid scientific notation
#             rrn = str(int(float(row['Rrn'].replace(',', ''))))
            
#             try:
#                 txnAmount = clean_numeric_string(row['Txn Amount'])
#                 adjAmount = clean_numeric_string(row['Adj Amount'])
#             except ValueError as e:
#                 return jsonify({'error': f'Number formatting error: {str(e)}'}), 400
            
#             payee = row['Payee']

#             # Assuming ChargeBacks is your model and it has a save method
#             create_chargeback_table = ChargeBacks(
#                 userId=userId,
#                 adjustDate=adjustDate,
#                 adjustType=adjustType,
#                 remitter=remitter,
#                 beneficiaryName=beneficiaryName,
#                 reasonCode=reasonCode,
#                 remarks=remarks,
#                 rrn=rrn,
#                 txnAmount=txnAmount,
#                 adjAmount=adjAmount,
#                 txnDate=txnDate,
#                 payee=payee,
#                 createdOn=datetime.datetime.now(),
#                 status=1
#             ).save()

#         return jsonify({'success': 'Data uploaded and records created successfully'}), 201

#     except Exception as e:
#         app.logger.error(traceback.format_exc())
#         return jsonify({'error': str(e)}), 500



# @merchants.route("/billfetchrequest", methods=["POST"])
# @user_required
# def billfetchrequest():
#     data_status = {"responseStatus":0,"result":""}
#     try:
#         userId = request.json.get("userId","")
#         payload = request.json.get("payload",{})
#         authorizationToken = request.json.get("authorizationToken","")
#         clientCode = request.json.get("clientCode","")

#         if not userId and not payload and not authorizationToken and not clientCode:
#             data_status["result"]="Required fields are missing!!"
#             return data_status

#         url = "https://nbc.payu.in/payu-nbc/v1/nbc/billfetchrequest"
#         print(payload,"PAYLOAD")
#         headers = {
#         "content-type": "application/json",
#         "authorization": "Bearer "+str(authorizationToken),
#         "clientCode": clientCode
#         }
#         print(headers,"headers")

#         payuresponse = requests.post(url, json=payload, headers=headers)
#         print(payuresponse.text,"(((((((((((((payuresponse)))))))))))))")
#         payuresponseData = json.loads(payuresponse.text)

#         data_status["responseStatus"]=1
#         data_status["result"]="Bill request data fetched successfully!"
#         data_status["payuresponseData"]=payuresponseData
#         return data_status
#     except Exception as e:
#         app.logger.error(traceback.format_exc())
#         data_status["result"]="Unable to fetch bill request data!!"
#         return data_status




