from appservices.common.util import *

payout_links = Blueprint("payout_links",__name__)

@payout_links.route("/create_payout_link",methods=["POST"])
@user_required
def create_payout_link():
    data_status = {"responseStatus":0,"result":""}
    userId = request.json.get("userId","")
    name = request.json.get("name","")
    uniqueName = request.json.get("uniqueName","")
    email = request.json.get("email","")
    mobileNumber = request.json.get("mobileNumber","")
    amount = request.json.get("amount",0)
    description = request.json.get("description","")
    linkExpDate = request.json.get("linkExpDate","")
    notifyPayee = request.json.get("notifyPayee")
    allowBankAccount = request.json.get("allowBankAccount")
    allowUPI = request.json.get("allowUPI")

    try:
        if userId and name and uniqueName and email and amount and mobileNumber and linkExpDate:
            # payout_link_queryset = PayOutLinks.objects(uniqueName__iexact=uniqueName,status__in=[0,1]).first()
            # if payout_link_queryset:
            #     data_status["result"]="The unique name is already in use!!"
            #     return data_status
            payout_link_table = PayOutLinks(
                userId=userId,
                email=email,
                name=name,
                uniqueName=uniqueName,
                mobileNumber=mobileNumber,
                amount=amount,
                description=description,
                linkExpDate=linkExpDate,
                notifyPayee=notifyPayee,
                allowBankAccount=allowBankAccount,
                allowUPI=allowUPI,
                createdOn=datetime.datetime.now(),
                status=1
                )
            save_table=payout_link_table.save()
            payOutLinkId = str(save_table.id)

            str2hash = userId+payOutLinkId
            result = hashlib.md5(str2hash.encode())
            convertMd5String = result.hexdigest()

            save_table.update(payOutLink=convertMd5String)

            data_status["responseStatus"]=1
            data_status["result"]="Payout link generated successfully!"
            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 create payout link!!"
        return data_status

@payout_links.route("/update_payout_link",methods=["POST"])
@user_required
def update_payout_link():
    data_status = {"responseStatus":0,"result":""}
    payOutLinkId = request.json.get("payOutLinkId","")
    userId = request.json.get("userId","")
    name = request.json.get("name","")
    uniqueName = request.json.get("uniqueName","")
    email = request.json.get("email","")
    mobileNumber = request.json.get("mobileNumber","")
    amount = request.json.get("amount",0)
    description = request.json.get("description","")
    linkExpDate = request.json.get("linkExpDate","")
    notifyPayee = request.json.get("notifyPayee")
    allowBankAccount = request.json.get("allowBankAccount")
    allowUPI = request.json.get("allowUPI")

    try:
        if payOutLinkId and userId and email and amount and mobileNumber and linkExpDate:
            payout_link_queryset = PayOutLinks.objects(id=payOutLinkId,userId=userId,status__in=[1]).first()
            if not payout_link_queryset:
                data_status["result"]="Invaild payout link id!!"
                return data_status
            # check_unique_name = PayOutLinks.objects(
            #     id__ne=payOutLinkId,
            #     userId=userId,uniqueName__iexact=uniqueName,status__in=[0,1]).first()
            # if check_unique_name:
            #     data_status["result"]="The unique name is already in use!!"
            #     return data_status

            payout_link_queryset.update(
                email=email,
                name=name,
                mobileNumber=mobileNumber,
                amount=amount,
                description=description,
                linkExpDate=linkExpDate,
                notifyPayee=notifyPayee,
                allowBankAccount=allowBankAccount,
                allowUPI=allowUPI
                )

            data_status["responseStatus"]=1
            data_status["result"]="Payout link updated successfully!"
            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 update payout link!!"
        return data_status

@payout_links.route("/activate_or_deactivate_payout_link_status",methods=["POST"])
@user_required
def activate_or_deactivate_payout_link_status():
    data_status = {"responseStatus":0,"result":""}
    payOutLinkId = request.json.get("payOutLinkId","")
    userId = request.json.get("userId","")

    try:
        if payOutLinkId and userId:
            payout_link_queryset = PayOutLinks.objects(id=payOutLinkId,userId=userId,status__in=[0,1]).first()
            if not payout_link_queryset:
                data_status["result"]="Invaild payout link id!!"
                return data_status

            if payout_link_queryset.status == 0:
                payout_link_queryset.update(status=1)
                data_status["result"]="Payout link status activated successfully!"
            elif payout_link_queryset.status == 1:
                payout_link_queryset.update(status=0)
                data_status["result"]="Payout link status deactivated successfully!"

            data_status["responseStatus"]=1
            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 update payout link status!!"
        return data_status

