# from turtle import home
from auto_email.views import sendmail

import calendar
import datetime
import email
import json
import os
import random
from datetime import date, timedelta
from urllib.request import urlopen
from users.models import Institutional_user
import razorpay
import requests
import stripe
from bson import json_util
from dateutil.relativedelta import relativedelta
from django.conf import settings
from django.contrib.auth import get_user_model
from django.contrib.auth.decorators import login_required
from django.contrib.auth.models import User
from django.core.mail import EmailMessage, EmailMultiAlternatives, message
from django.core.paginator import Paginator
from django.http import HttpResponse, JsonResponse
from django.shortcuts import HttpResponse, redirect, render
from django.template.loader import render_to_string
from django.utils import timezone
from django.utils.html import strip_tags
from django.views.decorators.csrf import csrf_exempt
# from forex_python.converter import CurrencyRates
from geopy.distance import geodesic
from geopy.geocoders import Nominatim
from pymongo import MongoClient
from rest_framework import status, viewsets
from rest_framework.pagination import PageNumberPagination
from rest_framework.permissions import AllowAny, IsAuthenticated
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework_simplejwt.authentication import JWTAuthentication
from twilio.rest import Client

# from blockchain.contractInteraction import upload_subscription_to_blockchain
#from ideamall.views import commissionpayment
#from ideamall.views import payment as ideamall_script_payment
from lpp.models import MNFLPPDDatabase
# from MNF.email import mnfnsendemail, poster
from MNF.settings import RAZORPAY_KEY_ID, RAZORPAY_KEY_SECRET, BasePath
from mnfapp.models import PaymentData, centralDatabase
from mnfapp.views import *
# from relationshipmanager.models import RMDatabase
from users.models import ReferUser

# from mnfapp.views import PaymentDetails
from .models import (LifeMember, PromoCode, Refund, gift, privilegedUser,
                     privilegedUser1, refer)
from .serializers import PaymentDataSerializer, RefundSerializer
from centralizePayment.models import CentralPayment
User = get_user_model()


# Initialize Nominatim API
geolocator = Nominatim(user_agent="http")
from_email = settings.EMAIL_HOST_USER

#MongoDBUrl = "mongodb+srv://MNF:root@cluster0.gbkxi.gcp.mongodb.net/DB?retryWrites=true&w=majority"

#client = MongoClient(MongoDBUrl)
# script_id = id
#db = client["DB"]
#title = db["college_DB"].find()
#college_emaillist = []
#for i in title:
#    college_emaillist.append(i["college_email"])

# Create your views here.

# Create your views here.


# This is your real test secret API key.
# stripe.api_key = "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"
# stripe.api_key = "sk_test_51JT8ahSF9vzGWnggJT1M69LDT0Q8tCqvHzuWd9Fih5YO2guIpMpUd58swbDrJYocpQZAn3nY8k3Ymyw8QZ8dLeEF00VxfBmMWI"
stripe.api_key = settings.STRIPE_SECRET_KEY
STRIPE_PUB_KEY = settings.STRIPE_PUBLISHABLE_KEY
# keyID= "rzp_live_ZCKOJ4oKnyYgjf"
# keySecret = "exix5pSVMUhpyOYeNAqoYuS5"
# keyID = "rzp_test_6U9A7gZuno8Qz1"
# keySecret = "SrhczTH4dmrxW8SrzeqOdBSP"
# keyID = settings.RAZORPAY_KEY_ID
# keySecret = settings.RAZORPAY_KEY_SECRET


def set_payment_token(request):
    if request.user.is_superuser:
        request.session["keyID"] = settings.T_RAZORPAY_KEY_ID
        request.session["keySecret"] = settings.T_RAZORPAY_KEY_SECRET
    else:
        request.session["keyID"] = settings.RAZORPAY_KEY_ID
        request.session["keySecret"] = settings.RAZORPAY_KEY_SECRET

def get_total_months(start_date, end_date):
    months = (end_date.year - start_date.year) * 12 + (end_date.month - start_date.month)    
    return months


account_sid = settings.TWILIO_ACCOUNT_SID
auth_token = settings.TWILIO_AUTH_TOKEN
client = Client(account_sid, auth_token)
# from flask import Flask, render_template, jsonify, request

# for USD


def student(request):
    return render(request, "payments/student.html")


def valid(request):
    return render(request, "payments/validate.html")


def studentregis(request):
    # register as previlegeduser1 and redirect to homepage
    y = privilegedUser1()

    cd = centralDatabase.objects.get(user_id=request.user)
    cd.priviledgedMember = True
    cd.save()
    # lifeData = privilegedUser1.objects.filter(is_active='yes')
    # # left = 25
    # desc = ''
    # thisMonth = datetime.datetime.now().strftime('%B')
    # if lifeData:
    #     for i in lifeData:
    #         if datetime.datetime.now().month == i.dateSubscribed.month:
    #             left -= 1
    if request.method == "POST" and student_valid(request):
        plan = request.POST.get("plan")
        y.user = request.user
        y.is_active = "yes"
        if plan == "Monthly student":
            amount = "1"
            y.memberType = "normal"
            desc = "Privileged"
            y.months = 1
            y.student = True
        y.save()
    return redirect("/members-home")


def get_vistor_latlon(visitor_ip):
    ip_address = visitor_ip
    # visitor_ip_address(request)
    # URL to send the request to
    request_url = 'https://geolocation-db.com/jsonp/' + ip_address
    # Send request and decode the result
    response = requests.get(request_url)
    result = response.content.decode()
    # Clean the returned string so it just contains the dictionary data for the IP address
    result = result.split("(")[1].strip(")")
    # Convert this data into a dictionary
    result = json.loads(result)
    l_result = list(result.items())
    l_lat2 = l_result[4]
    latitude2 = l_lat2[1]
    l_lon2 = l_result[5]
    longitude2 = l_lon2[1]
    return latitude2, longitude2

@csrf_exempt
@login_required(login_url='/')
def payment(request):
    # print('In payment function')
    set_payment_token(request)
    keyID = request.session["keyID"]
    keySecret = request.session["keySecret"]
    left = 25

    lifeData = privilegedUser1.objects.filter(
        is_active="yes",
        dateSubscribed__year=datetime.datetime.now().year,
        memberType="Life Member",
    )
    desc = ""
    if lifeData:
        for i in lifeData:
            if datetime.datetime.now().month == i.dateSubscribed.month:
                left -= 1
            if left < 0:
                left = 0
                context["life_disable"] = True
                break
    context = {}
    context["monthly_member"] = settings.MONTHLY_MEMBER
    context["employ_discount"] = settings.EMPLOY_DISCOUNT
    context["yearly_member"] = settings.YEARLY_MEMBER
    context["yearly_member_additional"] = settings.YEARLY_MEMBER_ADDITIONAL
    context["life_member_additional"] = settings.LIFE_MEMBER_ADDITIONAL
    context["life_member_year"] = settings.LIFE_MEMBER_YEAR
    context["life_member"] = settings.LIFE_MEMBER
    context["employ_yearly_member"] = int(
        context["yearly_member"] * context["employ_discount"] / 100
    )
    context["employ_life_member"] = int(
        context["life_member"] * context["employ_discount"] / 100
    )
    thisMonth = datetime.datetime.now().strftime("%B")
    prev = 0
    if privilegedUser1.objects.filter(user=request.user).exists():

        delta = datetime.datetime.now(
            datetime.timezone.utc) - datetime.timedelta(days=2)
        privilegedUser1.objects.filter(
            user=request.user, is_active="no", dateSubscribed__lt=delta
        ).delete()
        # privilegedUser1.objects.filter(
        #     user=request.user, is_active='no').delete()
        if privilegedUser1.objects.filter(user=request.user, is_active="yes").exists():
            x = privilegedUser1.objects.get(user=request.user, is_active="yes")
            # x.id = privilegedUser1.objects.all().count()
            # date_now = timezone.now()
            # tmp = relativedelta(date_now, x.dateSubscribed)
            
            
            # tmp = relativedelta(today_date,x.dateSubscribed)
            # prev = tmp.years * 12 + tmp.months
            
            today_date = date.today()
            prev = get_total_months(today_date,x.dateSubscribed)
        else:
            prev = 0
    if privilegedUser1.objects.filter(user=request.user, is_active="yes").exists():
        y = privilegedUser1.objects.get(user=request.user, is_active="yes")
        if y.memberType == "Life Member":
            context["monthly_disable"] = True
            context["yearly_disable"] = True
            context["life_disable"] = True
        elif y.memberType == "yearly":
            context["monthly_disable"] = True
            context["yearly_disable"] = True
            context["life_member"] = (context["life_member"] - context["monthly_member"] * prev)
        elif y.memberType == "normal":
            context["monthly_disable"] = True
            context["life_member"] = context["life_member"] - \
                context["monthly_member"]
            context["yearly_member"] = (
                context["yearly_member"] - context["monthly_member"]
            )
    context["employ_yearly_member"] = int(
        context["yearly_member"] * context["employ_discount"] / 100
    )
    context["employ_life_member"] = int(
        context["life_member"] * context["employ_discount"] / 100
    )
    if request.method == "GET":

        user_obj = privilegedUser1.objects.get(user=request.user,is_active='yes') if privilegedUser1.objects.filter(user=request.user,is_active='yes').exists() else None

        if user_obj:
            expiry = user_obj.dateSubscribed + relativedelta(months=user_obj.months)
            context['expiry'] = expiry
            context['memberType'] = user_obj.memberType



        context["left"] = left
        context["thisMonth"] = thisMonth
        context["desc"] = desc
        context["prev"] = prev


        return render(request, "Privilege/index.html", context)
        # return render(request, "payments/payment1.html", context)
    if request.method == "POST":
        # we are taking plan wich user has selected to decide amount and description

        plan = request.POST.get("plan")
        response = {"id": "123"}
        # deciding amount and desc on the basis of plan
        if plan == "Monthly plan":
            amount = str(context["monthly_member"])
            desc = "Privileged"
        if plan == "yearly":
            amount = str(context["yearly_member"])
            desc = "Privileged"
        if plan == "Monthly special":
            amount = str(context["monthly_member"])
            desc = "Privileged"

        if plan == "yearly special":
            amount = str(context["employ_yearly_member"])
            desc = "Privileged"
        if plan == "Life":
            if request.user.is_staff:
                amount = str(context["employ_life_member"])
            else:
                amount = str(context["life_member"])
            desc = "Life"

        if Institutional_user.objects.filter(user=request.user, status="verified").exists():
            # print("caseIMdonenow")
            if plan != "Life":
                # print("caseIMdonen")
                amount = float(
                    amount) - (float(settings.IM_DISCOUNT) * float(amount) / 100)
                # print("caseIMdone")
        # request.session["PrivilegedID"] = json.loads(json_util.dumps(x.id))
        # passing plan to session for further process
        request.session["plan_purchased"] = plan
        with open(f"{basepath}/MNF/json_keys/conversionRates.json") as c:
            curr = json.load(c)
            try:
                rate = curr["rates"]["INR"]
                # c = CurrencyRates()
                # rate = c.get_rate("USD", str(currency.upper()))
            except Exception as e:
                # print("checkout error", e)
                rate = 80
        amtINR = round(float(int(amount) * rate), 2)
        # print('Country Name :::::::', request.POST.get("country"))
        # if User Country is INDIA payment will done through razorpay
        if request.POST.get("country") == "IN":
            # print('Country India::::::')
            client = razorpay.Client(auth=(keyID, keySecret))
            payment_intent = client.order.create(
                {
                    "amount": int(int(amount) * 100 * rate),
                    "currency": "INR",
                    "payment": {
                        "capture": "automatic",
                        "capture_options": {"refund_speed": "normal"},
                    },
                }
            )
            pid = payment_intent["id"]
            context["desc"] = desc
            context["amount"] = amount
            context["pid"] = pid
            context["pk"] = keyID
            context["amtINR"] = amtINR
            context["payment_intent"] = payment_intent
            context["subPlan"] = plan

            # passing amount in indian rupees, rate and months (on the basis of plan) through session
            request.session["amtINR_card_razorpay"] = amtINR
            request.session["rate"] = rate
            if plan == "Monthly plan":
                request.session["months_card_razorpay"] = 1
            if plan == "yearly":
                request.session["months_card_razorpay"] = 12
            if plan == "Monthly special":
                request.session["months_card_razorpay"] = 1
            if plan == "yearly special":
                request.session["months_card_razorpay"] = 12
            if plan == "Life":
                request.session["months_card_razorpay"] = settings.LIFE_MEMBER_YEAR * 12

            # shehzeen
            request.session['stage'] = "1"
            payobj = PaymentData()
            payobj.user_id = request.user
            payobj.stage = request.session['stage']
            payobj.save()
            request.session['payment_uuid'] = str(payobj.uuid)
            # shehzeen

            # Sending Mail
            # print('Helloooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo')

            return render(request, "payments/checkout_razorpay.html", context)
        # if User Country is other than INDIA payment will done through stripe
        else:
            customer = stripe.Customer.create(
                email=request.user.email,
            )
            payment_intent = stripe.PaymentIntent.create(
                amount=int(int(amount) * 100 * rate),
                currency="INR",
                # payment_method_types=["card"],
                automatic_payment_methods={'enabled': True},
                customer=customer.id,
                # payment_method_types=['card', 'Apple Pay', 'Google Pay']
                # automatic_payment_methods= {"enabled": True}
            )
            pid = payment_intent.id
            context["pk"] = STRIPE_PUB_KEY
            context["amtINR"] = amtINR
            context["pid"] = pid
            # This is commented for temprary usage
            context['secret_key'] = payment_intent.client_secret
            context["STRIPE_PUBLISHABLE_KEY"] = (stripe.api_key,)
            context["response"] = response
            context["left"] = left
            context["desc"] = desc
            context["thisMonth"] = thisMonth
            context["amount"] = amount
            context["subPlan"] = plan
            # passing payment id , payment type, rate and months (on the basis of plan) through session
            request.session["pid"] = pid
            request.session["ptype"] = 'subscription'

            request.session["rate"] = rate
            if plan == "Monthly plan":
                request.session["months_stripe_paymentdone"] = 1
            if plan == "yearly":
                request.session["months_stripe_paymentdone"] = 12
            if plan == "Monthly special":
                request.session["months_stripe_paymentdone"] = 1
            if plan == "yearly special":
                request.session["months_stripe_paymentdone"] = 12
            if plan == "Life":
                request.session["months_stripe_paymentdone"] = settings.LIFE_MEMBER_YEAR * 12

            # sending mail

            # subject = "Previledge MEMBER " + str(x.dateSubscribed) + "."
            # from_email = settings.EMAIL_HOST_USER
            # to = request.user.email
            # context_2 = {
            #    "Date": x.dateSubscribed,
            #    "Name": x.user.email,
            # }
            # html_content = render_to_string(
            #    "payments/event_email_template.html", context_2
            # )  # render with dynamic value
            # Strip the html tag. So people can see the pure text at least.
            # text_content = strip_tags(html_content)
            # create the email, and attach the HTML version as well.
            # msgs = EmailMultiAlternatives(subject, text_content, from_email, [to])
            # msgs.attach_alternative(html_content, "text/html")
            # msgs.send()
            # sendmail(to_email = [x.user.email],email_code = "GT6")
            request.session['stage'] = "1"
            payobj = PaymentData()
            payobj.user_id = request.user
            payobj.stage = request.session['stage']
            payobj.save()
            request.session['payment_uuid'] = str(payobj.uuid)
            return render(request, "payments/checkout.html", context)


def student_valid(request):
    if privilegedUser1.objects.filter(user=request.user).exists():
        return False
    temp_email = str(request.user.email).split("@")
    if temp_email[1] in college_emaillist:
        return True


def Gift(request):
    set_payment_token(request)
    keyID = request.session["keyID"]
    keySecret = request.session["keySecret"]
    x = gift()
    if request.method == "POST":
        listG = ""
        name = request.POST.get("Name")
        name = name[:-3]

        listN = name.split("@#$")
        email = request.POST.get("Email")
        email = email[:-3]
        listL = email.split("@#$")
        phone = request.POST.get("Phone")
        phone = phone[:-3]
        listP = phone.split("@#$")
        counting = request.POST.get("counts")
        # print("counting", counting)
        # print("typecounting", type(counting))
        # print("intcounting", int(counting))
        # listL.remove("")
        for i in range(len(listL)):
            x = gift()
            x.user = request.user
            x.name = listN[i]
            x.email = listL[i]
            x.PhoneNumber = listP[i]
            x.gift_id = str(random.randint(111111, 999999))
            x.plan = "deactivated"
            x.token = "MNF_" + str(random.randint(11111111, 99999999))
            x.save()
            listG += str(x.id) + "@#$"
        # amount = 0.8 * int(len(listL))
        amount = 0.8 * int(counting)
        request.session['gift_amount'] = amount
        with open(f"{basepath}/MNF/json_keys/conversionRates.json") as c:
            curr = json.load(c)
            try:
                rate = curr["rates"]["INR"]
                # c = CurrencyRates()
                # rate = c.get_rate("USD", str(currency.upper()))
            except Exception as e:
                # print("checkout error", e)
                rate = 80
        amtINR = round(float(amount * rate), 2)
        if request.POST.get("country") == "IN":
            # if False:
            client = razorpay.Client(auth=(keyID, keySecret))
            payment_intent = client.order.create(
                {
                    "amount": int(amtINR * 100),
                    "currency": "INR",
                    "payment": {
                        "capture": "automatic",
                        "capture_options": {"refund_speed": "normal"},
                    },
                }
            )
            pid = payment_intent["id"]
            context = {
                "pk": keyID,
                "giftId": listG,
                "amount": amount,
                "amtINR": amtINR,
                "pid": pid,
                "payment_intent": payment_intent,
            }
            request.session["giftamtINR_card_razorpay"] = amtINR
            return render(request, "payments/checkout_razorpay.html", context)
        else:
            # print("htest1")
            customer = stripe.Customer.create(
                email=request.user.email,
            )
            payment_intent = stripe.PaymentIntent.create(
                amount=int(amtINR * 100), currency="INR", automatic_payment_methods={'enabled': True}, customer=customer.id
            )
            pid = payment_intent.id
            request.session["pid"] = pid
            request.session["ptype"] = "gift"
            request.session["giftId"] = listG
            context = {
                "pk": STRIPE_PUB_KEY,
                "giftId": listG,
                "amount": amount,
                "amtINR": amtINR,
                "pid": pid,
                "secret_key": payment_intent.client_secret,
                "STRIPE_PUBLISHABLE_KEY": stripe.api_key,
            }
            return render(request, "payments/checkout.html", context)
    return redirect("/members-home")


@login_required(login_url='/')
def pcard(request):
    # print("CARDCHECKINGG1")
    if request.method == 'POST':
        # print("CARDCHECKINGG2")
        payment_intent_id = request.POST["payment_intent_id"]
        payment_method_id = request.POST["payment_method_id"]
        sub_plan = request.POST["subPlan"]
        pType = request.POST["type"]
        giftId = request.POST["giftId"]
        if giftId == "":
            giftId = None
        else:
            giftId = giftId

        customer = stripe.Customer.create(
            email=request.user.email,
            payment_method=payment_method_id,
            invoice_settings={"default_payment_method": payment_method_id},
        )
        # subscription=stripe.Subscription.create(
        #   customer = customer.id,
        #   items = [
        #     {
        #       'plan' : plan_id
        #     }
        #   ]
        # )

        stripe.PaymentIntent.modify(
            payment_intent_id, payment_method=payment_method_id, customer=customer.id
        )
        ret = stripe.PaymentIntent.confirm(payment_intent_id)
        pi = stripe.PaymentIntent.retrieve(payment_intent_id)
        # ret = stripe.Subscription.confirm(
        #   sub.id
        # )

        if ret.status == "requires_action":
            context = {
                "pk": STRIPE_PUB_KEY,
                "payment_intent_secret": pi.client_secret,
                "id": pi.id,
                "sid": "sid",
                "pType": pType,
                "giftId": giftId,
            }
            return render(request, "payments/3dsec.html", context)
        return render(request, "payments/paymentdone.html")