@payout_links.route("/delete_payout_link",methods=["POST"])
@user_required
def delete_payout_link():
    data_status = {"responseStatus":0,"result":""}
    payOutLinkId = request.json.get("payOutLinkId","")
    userId = request.json.get("userId","")

    try:
        if payOutLinkId and userId:
            payout_link_queryset = PayOutLinks.objects(id=payOutLinkId,userId=userId,status__in=[0,1]).first()
            if not payout_link_queryset:
                data_status["result"]="Invaild payout link id!!"
                return data_status
            payout_link_queryset.update(status=2)

            data_status["responseStatus"]=1
            data_status["result"]="Payout link deleted successfully!"
            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 delete payout link!!"
        return data_status

def fetching_payout_link_details(payout_link_queryset):
    payoutLinkDict = {}
    try:
        payoutLinkDict = {
        "id":str(payout_link_queryset.id),
        "userId":str(payout_link_queryset.userId.id),
        "userName":payout_link_queryset.userId.fullName,
        "createdOn":payout_link_queryset.createdOn.astimezone(ist_timezone).strftime("%d-%m-%Y %I:%M %p"),
        "email":payout_link_queryset.email,
        "status":payout_link_queryset.status,
        "mobileNumber":payout_link_queryset.mobileNumber,
        "notifyPayee":payout_link_queryset.notifyPayee,
        "linkExpDate":payout_link_queryset.linkExpDate,
        "description":payout_link_queryset.description,
        "payOutLink":payout_link_queryset.payOutLink,
        "allowBankAccount":payout_link_queryset.allowBankAccount,
        "allowUPI":payout_link_queryset.allowUPI,
        "name":payout_link_queryset.name,
        "uniqueName":payout_link_queryset.uniqueName,
        "amount":payout_link_queryset.amount
        }
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return payoutLinkDict

@payout_links.route("/single_view_payout_link",methods=["POST"])
@user_required
def single_view_payout_link():
    data_status = {"responseStatus":0,"result":""}
    payOutLinkId = request.json.get("payOutLinkId","")
    userId = request.json.get("userId","")

    try:
        if payOutLinkId and userId:
            payout_link_queryset = PayOutLinks.objects(id=payOutLinkId,userId=userId,status__in=[0,1]).first()
            if not payout_link_queryset:
                data_status["result"]="Invaild payout link id!!"
                return data_status

            data_status["responseStatus"]=1
            data_status["result"]="Payout link fetched data successfully!"
            data_status["payOutLinkDetails"]=fetching_payout_link_details(payout_link_queryset)
            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 fetch payout link!!"
        return data_status

@payout_links.route("/view_all_payout_links",methods=["POST"])
@user_required
def view_all_payout_links():
    data_status = {"responseStatus":0,"result":""}
    userId = request.json.get("userId","")
    search_element = request.json.get("search_element","")
    payOutLinksList=[]
    try:
        payout_links_queryset = PayOutLinks.objects(userId=userId).order_by("-id").all()
        if search_element:
            payout_links_queryset = payout_links_queryset.filter(Q(name__icontains=search_element)|Q(payOutLink=search_element))
        for each_payout_link in payout_links_queryset:
            payoutLinkDict = fetching_payout_link_details(each_payout_link)
            payOutLinksList.append(payoutLinkDict)

        data_status["responseStatus"] = 1
        data_status["result"] = "Payout links fetched data successfully!"
        data_status["payOutLinksList"] = payOutLinksList
        return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"]="Unable to fetch payout links data!!"
        return data_status

@payout_links.route("/view_payout_link_details",methods=["POST"])
def view_payout_link_details():
    data_status = {"responseStatus":0,"result":""}
    payOutLinkId = request.json.get("payOutLinkId","")

    try:
        if payOutLinkId:
            payout_link_queryset = PayOutLinks.objects(payOutLink=payOutLinkId,status__in=[0,1]).first()
            if not payout_link_queryset:
                data_status["result"]="Invaild payout link id!!"
                return data_status

            data_status["responseStatus"]=1
            data_status["result"]="Payout link fetched data successfully!"
            data_status["payOutLinkDetails"]=fetching_payout_link_details(payout_link_queryset)
            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 fetch payout link!!"
        return data_status