def getip(request):
    adr = request.META.get('HTTP_X_FORWARDED_FOR')
    if adr:
        ip = adr.split(',')[-1].strip()
    else:
        ip = request.META.get('REMOTE_ADDR')
    return ip


@login_required(login_url='/')
def card_razorpay(request):
    keyID = request.session["keyID"]
    keySecret = request.session["keySecret"]
    # print("request.POST", request.POST)
    razorpay_order_id = request.POST.get("razorpay_order_id")
    razorpay_payment_id = request.POST["razorpay_payment_id"]
    razorpay_signature = request.POST["razorpay_signature"]

    # print("---------------------------------------")
    # print("---------------------------------------")
    # print('razorpay_order_id--> ',razorpay_order_id)
    # print('razorpay_payment_id--> ',razorpay_payment_id)
    # print('razorpay_signature--> ',razorpay_signature)
    sub_plan = request.POST["subPlan"]
    pType = request.POST["type"]
    giftId = request.POST["giftId"]
    client = razorpay.Client(auth=(keyID, keySecret))
    params_dict = {
        "razorpay_order_id": razorpay_order_id,
        "razorpay_payment_id": razorpay_payment_id,
        "razorpay_signature": razorpay_signature,
    }
    if giftId:
        
        giftId = giftId[:-3]
        gid = giftId.split("@#$")
        try:

            client.utility.verify_payment_signature(params_dict)
            # print("giftId->", gid)
            # print(4 * "######thecountis->", len(gid))

            # ------Adding details to PaymentData--------
            paydetail = client.payment.fetch(razorpay_payment_id)
            user_id = request.user
            payment_id = razorpay_payment_id
            services_used = 'Gift Subscription'
            # script_info =
            total_amount = request.session["giftamtINR_card_razorpay"]
            discount = 0
            amount_charged = request.session["giftamtINR_card_razorpay"]
            # to convert from paise to rupees
            gateway_fee = paydetail['fee'] / 100
            currency = paydetail['currency']
            pay_method = paydetail['method']
            payment_status = 'Success'
            payment_gateway = 'RazorPay'
            PaymentData.objects.create(
                user_id=user_id,
                payment_id=payment_id,
                services_used=services_used,
                amount_charged=amount_charged,
                total_amount=total_amount,
                discount=discount,
                currency=currency,
                gateway_fee=gateway_fee,
                pay_method=pay_method,
                payment_status=payment_status,
                payment_gateway=payment_gateway,
            )

            for i in list(gid):
                x = gift.objects.get(id=int(i))
                x.transactionID = razorpay_payment_id
                x.chargeID = razorpay_order_id
                x.receipt = razorpay_signature
                x.payment_id = razorpay_payment_id
                x.order_id = razorpay_order_id
                x.is_paid = "yes"
                x.save()
                if x.PhoneNumber:
                    try:
                        client = Client(account_sid, auth_token)
                        message = client.messages.create(
                            body="Hi "
                            + str(x.name)
                            + ",\n "
                            + str(request.user.email).capitalize()
                            + " has gifted you an MNF one month Subscription.\n"
                            + str(request.user.email).capitalize()
                            + " wants you to join MNF and enjoy our film making services.\nPlease apply this coupon code to activate your subscription.\n"
                            + x.token
                            + "\n Happy Filming \n MyNextFilm",
                            from_=settings.TWILIO_PHONE_NUMBER,
                            to=x.PhoneNumber,
                        )
                    except:
                        pass
                subject1 = "Someone is generous to you"
                from_email = settings.EMAIL_HOST_USER
                to1 = x.email
                context1 = {
                    "username": x.name,
                    "sender": request.user.username,
                    "token": x.token,
                }
                sendmail(to_email = [to1],email_code="GT14",key_value=context1)

                ##### to sender ###
                subject2 = (
                    "Thank you for gifting MyNextFilm subscription to " + str(x.name) + ".")
                from_email = settings.EMAIL_HOST_USER
                to2 = request.user.email

                context2 = {
                    "username": x.name,
                    "User": request.user.username,
                    "token": x.token,
                }
                # sendmail(to_email=["himanshub166@gmail.com"],email_code = "IM102")
                print("###################################222222222222222222222222###########################################")
                sendmail(to_email=[to2],email_code="GT1",key_value=context2)
                # mnfnsendemail(
                #     to2, subject2, "payment/templates/payments/MR15.html", context2, from_email)
            return render(request, "payments/giftsuccess.html", {})
        except:
            subject = "Something really went wrong"
            from_email = settings.EMAIL_HOST_USER
            to = request.user.email
            context_2 = {
                "Name": request.user.email,
                "service_name": "Gift Purchase",
            }
            sendmail(to_email=[request.user.email], email_code="PM4")
            return render(request, "payments/failed.html")
    else:
        # try:
            # shehzeen
        request.session['stage'] = "2"
        p = PaymentData.objects.get(uuid=request.session['payment_uuid'])
        p.stage = request.session['stage']
        p.save()
        # shehzeen
        # client.utility.verify_payment_signature() is likely being used to verify the payment signature in the Razorpay API.
        client.utility.verify_payment_signature(params_dict)
        # print('signature:::', client.utility.verify_payment_signature(params_dict))
        # print('param dict:::', params_dict)
        # request.session['razorpay_signature']

        updateprivilege(request)

        x = privilegedUser1.objects.get(pk=request.session["PrivilegedID"])
        # x = privilegedUser1.objects.find_one({"_id":"request.session['PrivilegedID']"})
        x.chargeId = razorpay_order_id
        x.transactionId = razorpay_payment_id
        x.razorpaySign = razorpay_signature
        x.save()
        # shehzeen
        request.session['stage'] = "5"
        p = PaymentData.objects.get(uuid=request.session['payment_uuid'])
        p.stage = request.session['stage']
        p.save()
        # shehzeen
        # ----------Adding details to PaymentData------
        paydetail = client.payment.fetch(razorpay_payment_id)
        # shehzeen
        request.session['stage'] = "6"
        p = PaymentData.objects.get(uuid=request.session['payment_uuid'])
        p.stage = request.session['stage']
        p.save()
        # shehzeen
        if request.session["months_card_razorpay"] == 1:
            total_amount = round(
                (settings.MONTHLY_MEMBER * request.session["rate"]), 2)
            services_used = "Monthly Subscription"

            # subject = "ONLY A FEW IN THE WORLD ARE PRIVILEGED"
            # from_email = settings.EMAIL_HOST_USER
            to = request.user.email

            # manoj code for poster
            context_2 = {
                "Date": x.dateSubscribed,
                "Name": x.user.email,
                "member_type": x.memberType,
            }
            # mnfnsendemail(
            #     to, subject, "payment/templates/payments/MR2.html", context_2, from_email)
            sendmail(to_email=[to],email_code = "GT7",key_value=context_2)

        elif request.session["months_card_razorpay"] == 12:
            total_amount = round(
                (settings.YEARLY_MEMBER * request.session["rate"]), 2)
            services_used = "Yearly Subscription"
            subject = "THE BONDING IS NOW CLOSER"
            from_email = settings.EMAIL_HOST_USER
            to = request.user.email
            context_2 = {
                "Date": x.dateSubscribed,
                "Name": x.user.email,
                "member_type": x.memberType,
            }
            # mnfnsendemail(
            #     to, subject, "payment/templates/payments/MR3.html", context_2, from_email)
            sendmail(to_email=[to],email_code = "GT2",key_value=context_2)
        else:
            total_amount = round(
                (settings.LIFE_MEMBER * request.session["rate"]), 2)
            services_used = "Life Member Subscription"
            # print("testp2")

            '''
            #manoj
            #Add rm details to life member database
            x = LifeMemberForm()
            x.email = request.user
            x.save()
            
            Add lifemember details to rm database
            '''
            c = RMDatabase.objects.filter(is_accepted=True)
            if len(c) > 1:
                mindistance = []
                for j in c:
                    # rm latitude and longitude

                    latitude1 = j.latitude
                    longitude1 = j.longitude

                    ip = getip(request)
                    # lifemember latitude and longitude
                    latitude2, longitude2 = get_vistor_latlon(ip)
                    cust_loc = (latitude1, longitude1)
                    club_loc = (latitude2, longitude2)
                    distance = geodesic(cust_loc, club_loc).km
                    mindistance.append([distance, j])

                mindistance = sorted(mindistance, key=lambda x: x[0])
                rmuser = mindistance[0][1]
                name = rmuser.firstName + " " + rmuser.lastName
                whatsapp = rmuser.contact
                Email = rmuser.email
                rmid = rmuser.id
            elif len(c) == 1:
                name = c[0].firstName + " " + c[0].lastName
                whatsapp = c[0].contact
                Email = c[0].email
                rmuser = c[0]
                rmid = rmuser.id
            x = privilegedUser1.objects.get(
                pk=request.session["PrivilegedID"])
            # x.rmuser = rmuser.id
            x.save()
            # manoj mail
            # to lifemember
            subject = "Friendships are for lifetime."
            from_email = settings.EMAIL_HOST_USER
            to = request.user.email
            context_2 = {
                "UserName": x.user.email,
                # "RMName": name,
                "RMEmail": x.user.email,
            }
            # mnfnsendemail(
            #     to, subject, "payment/templates/payments/MR4.html", context_2, from_email)
            sendmail(to_email=[to],email_code="GT3",key_value=context_2)

            # to rm
            subject = "You have a new lifetime friend."
            from_email = settings.EMAIL_HOST_USER
            to = x.user.email
            context_2 = {
                "RMName": x.user.email,
                "lifememberName": list(request.user.email.split('@'))[0],
                "lifememberEmail": request.user.email,
            }
            # mnfnsendemail(
            #     to, subject, "payment/templates/payments/MR5.html", context_2, from_email)
            sendmail(to_email=[to],email_code = "GT4",key_value=context_2)

        user_id = request.user
        payment_id = razorpay_payment_id
        # script_info =
        amount_charged = request.session["amtINR_card_razorpay"]
        discount = round((total_amount - amount_charged), 2)
        # to convert from paise to rupees
        gateway_fee = paydetail['fee'] / 100
        currency = paydetail['currency']
        pay_method = paydetail['method']
        payment_status = 'Success'
        payment_gateway = 'RazorPay'

        # print('shehzeen 857', type(total_amount), total_amount)
        # shehzeen
        request.session['stage'] = "Final Stage"
        p = PaymentData.objects.get(uuid=request.session['payment_uuid'])
        p.stage = request.session['stage']
        p.payment_id = payment_id
        p.services_used = services_used
        p.discount = discount
        p.total_amount = total_amount
        p.amount_charged = amount_charged
        p.gateway_fee = gateway_fee
        p.currency = currency
        p.pay_method = pay_method
        p.payment_status = payment_status
        p.payment_gateway = payment_gateway
 #       p.save()
#
        # shehzeen

        # PaymentData.objects.create(
        #     user_id=user_id,
        #     payment_id=payment_id,
        #     services_used=services_used,
        #     discount=discount,
        #     total_amount=total_amount,
        #     amount_charged=amount_charged,
        #     gateway_fee=gateway_fee,
        #     currency=currency,
        #     pay_method=pay_method,
        #     payment_status=payment_status,
        #     payment_gateway=payment_gateway,
        # )
        # manoj - code to update data on blockchain
        data = privilegedUser1.objects.get(
            pk=request.session["PrivilegedID"])

        # manoj - send a confirmation mail to user who referred his/her friend to join mnf when his/her friend takes membership
        x = refer.objects.all()
        for i in x:
            if i.refer_email1 == request.user.email:
                subject = "Your dividend is on the way"
                from_email = settings.EMAIL_HOST_USER
                to = i.refer_user.email
                context_2 = {
                    "Name": i.refer_user.email,
                    "referredpeople": i.refer_email1,
                }
                # mnfnsendemail(
                #     to, subject, "payment/templates/payments/MR22.html", context_2, from_email)
                sendmail(to_email = [to],email_code="GT5",key_value=context_2)

        # print('YOU plan is::::', request.session["months_card_razorpay"])
        x = privilegedUser1.objects.get(user=request.user, is_active='yes')
        expiryDate = x.dateSubscribed + relativedelta(months=x.months)
        return render(
            request,
            "payments/success.html",
            {"pId": razorpay_payment_id, "rSign": "hello",
                'expiry': expiryDate, 'isSubscription': True},
        )

        # except (razorpay.errors.SignatureVerificationError, Exception) as E:
        #     with open("/home/user/mnf/project/MNF/subtitling3/error_check.txt","a") as f:
        #         f.write('line 955 -->'+"\n")
        #     print("----manoj786", E)
        #     subject = "Something really went wrong"
        #     from_email = settings.EMAIL_HOST_USER
        #     to = request.user.email
        #     context_2 = {
        #         "Name": request.user.email,
        #         "service_name": "Membership",
        #     }

        #     paydetail = client.payment.fetch(razorpay_payment_id)
        #     if request.session["months_card_razorpay"] == 1:
        #         total_amount = round(
        #             (settings.MONTHLY_MEMBER * request.session["rate"]), 2)
        #         services_used = "Monthly Subscription"
        #     elif request.session["months_card_razorpay"] == 12:
        #         total_amount = round(
        #             (settings.YEARLY_MEMBER * request.session["rate"]), 2)
        #         services_used = "Yearly Subscription"
        #     else:
        #         total_amount = round(
        #             (settings.LIFE_MEMBER * request.session["rate"]), 2)
        #         services_used = "Life Member Subscription"

        #     user_id = request.user
        #     payment_id = razorpay_payment_id
        #     # script_info =
        #     amount_charged = request.session["amtINR_card_razorpay"]
        #     discount = round((total_amount - amount_charged), 2)
        #     # to convert from paise to rupees
        #     gateway_fee = paydetail['fee'] / 100
        #     currency = paydetail['currency']
        #     pay_method = paydetail['method']
        #     payment_status = 'Failed'
        #     payment_gateway = 'RazorPay'

        #     #  obj = payment.objects.get(id = request.session["payment_id"])
        #     # shehzeen
        #     request.session['stage'] = 'Faild Stage'
        #     p = PaymentData.objects.get(uuid=request.session['payment_uuid'])
        #     p.stage = request.session['stage']
        #     p.payment_id = payment_id
        #     p.services_used = services_used
        #     p.discount = discount
        #     p.total_amount = total_amount
        #     p.amount_charged = amount_charged
        #     p.gateway_fee = gateway_fee
        #     p.currency = currency
        #     p.pay_method = pay_method
        #     p.payment_status = payment_status
        #     p.payment_gateway = payment_gateway
        #     p.save()
        #     # shehzeen
        #     # PaymentData.objects.create(
        #     #     user_id=user_id,
        #     #     payment_id=payment_id,
        #     #     services_used=services_used,
        #     #     discount=discount,
        #     #     total_amount=total_amount,
        #     #     amount_charged=amount_charged,
        #     #     gateway_fee=gateway_fee,
        #     #     currency=currency,
        #     #     pay_method=pay_method,
        #     #     payment_status=payment_status,
        #     #     payment_gateway=payment_gateway,
        #     # )
        #     # mnfnsendemail(to,subject,"payment/templates/payments/MR24.html",context_2,from_email)
        #     return render(request, "payments/failed.html")


@login_required(login_url='/')
@csrf_exempt
def paymentDone(request):
    print('running')
    payment_intent_id = request.session["pid"]
    # subscription = request.POST["sid"]
    pType = request.session["ptype"]
    # print('ptype:::::', pType)
    print('payment_intent_id ',payment_intent_id)
    pi = stripe.PaymentIntent.retrieve(payment_intent_id)

    print('payments details', pi)
    if pType == "subscription":
        if pi.status == "succeeded":
            # print("htest3")
            # stripe.Subscription.modify(
            #   subscription,
            #   metadata = {"status":'active'}
            # )
            updateprivilege(request)
            
            x = privilegedUser1.objects.get(
                pk=request.session["PrivilegedID"])
            x.transactionId = pi.id
            x.chargeId = pi.latest_charge
            x.currency = pi.currency
            x.status = pi.status
            # x.receipt_url = pi.charges.data[0].get("receipt_url")
            x.amount_captured = pi.amount
            x.save()

            # ------Email--
            y = privilegedUser1.objects.get(
                user=request.user, is_active="yes")
            if y.months == 1:
                subject = "ONLY A FEW IN THE WORLD ARE PRIVILEGED"
                from_email = settings.EMAIL_HOST_USER
                to = request.user.email
                context_2 = {
                    "Date": x.dateSubscribed,
                    "Name": x.user.email,
                    "member_type": x.memberType,
                }
                # mnfnsendemail(
                #     to, subject, "payment/templates/payments/MR2.html", context_2, from_email)
            elif y.months == 12:
                subject = "THE BONDING IS NOW CLOSER"
                from_email = settings.EMAIL_HOST_USER
                to = request.user.email
                context_2 = {
                    "Date": x.dateSubscribed,
                    "Name": x.user.email,
                    "member_type": x.memberType,
                }
                # mnfnsendemail(
                #     to, subject, "payment/templates/payments/MR3.html", context_2, from_email)
            else:
                c = RMDatabase.objects.filter(is_accepted=True)
                if len(c) > 1:
                    mindistance = []
                    for j in c:
                        # rm latitude and longitude

                        latitude1 = j.latitude
                        longitude1 = j.longitude

                        ip = getip(request)
                        # lifemember latitude and longitude
                        latitude2, longitude2 = get_vistor_latlon(ip)
                        cust_loc = (latitude1, longitude1)
                        club_loc = (latitude2, longitude2)
                        distance = geodesic(cust_loc, club_loc).km
                        mindistance.append([distance, j])

                    mindistance = sorted(mindistance, key=lambda x: x[0])
                    rmuser = mindistance[0][1]
                    name = rmuser.firstName + " " + rmuser.lastName
                    whatsapp = rmuser.contact
                    Email = rmuser.email
                    rmid = rmuser.id
                    # print("-------manoj728")
                    # print("harsh55544")
                    # print(name)
                    # print(whatsapp)
                    # print(Email)
                elif len(c) == 1:
                    name = c[0].firstName + " " + c[0].lastName
                    whatsapp = c[0].contact
                    Email = c[0].email
                    rmuser = c[0]
                    rmuser = c[0]
                    rmid = rmuser.id
                x = privilegedUser1.objects.get(
                    pk=request.session["PrivilegedID"])
                # x.rmuser = rmuser.id
                x.save()

                # manoj mail
                # to lifemember
                subject = "Friendships are for lifetime."
                from_email = settings.EMAIL_HOST_USER
                to = request.user.email
                context_2 = {
                    "UserName": x.user.email,
                    # "RMName": name,
                   # "RMEmail": Email,
                    #"RMwhatsapp": whatsapp,
                }
                # mnfnsendemail(
                #     to, subject, "payment/templates/payments/MR4.html", context_2, from_email)

                # to rm
                subject = "You have a new lifetime friend."
                from_email = settings.EMAIL_HOST_USER
                to = request.user.email
                context_2 = {
                    "RMName": request.user.username,
                    "lifememberName": list(request.user.email.split('@'))[0],
                    "lifememberEmail": request.user.email,
                }
                # mnfnsendemail(
                #     to, subject, "payment/templates/payments/MR5.html", context_2, from_email)

            # -----------Adding Details to payment Details--------------------------
            if request.session["months_stripe_paymentdone"] == 1:
                total_amount = round(
                    (settings.MONTHLY_MEMBER * request.session["rate"]), 2)
                services_used = "Monthly Subscription"
            elif request.session["months_stripe_paymentdone"] == 12:
                total_amount = round(
                    (settings.YEARLY_MEMBER * request.session["rate"]), 2)
                services_used = "Yearly Subscription"
            else:
                total_amount = round(
                    (settings.LIFE_MEMBER * request.session["rate"]), 2)
                services_used = "Life Member Subscription"

            user_id = request.user
            payment_id = pi["id"]
            amount_charged = pi["amount"] / 100
            discount = round(total_amount - amount_charged, 2)
            gateway_fee = pi["application_fee_amount"]
            currency = pi["currency"]
            pay_method = "Card"
            payment_status = "Success"
            payment_gateway = "Stripe"
            #PaymentData.objects.create(
             #   user_id=user_id,
              #  services_used=services_used,
               # pay_method=pay_method,
                #payment_id=payment_id,
              #  total_amount=total_amount,
               # discount=discount,
               # amount_charged=amount_charged,
               # gateway_fee=gateway_fee,
               # payment_gateway=payment_gateway,
               # currency=currency,
               # payment_status=payment_status,
            #)
            # manoj - code to update data on blockchain
            data = privilegedUser1.objects.get(
                pk=request.session["PrivilegedID"])

            # manoj - send a confirmation mail to user who referred his/her friend to join mnf when his/her friend takes membership
            xy = refer.objects.all()
            for i in xy:
                if i.refer_email1 == request.user.email:
                    subject = "Your dividend is on the way"
                    from_email = settings.EMAIL_HOST_USER
                    to = i.refer_user.email
                    context_2 = {
                        "Name": i.refer_user.email,
                        "referredpeople": i.refer_email1,
                    }
                    mnfnsendemail(
                        to, subject, "payment/templates/payments/MR22.html", context_2, from_email)

            request.session['paystatus'] = pi.status
            # request.session['razorpay_signature'] = razorpay_signature
            # request.session['razorpay_order_id'] = razorpay_order_id
            request.session['paymentId'] = payment_id
            request.session['amount'] = amount_charged
            request.session['payment_gateway'] = payment_gateway
            updatepaymentstatus(request)
            return render(
                request,
                "payments/success.html",
                {"pId": x.transactionId, "rSign": "hello"},
            )
        else:
            request.session['paystatus'] = payment_status
            # request.session['razorpay_signature'] = razorpay_signature
            # request.session['razorpay_order_id'] = razorpay_order_id
            request.session['paymentId'] = pi["id"]
            request.session['amount'] = pi["amount"] / 100
            request.session['payment_gateway'] = "Stripe"
            updatepaymentstatus(request)
            return render(request, "payments/failed.html")
    elif pType == "gift":
        # print("htest4")
        giftId = request.session["giftId"]
        giftId = giftId[:-3]
        gid = giftId.split("@#$")
        # print("giftIdforstripe->", gid)
        if pi.status == "succeeded":

            # -----------Adding Details to payment Details--------------------------

            user_id = request.user
            payment_id = pi["id"]
            services_used = "Gift Subscription"
            total_amount = pi["amount"] / 100
            discount = 0
            amount_charged = pi["amount"] / 100
            gateway_fee = pi["application_fee_amount"]
            currency = pi["currency"]
            pay_method = "Card"
            payment_status = "Success"
            payment_gateway = "Stripe"
            PaymentData.objects.create(
                user_id=user_id,
                services_used=services_used,
                pay_method=pay_method,
                payment_id=payment_id,
                amount_charged=amount_charged,
                discount=discount,
                gateway_fee=gateway_fee,
                payment_gateway=payment_gateway,
                currency=currency,
                payment_status=payment_status,
                total_amount=total_amount,
            )
            for i in list(gid):
                x = gift.objects.get(id=int(i))
                x.transactionID = pi.charges.data[0].get(
                    "balance_transaction")
                x.chargeID = pi.charges.data[0].get("id")
                x.receipt = pi.charges.data[0].get("receipt_url")
                x.is_paid = "yes"
                x.save()

                ### to reciever ###
                subject1 = "Someone is generous to you"
                from_email = settings.EMAIL_HOST_USER
                to1 = x.email
                context1 = {
                    "username": x.name,
                    "first_name": request.user.username,
                    "token": x.token,
                }
                mnfnsendemail(
                    to1, subject1, "payment/templates/payments/MR16.html", context1, from_email)

                ##### to sender ###
                subject2 = (
                    "Thank you for gifting MyNextFilm subscription to " + str(x.name) + ".")
                from_email = settings.EMAIL_HOST_USER
                to2 = request.user.email

                context2 = {
                    "username": x.name,
                    "first_name": request.user.username,
                    "token": x.token,
                }
                mnfnsendemail(
                    to2, subject2, "payment/templates/payments/MR15.html", context2, from_email)
            return render(request, "payments/giftsuccess.html", {})
    else:
        return render(request, "payments/failed.html")
    # except:
    #     return render(request, "payments/failed.html")


def pricingCalculator(request):
    context = {}
    # conversion
    context["conversion_per_page"] = settings.CONVERSION_PER_PAGE
    context["lpp_per_page"] = settings.LPP_PER_PAGE

    # narration
    context["ONE_PAGER"] = settings.ONE_PAGER
    context["LINE_BY_LINE"] = settings.LINE_BY_LINE
    context["ELEVATOR_PITCH"] = settings.ELEVATOR_PITCH
    context["SCREENPLAY_ANALYSIS1"] = settings.SCREENPLAY_ANALYSIS1
    context["SCREENPLAY_ANALYSIS2"] = settings.SCREENPLAY_ANALYSIS2
    context["SCREENPLAY_ANALYSIS3"] = settings.SCREENPLAY_ANALYSIS3
    context["SCREENPLAY_ANALYSIS4"] = settings.SCREENPLAY_ANALYSIS4
    context["CHARACTER_INTRODUCTION"] = settings.CHARACTER_INTRODUCTION
    context["CHARACTERWISE_NARATION"] = settings.CHARACTERWISE_NARATION

    # project center
    context["SCHEDULING"] = settings.SCHEDULING
    context["BUDGETING"] = settings.BUDGETING

    amount = 0
    if request.method == "POST":
        service = request.POST.get("choose_service")
        if service == "Conversion":
            conservice = request.POST.get("conversion_sub")
            numOfPage = int(request.POST.get("page"))
            if conservice == "without-llp":
                amount = context["conversion_per_page"]*numOfPage
            else:
                amount = (context["conversion_per_page"] +
                          context["lpp_per_page"])*numOfPage
            context["serviceurl"] = "conversion"
            context["serviceurl_name"] = "Convert your script"
        elif service == "Narration":
            total = 0
            numOfPage = int(request.POST.get("page"))
            narrateservice = request.POST.getlist("narration_sub")
            for i in narrateservice:
                if i == "SCREENPLAY_ANALYSIS":
                    if numOfPage <= 15:
                        total += context[i+"1"]
                    elif numOfPage <= 30:
                        total += context[i+"2"]
                    elif numOfPage <= 100:
                        total += context[i+"3"]
                    else:
                        total += context[i+"4"]
                else:
                    total = total + context[i]
            amount = total*numOfPage
            context["serviceurl"] = "Pitchnarrate1"
            context["serviceurl_name"] = "Narrate your script"
        elif service == "ProjectCenter":
            project_center_submenu = request.POST.get("project_center_name")
            # print('NAME:::::', project_center_submenu)
            num = int(request.POST.get("page"))
            # print('NUMBER:::::::', num)
            if project_center_submenu == "Scheduling":
                # print('we are in scheduling')
                if num < 20:
                    amount = 10
                else:
                    amount = num * context["SCHEDULING"]
                context["checkurl"] = "true"
                context["serviceurl"] = "/projectcenter"
                context["serviceurl_name"] = "Schedule your film"

            elif project_center_submenu == "Budgeting":
                # print('we are in budgeting')
                if num < 10:
                    amount = 10
                else:
                    amount = num * context["BUDGETING"]
                context["checkurl"] = "true"
                context["serviceurl"] = "/projectcenter"
                context["serviceurl_name"] = "Budget your film"
                # print('leaving budgeting')
        elif service == "Ideamall":
            ideamallSubmenu = request.POST.get("idea_sub")
            if ideamallSubmenu == "auction":
                project_status = request.POST.get("showcase_status")
                start_date = request.POST.get("auctionstartdate")
                end_date = request.POST.get("auctionstopdate")
                price_currency = request.POST.get("reservepricecurrency")
                price_amount = int(request.POST.get("reservepriceamount"))
                file_size = int(request.POST.get("filesize"))
                amount = ideamall_script_payment(
                    price_currency, project_status, price_amount, start_date, end_date, int(file_size))
                context["serviceurl"] = "showcase"
                context["serviceurl_name"] = "Setup your auction"

            elif ideamallSubmenu == "script":
                project_status = request.POST.get("commisioning_status")
                price_currency = request.POST.get("payforassignmentcurrent")
                price_amount = request.POST.get("payforassignmentamount")
                project_duration = int(request.POST.get("duration1"))
                publishmyproject = request.POST.get(
                    "publishmyproject", "False")
                script_purchased = request.POST.get("howmanyscriptpurchased")
                # print("manoj1180erer")
                # print(price_currency, project_duration,
                    #   project_status, price_amount, publishmyproject)
                if publishmyproject == "on":
                    publishmyproject = "True"
                amount = commissionpayment(
                    price_currency, project_duration, project_status, price_amount, publishmyproject)
                context["serviceurl"] = "commssioningpage"
                context["serviceurl_name"] = "Commission your script"

        # discount part by manoj
        total_discount_in_percentage = 0
        discount = request.POST.getlist("discount")
        additional_discount = request.POST.getlist("extra-discount")
        message = []
        if not request.user.is_anonymous:
            for disc in discount:
                if disc == "staff":
                    if request.user.is_staff:
                        if total_discount_in_percentage + 50 > 100:
                            total_discount_in_percentage = 100
                        else:
                            total_discount_in_percentage += 50
                    else:
                        message.append("You are not a staff member")

                elif disc == "partner":
                    if MNFLPPDDatabase.objects.filter(user_id=request.user).exists():
                        if total_discount_in_percentage + 5 > 100:
                            total_discount_in_percentage = 100
                        else:
                            total_discount_in_percentage += 5
                    else:
                        message.append("Your are not a Language Pair Partner")

                elif disc == "student":
                    message.append("You are not a Student")

                elif disc == "messiah":
                    if RMDatabase.objects.filter(user_id=request.user).exists():
                        if total_discount_in_percentage + 5 > 100:
                            total_discount_in_percentage = 100
                        else:
                            total_discount_in_percentage += 5
                    else:
                        message.append("Your are not a MNF Messiah")

            for ad_disc in additional_discount:
                if ad_disc == "life":
                    if privilegedUser1.objects.filter(user=request.user, is_active="yes").exists():
                        y = privilegedUser1.objects.get(
                            user=request.user, is_active="yes")
                        if y.memberType == "Life Member":
                            if total_discount_in_percentage + 20 > 100:
                                total_discount_in_percentage = 100
                            else:
                                total_discount_in_percentage += 20
                        else:
                            message.append("Your are not a life member")

                elif ad_disc == "annual":
                    if privilegedUser1.objects.filter(user=request.user, is_active="yes").exists():
                        y = privilegedUser1.objects.get(
                            user=request.user, is_active="yes")
                        if y.memberType == "yearly":
                            if total_discount_in_percentage + 10 > 100:
                                total_discount_in_percentage = 100
                            else:
                                total_discount_in_percentage += 10
                        else:
                            message.append("Your are not a yearly member")
        else:
            if discount or additional_discount:
                message.append(
                    "Please login to avail discount on final amount.")
        context["message"] = message

        with open(f"{basepath}/MNF/json_keys/conversionRates.json") as c:
            curr = json.load(c)
            try:
                rate = curr["rates"]["INR"]
            except Exception as e:
                rate = 80

        amtINR = round(float(amount * rate), 2)

        # shehzeen
        if total_discount_in_percentage > 0:  # chechking whether user has clicked for discount or not
            context['isDiscount'] = True

        total_discount_amount = round(
            (amount/100) * total_discount_in_percentage, 2)
        total_discount_amount_INR = round(
            float(total_discount_amount * rate), 2)
        final_amount = round(amount - total_discount_amount, 2)
        final_amount_INR = round(float(final_amount * rate), 2)
        # shehzeen

        context["amount"] = amount  # amount in different currencies
        context["amtINR"] = amtINR  # amount in indian rupee

        # shehzeen
        context["totalDiscount"] = total_discount_amount
        context["totalDiscountINR"] = total_discount_amount_INR
        context["finalAmount"] = final_amount
        context["finalAmountINR"] = final_amount_INR

        # shehzeen
        # print('Shehzeen1292')
        # print(total_discount_amount, total_discount_amount_INR,
            #   final_amount, final_amount_INR)

        context["service"] = service
        # print('&&&&&&&&&&&&&&&&&&&&&&', context)
        # print('shehzeen1298')
        return render(request, "payments/pricingCalculator.html", context)


def email_test(request):
    subject = "You Got a MyNextFilm gift Subscription"
    from_email = "mnfrendezvous@gmail.com"
    to = "followasad@gmail.com"
    context = {"username": "Asad", "first_name": "Param", "token": "53241"}

    html_content = render_to_string(
        "payments/email_template1.html", context
    )  # render with dynamic value
    # Strip the html tag. So people can see the pure text at least.
    text_content = strip_tags(html_content)

    # create the email, and attach the HTML version as well.
    msg = EmailMultiAlternatives(subject, text_content, from_email, [to])
    msg.attach_alternative(html_content, "text/html")
    msg.send()
    # print("sent successfully")


def updatepaymentstatus(request):
    y = privilegedUser()
    y.user = request.user
    y.paymentId = request.session['paymentId']
    y.amount = 100
    y.orderId = request.session['razorpay_order_id'] if 'razorpay_order_id' in request.session else ""
    y.razorpaySign = request.session['razorpay_signature'] if 'razorpay_signature' in request.session else ""
    y.save()

    '''
    save privilegedUser() 
    y = privilegedUser()
    y.user = request.user
    y.paymentId = request.session['paymentId']
    y.amount = request.session['amount']
    y.orderId = request.session['orderId']
    y.razorpaySign = request.session['razorpaySign']
    y.memberType= request.session['memberType']
    y.save()
    '''
    pass
    return


def updateprivilege(request):
    #  this function update privilege user's information or create new privillage user into database and returns nothing.
    # Payment success object is_active='no'
    # shehzeen
    print('line 1553 --> ',request.session.items())
    request.session['stage'] = "3"
    p = PaymentData.objects.get(uuid=request.session['payment_uuid'])
    p.stage = request.session['stage']
    p.save()
    # shehzeen
    context = {}
    context["life_member_year"] = settings.LIFE_MEMBER_YEAR
    plan = request.session["plan_purchased"]
    cd = centralDatabase.objects.get(user_id=request.user)
    cd.priviledgedMember = True
    cd.save()
    # make a dictionary to indicate plans name and there number of days repectively
    dic = {
        "normal": 1,
        "yearly": 12,
        "Life Member": 120
    }
    '''
    There are few thing we need to keep track of
    1. check whether the user is already registered or not and is_active = 'yes' in our database  
        1.1: if user exists and is_active = 'yes' then set the member type and months 
        1.2 : if user already has a plan, make sure that current plan should not be less than previous plan. eg(if user is already yearly member of mnf and he wants to buy one month plan also than user member type will remain same as previous one which is yearly but onlt 1 moth will be added to his 12 months pla , 12+1 = 13 moths , that mean now user has 13 moths of subscription plan, similarly for life memeber also.)
        1.3 : after making changes update these changes into database.
    2. if user doest not exists or not active memeber
        2.1 :  register user in dtabase with his plan, membertype and number of months
    '''

    if privilegedUser1.objects.filter(user=request.user, is_active="yes").exists():
        x = privilegedUser1.objects.get(user=request.user, is_active="yes")
        if plan == "Monthly plan":
            if dic[x.memberType] < 1:
                x.memberType = "normal"
            x.months = 1 + x.months

            sendmail([request.user.email], "PM2")

        if plan == "yearly":
            if dic[x.memberType] < 12:
                x.memberType = "yearly"
            x.months = 12 + x.months

            sendmail([request.user.email], "PM3")

        if plan == "Monthly special":
            if dic[x.memberType] < 1:
                x.memberType = "normal"
            x.months = 1 + x.months

        if plan == "yearly special":
            if dic[x.memberType] < 12:
                x.memberType = "yearly"
            x.months = 12 + x.months
        if plan == "Life":
            x.memberType = "Life Member"
            x.months = context["life_member_year"] * 12 + x.months
            sendmail([request.user.email], "PM1")
        request.session["PrivilegedID"] = json.loads(json_util.dumps(x.id))
        x.save()

    else:
        x = privilegedUser1()
        
        if privilegedUser1.objects.exists():
            lasto = privilegedUser1.objects.last() 
            x.id = int(lasto.id) + 1
        else:
            x.id = 1
        x.user = request.user
        x.is_active = "yes"
        if plan == "Monthly plan":
            x.memberType = "normal"
            x.months = 1
            sendmail([request.user.email], "PM2")
        if plan == "yearly":
            x.memberType = "yearly"
            x.months = 12
            sendmail([request.user.email], "PM3")
        if plan == "Monthly special":
            x.memberType = "normal"
            x.months = 1
        if plan == "yearly special":
            x.memberType = "yearly"
            x.months = 12
        if plan == "Life":
            x.memberType = "Life Member"
            x.months = context["life_member_year"] * 12
            sendmail([request.user.email], "PM1")
        request.session["PrivilegedID"] = json.loads(json_util.dumps(x.id))
        x.save()
    # shehzeen
    request.session['stage'] = "4"
    p = PaymentData.objects.get(uuid=request.session['payment_uuid'])
    p.stage = request.session['stage']
    p.save()
    # shehzeen
    return


def unsubscribe(request):
    # keyID= "rzp_live_ZCKOJ4oKnyYgjf"
    # keySecret = "exix5pSVMUhpyOYeNAqoYuS5"
    keyID = "rzp_test_6U9A7gZuno8Qz1"
    keySecret = "SrhczTH4dmrxW8SrzeqOdBSP"
    client = razorpay.Client(auth=(keyID, keySecret))
    if request.method == "POST":
        x = privilegedUser1.objects.get(user=request.user)
        client.subscription.cancel(x.subId, {"cancel_at_cycle_end": "1"})
        return render(request, "payments/cancelSuccess.html", {})


def referexists(request):

    already = []
    if request.method == "POST":
        for i in [
                request.POST.get("mytext1"),
                request.POST.get("mytext2"),
                request.POST.get("mytext3"),
                request.POST.get("mytext4"),
                request.POST.get("mytext5"), ]:
            if i is not None and i != "undefined":
                if User.objects.filter(email=i).exists():
                    # print("refer if condition", i)
                    already.append(i)
        val = {"context": already}

    return JsonResponse(val)


def Refer(request):
    #  from inside - after login
    if request.user.is_authenticated:

        if ReferUser.objects.filter(user=request.user).exists():
            rId = ReferUser.objects.get(user=request.user)
            # print("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&")
            # print(rId)
        else:
            y = ReferUser()
            rId = str(random.randint(111111, 999999))
            print(rId)
            y.user = request.user
            # y.user = ""
            y.referId = rId
            y.save()

        # else:
        #     rId = ReferUser.objects.get(user=request.user)
        if request.method == "POST":
            listofuser = []
            exists = []
            for i in [
                    request.POST.get("mytext1"),
                    request.POST.get("mytext2"),
                    request.POST.get("mytext3"),
                    request.POST.get("mytext4"),
                    request.POST.get("mytext5"), ]:

                if refer.objects.filter(refer_email1=str(i)).exists():
                    exists.append(i)
                if i is not None and i != "undefined" and i not in exists:
                    refer.objects.create(
                        refer_user=request.user, refer_email1=str(i))
                    listofuser.append(i)
                    subject3 = "Someone trusts you"
                    # from_email = settings.EMAIL_HOST_USER
                    to3 = i
                    if request.user.first_name and request.user.last_name:
                        sender = (
                            str(request.user.first_name)
                            + " "
                            + str(request.user.last_name)
                        )
                    else:
                        sender = request.user.email
                    context3 = {
                        "sender": sender,
                        "user": i.split("@")[0],
                        "referid": rId,
                    }
                    # mnfnsendemail(
                    #     to3, subject3, "payment/templates/payments/MR19.html", context3, from_email)
                    sendmail(to_email=[to3],email_code = "GT8",key_value = context3)
                else:
                    print('You are already exists', i)

            # sending mail to refer sender
            # print("sheehzeen1418op")
            # print(listofuser)
            context = {}
            if listofuser:
                # print("sheehzeen1420op")
                subject3 = "You have a big heart !!"
                from_email = settings.EMAIL_HOST_USER
                to3 = request.user.email
                context3 = {
                    "sender": request.user.username,
                    "listofuser": ",".join(listofuser)
                }
                if len(listofuser) > 1:
                    subject3 = "You are really marvellous"
                    # mnfnsendemail(
                    #     to3, subject3, "payment/templates/payments/MR20.html", context3, from_email)
                    sendmail(to_email=[to3],email_code="GT9",key_value= context3)
                else:
                    # mnfnsendemail(
                    #     to3, subject3, "payment/templates/payments/MR18.html", context3, from_email)
                    sendmail(to_email=[to3],email_code="GT10",key_value= context3)
                context["alreadyreferred"] = "True"
                return JsonResponse(context)

            else:
                context["alreadyreferred"] = "False"
                context["dataitems"] = exists
                return JsonResponse(context)
    else:
        if request.method == "POST":
            for i in [
                request.POST.get("mytext1"),
                request.POST.get("mytext2"),
                request.POST.get("mytext3"),
                request.POST.get("mytext4"),
                request.POST.get("mytext5"),
            ]:
                if i is not None and i != "undefined":

                    subject3 = "One of your friend has referred you to join MyNextFilm"
                    from_email = settings.EMAIL_HOST_USER
                    to3 = i
                    context3 = {
                        "sender1": "A friend of yours",
                        "sender2": "Your friend",
                        "user1": i.split("@")[0],
                        "referid": rId,
                    }
                    # if y.user == "Anonmouys":
                    #     context3['sender'] = "Anonmouys"

                    # html_content3 = render_to_string(
                    #     "payments/referred_email.html", context3
                    # )  # render with dynamic value
                    # Strip the html tag. So people can see the pure text at least.
                    # text_content3 = strip_tags(html_content3)

                    # create the email, and attach the HTML version as well.
                    # msg3 = EmailMultiAlternatives(
                    #     subject3, text_content3, from_email, [to3]
                    # )
                    # msg3.attach_alternative(html_content3, "text/html")
                    # msg3.send()
                    sendmail(to_email=[to3],email_code="GT11",key_value=context3)


            return render(
                request,
                "mnfapp/landing.html",
                {
                    "messageR": "thanks for refering your friends. You will get extra one month of our services for every 3 joinings from your referal link"
                },
            )
            # return base(request)
            # return base(request, message=True)
    return render(request, "mnfapp/landing.html", {})
    # return base(request)


def refer_landing_page(request):
    return render(
        request,
        "mnfapp/landing.html",
        {
            "messageR": "thanks for refering your friends. You will get extra one month of our services for every 3 joinings from your referal link"
        },
    )


def verifyToken(request):
    if request.method == "POST":
        # Yameen Vinchu
        # Remove whiteSpace from token
        _token = request.POST["token"]
        strip_token = _token.strip(' ')
        print(strip_token, 'strip_token')
        print('db',gift.objects.filter(token=strip_token))

        if gift.objects.filter(token=strip_token).exists():
            x = gift.objects.get(token=request.POST["token"])
            print('working --> ',x)
            if x.email == request.user.email and x.plan == "deactivated":
                x.plan = "activated"
                x.save()
                if privilegedUser1.objects.filter(user=request.user).exists():
                    y = privilegedUser1.objects.get(user=request.user)
                    y.months += 1
                    y.is_active = "yes"
                    y.save()
                else:
                    y = privilegedUser1()
                    y.id = int(privilegedUser1.objects.all().last().id)+1
                    y.months = 1
                    y.user = request.user
                    y.is_active = "yes"
                    y.save()

                    cd = centralDatabase.objects.get(user_id=request.user)
                    cd.priviledgedMember = True
                    cd.save()

                subject = "A pledge is redeemed"
                sender_email = x.user.email
                context = {
                    "Name": sender_email,
                    "claimName": x.name
                }
                # mnfnsendemail(sender_email, subject,
                #               "payment/templates/payments/MR17.html", context)
                sendmail(to_email=[sender_email],email_code="GT12",key_value=context)
                              
                # (whomtosend,titleofmail, email_template, context,from_email=settings.EMAIL_HOST_USER)

                request.session["message"] = "Gift Token Applied Successfully"
                # return render(request, 'payments/verifytoken.html', {'message': 'Gift Token Verified Successfully'})
                return redirect("base")
            else:
                return render(
                    request, "Privilege/index.html", {
                        "message2": "Invalid Token"}
                )
        else:
            return render(
                request, "Privilege/index.html", {
                    "message2": "Invalid Token"}
            )
    return render(request, "Privilege/index.html", {})


def verifyToken2(request):
    if request.method == "POST":
        # Yameen Vinchu
        # Remove whiteSpace from token
        _token = request.POST["token"]
        strip_token = _token.strip(' ')
        # print(strip_token, 'strip_token')

        if gift.objects.filter(token=strip_token).exists():
            x = gift.objects.get(token=request.POST["token"])
            # print(x)
            if x.email == request.user.email and x.plan == "deactivated":
                x.plan = "activated"
                x.save()
                if privilegedUser1.objects.filter(user=request.user).exists():
                    y = privilegedUser1.objects.get(user=request.user)
                    y.months += 1
                    y.is_active = "yes"
                    y.save()
                else:
                    y = privilegedUser1()
                    y.id = int(privilegedUser1.objects.all().last().id) + 1
                    y.months = 1
                    y.user = request.user
                    y.is_active = "yes"
                    y.save()

                    cd = centralDatabase.objects.get(user_id=request.user)
                    cd.priviledgedMember = True
                    cd.save()

                subject = "A pledge is redeemed"
                sender_email = x.user.email
                context = {
                    "Name": sender_email,
                    "claimName": x.name
                }
                # mnfnsendemail(sender_email, subject,
                #               "payment/templates/payments/MR17.html", context)
                sendmail(to_email=[sender_email], email_code="GT12", key_value=context)

                # (whomtosend,titleofmail, email_template, context,from_email=settings.EMAIL_HOST_USER)

                request.session["message"] = "Gift Token Applied Successfully"
                # return render(request, 'payments/verifytoken.html', {'message': 'Gift Token Verified Successfully'})
                return redirect("base")
            else:
                return render(
                    request, "payments/verifytoken.html", {
                        "message2": "Invalid Token"}
                )
        else:
            return render(
                request, "payments/verifytoken.html", {
                    "message2": "Invalid Token"}
            )
    return render(request, "payments/verifytoken2.html", {})

def cancel(request):
    return render(request, "payments/cancel.html", {})


def sendMail(request):
    x = privilegedUser1.objects.filter(is_active="yes")
    date_limitB = timezone.now() + relativedelta(days=7)  # 7 days later date
    date_limitA = timezone.now()  # today's date
    for i in x:
        if (i.dateSubscribed + relativedelta(months=i.months)) <= date_limitB:
            # email_message = EmailMessage(
            #     "Membership Expiry Warning",
            #     "Hi "+str(i.user.first_name) + " "+str(i.user.last_name)+",\nYour subscription for MNF Privileged Membership will be expired on "+str(i.dateSubscribed + relativedelta(months=i.months)
            #                                                                                                                                           )+".\nPlease renew your subscription of MNF Privileged Membership or Get MNF Life Membership to enjoy our services without any interuption.\nHappy Filming \n MyNextFilm",
            #     settings.EMAIL_HOST_USER,
            #     [i.user.email]
            # )
            # email_message.send()
            subject = "Membership Expiry Warning" + "."
            from_email = settings.EMAIL_HOST_USER
            to = i
            context = {
                "Name": i,
            }
            # html_content = render_to_string(
            #     "payments/email.html", context
            # )  # render with dynamic value
            # # Strip the html tag. So people can see the pure text at least.
            # text_content = strip_tags(html_content)
            # # create the email, and attach the HTML version as well.
            # msg = EmailMultiAlternatives(
            #     subject, text_content, from_email, [to])
            # msg.attach_alternative(html_content, "text/html")
            # msg.send()
            sendmail(to_email=[to],email_code="GT13",key_value=context)

    return HttpResponse("Mails has been sent successfully.")


# x=privilegedUser.objects.get(user = request.user, is_active = 'yes')
# expiryDate = x.dateSubscribed + relativedelta(months=x.months)
# context['expiry'] = expiryDate
# if timezone.now() > expiryDate:
# x.months = 0
# x.dateSubscribed = x.dateSubscribed
# x.is_active = 'no'
# x.save()
# context['dataP3'] = None


# from payment.models import PromoCode


def Promo(request):
    # print("PROMORCODERUNNING")
    PCall = PromoCode.objects.filter(status="Activated")
    for i in PCall:
        if i.ValidTill < timezone.now():
            i.status = "Deactivated"
            i.save()
    if request.method == "POST":
        code = request.POST["code"]
        subPlan = request.POST["subPlan"]
        payment_intent_id = request.POST["pid"]
        amount = round(float(request.POST["amount"]), 1)
        amtINR = round(float(request.POST["amtINR"]), 1)
        # secret_key = request.POST["secret_key"]
        desc = request.POST["desc"]
        if PromoCode.objects.filter(
            PromoCode=code, MembershipType=subPlan, status="Activated"
        ).exists():
            PC = PromoCode.objects.get(
                PromoCode=code, MembershipType=subPlan, status="Activated"
            )
            discount_factor = 1 - ((PC.Discount) / 100)
            amount = discount_factor * amount
            amtINR = round(discount_factor * amtINR, 2)
            pId = stripe.PaymentIntent.modify(
                payment_intent_id,
                amount=int(amtINR * 100),
            )
            pid = pId.id
            context = {
                "pk": STRIPE_PUB_KEY,
                "PCid": PC.id,
                "amtINR": amtINR,
                "pid": pid,
                # 'secret_key': pId.client_secret,
                "STRIPE_PUBLISHABLE_KEY": stripe.api_key,
                "desc": desc,
                "amount": amount,
                "subPlan": subPlan,
                "promo_message": "promo code applied sucessfully",
                "green": True,
            }
            return render(request, "payments/checkout.html", context)
        else:
            context = {
                "pk": STRIPE_PUB_KEY,
                "amtINR": amtINR,
                "pid": payment_intent_id,
                # 'secret_key': secret_key,
                "STRIPE_PUBLISHABLE_KEY": stripe.api_key,
                "desc": desc,
                "amount": amount,
                "subPlan": subPlan,
                "promo_message": "invalid promo code",
            }
            return render(request, "payments/checkout.html", context)


basepath = BasePath()


def custom_conversion_rate():
    url = "https://openexchangerates.org/api/latest.json?app_id=2fd4530bcb1146a9970d586e81b89a95"
    response = urlopen(url)
    data_json = json.loads(response.read())
    conversionRates = open(
        rf"{basepath}/MNF/json_keys/conversionRates.json", "w")
    conversionRates.write(json.dumps(data_json))
    conversionRates.close()
    # print("doneRate23")

# use this function to get latest conversion rate


def get_custom_conversion_rate(request):
    conversionRates = open(
        rf"{basepath}/MNF/json_keys/conversionRates.json", "r")
    rate_json = json.load(conversionRates)
    return HttpResponse(rate_json["rates"]["INR"])


def eventsMembers_paymentList(request):
    monthly_member = settings.MONTHLY_MEMBER
    yearly_member = settings.YEARLY_MEMBER
    life_member = settings.LIFE_MEMBER
    im_discount = settings.IM_DISCOUNT
    e_discount = settings.EMPLOY_DISCOUNT
    # yearly_member_add = settings.YEARLY_MEMBER_ADDITIONAL
    # life_member_add = settings.LIFE_MEMBER_ADDITIONAL
    monthly_emp = monthly_member - (monthly_member * e_discount / 100)
    yearly_emp = yearly_member - (yearly_member * e_discount / 100)
    life_emp = life_member - (life_member * e_discount / 100)

    monthly_im = monthly_member - (monthly_member * im_discount / 100)
    yearly_im = yearly_member - (yearly_member * im_discount / 100)

    monthly_im_emp = monthly_emp - (monthly_emp * monthly_im / 100)
    yearly_im_emp = yearly_emp - (yearly_emp * yearly_im / 100)

    dict = {
        "monthly_member": monthly_member,
        "yearly_member": yearly_member,
        "life_member": life_member,
        "monthly_emp": monthly_emp,
        "yearly_emp": yearly_emp,
        "life_emp": life_emp,
        "monthly_im": monthly_im,
        "yearly_im": yearly_im,
        "monthly_im_emp": monthly_im_emp,
        "yearly_im_emp": yearly_im_emp
    }

    # print("test25", dict)

    # pricesfile = open(rf"{basepath}/MNF/relationshipmanager/templates/relationshipmanager/prices.json","w")
    # pricesfile.write(json.dumps(dict))
    # pricesfile.close()
    return HttpResponse("Testing completed")


def refund(request):
    if request.user.is_staff:
        # detailslist = PaymentData.objects.all().order_by('-date')[:1]
        detailslist = PaymentData.objects.all().order_by('-date')
        serializeddata = PaymentDataSerializer(detailslist, many=True).data
        context = {
            "list": serializeddata,
        }
        # return render(request, "payments/refund.html", context)
        return JsonResponse(context)
    else:
        return HttpResponse("You are not allowed to access this resource.")


class Refunds(viewsets.ReadOnlyModelViewSet):
    authentication_classes = [JWTAuthentication]
    permission_classes = [IsAuthenticated]
    pagination_class = PageNumberPagination
    pagination_class.page_size = 15
    queryset = Refund.objects.all().order_by("-created")
    serializer_class = RefundSerializer


class Stripe_Refund_Accept_View(APIView):
    authentication_classes = [JWTAuthentication]
    permission_classes = [IsAuthenticated]

    def put(self, request, pk=None):
        # print("Running")
        refund_obj = Refund.objects.get(r_id=pk)
        # stripe.api_key="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"
        stripe.api_key = settings.STRIPE_SECRET_KEY
        try:
            refund = stripe.Refund.create(charge=refund_obj.payment_id)
            if refund.status == 'succeeded':
                refund_obj.status = "Accept"
                refund_obj.save()
                context = {
                    "message": "Refund Success!"
                }
                return Response(context, status=status.HTTP_200_OK)
            else:
                refund_obj.status = "Failed"
                refund_obj.save()
                context = {
                    "message": "Refund Failed!"
                }
                return Response(context, status=status.HTTP_200_OK)
        except Exception as error:
            return Response(status=status.HTTP_502_BAD_GATEWAY)


class Stripe_Refund_Reject_View(APIView):
    authentication_classes = [JWTAuthentication]
    permission_classes = [IsAuthenticated]

    def put(self, request, pk=None):
        refund_obj = Refund.objects.get(r_id=pk)
        refund_obj.status = "Reject"
        refund_obj.save()
        context = {
            "message": "Success!"
        }
        return Response(context, status=status.HTTP_200_OK)


class RazorPay_Refund_Accept_View(APIView):
    authentication_classes = [JWTAuthentication]
    permission_classes = [IsAuthenticated]

    def put(self, request, pk):
        refund_obj = Refund.objects.get(r_id=pk)
        client = razorpay.Client(
            auth=(RAZORPAY_KEY_ID, RAZORPAY_KEY_SECRET))
        amount = float(refund_obj.amount)  # Example decimal amount
        amount_in_cents = str(int(amount * 100))
        # print(refund_obj.payment_id)
        refund = client.payment.refund(refund_obj.payment_id, {
                                       'amount': amount_in_cents})
        if refund.get('status') == 'processed':
            refund_obj.status = "Accept"
            refund_obj.save()
            context = {"message": "Refund Success!"}
            return Response(context, status=status.HTTP_200_OK)
        else:
            refund_obj.status = "Failed"
            refund_obj.save()
            context = {"message": "Refund Failed!"}
            return Response(context, status=status.HTTP_200_OK)


class RazorPay_Refund_Reject_View(APIView):
    authentication_classes = [JWTAuthentication]
    permission_classes = [IsAuthenticated]

    def put(self, request, pk):
        refund_obj = Refund.objects.get(r_id=pk)
        refund_obj.status = "Reject"
        refund_obj.save()
        context = {"message": "Success!"}
        # return Response(context, status=status.HTTP_200_OK)
        return JsonResponse(context)


def create(request):
    user = User.objects.get(id=16)
    # print(user)
    Refund.objects.create(
        payment_method="Razorpay",
        payment_id="ececececececec",
        service_name="Subtitle",
        service_id="ececececececec",
        claimed_user=user,
        amount=200,
        reason="jfjkfhejf"
    )

    return HttpResponse("Ok")

@login_required
def refund_admin(request, id):
    if request.user.is_superuser:
        payment_object = CentralPayment.objects.get(id=id)
        if payment_object.payment_status == "refunded":
            return redirect('refpdadmin')

        try:
            gateway = payment_object.payment_gateway
            if gateway == "razorPay":
                RAZOR_KEY = settings.RAZORPAY_KEY_ID
                RAZOR_SECRET = settings.RAZORPAY_KEY_SECRET
                client = razorpay.Client(auth=(RAZOR_KEY, RAZOR_SECRET))
                razorpay_payment_instance = client.payment.fetch(payment_object.payment_id)
                amount = float(razorpay_payment_instance["amount"])
                # amount_in_cents = str(int(amount * 100))
                refund = client.payment.refund(payment_object.payment_id)
                if refund.get('status') == 'processed':
                    print("Refund Done", refund)
                    payment_object.payment_status = "refunded"
                    payment_object.save()
                    return redirect('refpdadmin')
                else:
                    print("Refund Not Done", refund)
                    payment_object.payment_status = "refunded-rejected"
                    payment_object.save()
                    return redirect('refpdadmin')
            elif gateway == "Stripe":
                amount = float(payment_object.amount_charged)
                amount_in_cents = str(int(amount * 100))
                refund = stripe.Refund.create(payment_intent=payment_object.payment_id, amount=amount_in_cents)
                if refund.status == 'succeeded':
                    print("Refund Done", refund)
                    payment_object.payment_status = "refunded"
                    payment_object.save()
                    return redirect('refpdadmin')
                else:
                    print("Refund Not Done", refund)
                    payment_object.payment_status = "refunded-rejected"
                    payment_object.save()
                    return redirect('refpdadmin')
            else:
                return redirect('refpdadmin')

        except Exception as error:
            print("Error is:", error)
            return redirect('refpdadmin')


    
def ForSomeWork(request):
    return render(request, 'payments/for_some_work.html')