import uuid
import requests
from django.shortcuts import render, get_object_or_404, redirect
from django.http import HttpResponse, JsonResponse
from .models import *
from django.contrib.auth.models import User
from django.conf import settings
from django.contrib.auth.decorators import login_required
from django.core.mail import send_mail
from random import randint
from django.template.loader import render_to_string
from django.http import HttpResponseRedirect, JsonResponse
from django.http import HttpResponse
from django.db.models import Q
from cart.cart import Cart
import json
import re
from django.views.decorators.csrf import csrf_exempt
from datetime import date
from .forms import ContactForm
from django.contrib import messages
from django.utils.timezone import now
from .coupon_service import (
    validate_and_get_coupon,
    get_cart_coupon_summary,
    apply_coupon_to_session,
    clear_coupon_from_session,
    finalize_order_coupon,
)

# send mail imports
from django.core.mail import EmailMultiAlternatives
from django.template.loader import render_to_string
from django.utils.html import strip_tags

from base64 import b64encode

# Create your views here.


def index(request):
    all_header = Header.objects.all()
    
    # Featured items (both categories and products)
    featured_cats = list(Category.objects.filter(featured=True, display=True).select_related('header').order_by('-id'))
    featured_prods = list(Product.objects.filter(popular=1, display=True).select_related('subcategory', 'subcategory__category').order_by('-id'))

    for p in featured_prods:
        p.item_url = f"/product/{p.subcategory.slug}" if p.subcategory else "/products"
    for c in featured_cats:
        c.item_url = f"/category/{c.slug}"

    featured = featured_prods + featured_cats
    if not featured:
        fallback_cats = list(Category.objects.filter(display=True).select_related('header').order_by('-id')[:8])
        for c in fallback_cats:
            c.item_url = f"/category/{c.slug}"
        featured = fallback_cats

    # Best Selling / Popular items (both categories and products)
    popular_cats = list(Category.objects.filter(is_bestselling=True, display=True).select_related('header').order_by('-id'))
    popular_prods = list(Product.objects.filter(popular=1, display=True).select_related('subcategory', 'subcategory__category').order_by('-id'))

    for p in popular_prods:
        p.item_url = f"/product/{p.subcategory.slug}" if p.subcategory else "/products"
    for c in popular_cats:
        c.item_url = f"/category/{c.slug}"

    popular = popular_prods + popular_cats
    if not popular:
        fallback_cats = list(Category.objects.filter(display=True).select_related('header').order_by('-id')[:8])
        for c in fallback_cats:
            c.item_url = f"/category/{c.slug}"
        popular = fallback_cats

    mainbanners = MainBanner.objects.filter(is_mobileview=False).order_by('-id')
    mainbanners1 = MainBanner.objects.filter(is_mobileview=True).order_by('-id')
    subbanners = SubBanner.objects.all().order_by('-id')[:1]
    navbanner = NavBanner.objects.filter().first()
    all_category = Category.objects.filter(display=True).select_related('header')
    infos = Info.objects.exclude(is_draft=True)
    error = Error.objects.all().first()
    
    distributor = False
    if request.user.is_authenticated and not request.user.is_superuser:
        user_profile = Profile.objects.filter(user=request.user).first()
        if user_profile and user_profile.distributor:
            distributor = True
            
    t = Testimonials.objects.all()
    
    context = {
        'error': error, 
        'navbanner': navbanner, 
        'mainbanners': mainbanners, 
        'mainbanners1': mainbanners1, 
        'subbanners': subbanners,
        'distributor': distributor, 
        'featured': featured, 
        'popular': popular, 
        'testimonials': t,
        'all_category': all_category,
        'all_header': all_header, 
        'infos': infos
    }
    return render(request, "mainapp/index.html", context)

def categories(request):
    # game_card = Category.objects.filter(header="Game-Card")
    # music = Category.objects.filter(header="Music")
    # ott = Category.objects.filter(header="OTT")
    # more = Category.objects.filter(header="Others")
    # topup = Category.objects.filter(header="Topup")
    all_header = Header.objects.all()
    infos = Info.objects.exclude(is_draft=True)
    featured = list(reversed(Category.objects.filter(featured=True)))
    mainbanners = list(reversed(MainBanner.objects.all()))
    subbanners = list(reversed(SubBanner.objects.all()))[:2]
    navbanner = NavBanner.objects.filter().first()
    popular = Product.objects.filter().order_by('popular')
    all_category = Category.objects.filter()
    if request.user.is_authenticated and not request.user.is_superuser:
        user, _ = Profile.objects.get_or_create(user=request.user)
        if user.distributor:
            distributor = True
        else:
            distributor = False
    else:
        distributor = False
    t = Testimonials.objects.all()

    # context = {'navbanner': navbanner, 'mainbanners': mainbanners, 'subbanners': subbanners, "game_card": game_card, "music": music,
    #            "ott": ott, "more": more, 'distributor': distributor, 'topup': topup, 'featured': featured, 'popular': popular, 'testimonials': t,'all_category':all_category}
    
    context = {'navbanner': navbanner, 'mainbanners': mainbanners, 'subbanners': subbanners, 'all_header':all_header, 'featured': featured, 'popular': popular, 'testimonials': t,'all_category':all_category, 'infos': infos}
    return render(request, "mainapp/all_categories.html", context)

    

def allproducts(request):
    # game_card = Category.objects.filter(header="Game-Card")
    # music = Category.objects.filter(header="Music")
    # ott = Category.objects.filter(header="OTT")
    # more = Category.objects.filter(header="Others")
    # topup = Category.objects.filter(header="Topup")
    all_header = Header.objects.all()
    infos = Info.objects.exclude(is_draft=True)
    mainbanners = list(reversed(MainBanner.objects.all()))
    subbanners = list(reversed(SubBanner.objects.all()))[:2]
    navbanner = NavBanner.objects.filter().first()
    popular = Product.objects.filter().order_by('popular')
    # context = {'navbanner': navbanner, 'mainbanners': mainbanners, 'subbanners': subbanners,
    #            "game_card": game_card, "music": music, "ott": ott, "more": more, "popular": popular,"topup":topup}
    
    context = {'navbanner': navbanner, 'mainbanners': mainbanners, 'subbanners': subbanners,
               "all_header":all_header, 'infos': infos}
    return render(request, "mainapp/products.html", context)


def searchkey(request):
    # game_card = Category.objects.filter(header="Game-Card")
    # music = Category.objects.filter(header="Music")
    # ott = Category.objects.filter(header="OTT")
    # more = Category.objects.filter(header="Others")
    # topup = Category.objects.filter(header="Topup")
    all_header = Header.objects.all()
    infos = Info.objects.exclude(is_draft=True)
    mainbanners = list(reversed(MainBanner.objects.all()))
    subbanners = list(reversed(SubBanner.objects.all()))[:2]
    navbanner = NavBanner.objects.filter().first()
    q = request.POST['q']
    if q:
        results = Product.objects.filter(name__icontains=q)
    else:
        results = []
    # return render(request, "mainapp/search/searchkey.html", {'navbanner': navbanner, 'mainbanners': mainbanners, 'subbanners': subbanners, "game_card": game_card, "music": music, "ott": ott, "more": more, "results": results, "q": q,"topup":topup})
    return render(request, "mainapp/search/searchkey.html", {'navbanner': navbanner, 'mainbanners': mainbanners, 'subbanners': subbanners, "results": results, "q": q, 'infos': infos})


def cart_add(request, id):
    cart = Cart(request)
    product = Product.objects.filter(id=id).first()
    if product and not product.outofstock:
        cart.add(product=product)
    try:
        cart_count = len(request.session.get('cart', {}))
    except Exception:
        cart_count = 0
    return JsonResponse({'cartitem': cart_count})


# def item_clear(request, id):
#     cart = Cart(request)
#     product = Product.objects.get(id=id)
#     cart.remove(product)
#     return redirect("cart_detail")

def item_clear(request, id):
    cart = Cart(request)
    product = Product.objects.filter(id=id).first()
    if product:
        cart.remove(product)
    applied = request.session.get('coupon')
    if applied and str(applied.get('product_id')) == str(id):
        clear_coupon_from_session(request)
    return redirect("cart_detail")


def item_increment(request, id):
    cart = Cart(request)
    product = Product.objects.filter(id=id).first()
    if product and not product.outofstock:
        cart.add(product=product)
    return redirect("cart_detail")


def item_decrement(request, id):
    try:
        cart = Cart(request)
        product = Product.objects.filter(id=id).first()
        if product:
            cart.decrement(product=product)
    except Exception:
        pass
    return redirect("cart_detail")


def cart_clear(request):
    cart = Cart(request)
    cart.clear()
    clear_coupon_from_session(request)
    return redirect("cart_detail")


# def cart_detail(request):
#     context = {}
#     # game_card = Category.objects.filter(header="Game-Card")
#     # music = Category.objects.filter(header="Music")
#     # ott = Category.objects.filter(header="OTT")
#     # more = Category.objects.filter(header="Others")
#     # topup = Category.objects.filter(header="Topup")
#     all_header = Header.objects.all()
#     mainbanners = list(reversed(MainBanner.objects.all()))
#     subbanners = list(reversed(SubBanner.objects.all()))[:2]
#     navbanner = NavBanner.objects.filter().first()
#     total = 0
#     print(request.session['cart'])
#     if request.user.is_authenticated:
#         user = Profile.objects.get(user=request.user)
#         if user.distributor:
#             distributor = True
#         else:
#             distributor = False
#     else:
#         distributor = False
#     product = Product.objects.all()
#     try:
#         ispricediscount = request.session['ispricediscount']
#         ispercentdiscount = request.session['ispercentdiscount']
#         discount = request.session['discount']
#     except:
#         ispricediscount = False
#         ispercentdiscount = False
#         discount = 0
#     request.session['showdis'] = discount
#     try:
#         temp = request.session['coupon_failed']
#         context["error_product_id"] = request.session['product_id']
#         if temp == "show":
#             showMsg = True
#         else:
#             showMsg = False
#     except:
#         showMsg = False
#     try:
#         del request.session['discount']
#     except:
#         print('no found')
#     try:
#         del request.session['coupon']
#     except:
#         print('not found')
#     try:
#         del request.session['coupon_failed']
#     except:
#         print('no session found')
#     context = {'navbanner': navbanner, 'mainbanners': mainbanners, 'subbanners': subbanners, "total": total,
#               "distributor": distributor, "product": product, "discount": discount,
#               "ispricediscount": ispricediscount, "ispercentdiscount": ispercentdiscount, "showMsg": showMsg,
#               "all_header": all_header}
#     # return render(request, 'mainapp/cart_detail.html', {'navbanner': navbanner, 'mainbanners': mainbanners, 'subbanners': subbanners, "game_card": game_card, "music": music, "ott": ott, "more": more, "total": total, "distributor": distributor, "product": product,"discount":discount,"showMsg":showMsg,"topup":topup})
#     # return render(request, 'mainapp/cart_detail.html', {'navbanner': navbanner, 'mainbanners': mainbanners, 'subbanners': subbanners, "total": total, "distributor": distributor, "product": product,"discount":discount,"ispricediscount": ispricediscount, "ispercentdiscount": ispercentdiscount, "showMsg":showMsg,"all_header":all_header})
#     return render(request, 'mainapp/cart_detail.html', context)


@csrf_exempt
def cart_detail(request):
    all_header = Header.objects.all()
    infos = Info.objects.exclude(is_draft=True)
    mainbanners = list(reversed(MainBanner.objects.all()))
    subbanners = list(reversed(SubBanner.objects.all()))[:2]
    navbanner = NavBanner.objects.filter().first()

    if request.user.is_authenticated:
        user, _ = Profile.objects.get_or_create(user=request.user)
        distributor = user.distributor
    else:
        distributor = False
        user = None

    product = Product.objects.all()
    cart_dict = request.session.get('cart', {})
    coupon_summary = get_cart_coupon_summary(request, cart_dict, is_distributor=distributor)

    try:
        payment_qr = PaymentQR.objects.filter(is_active=True).first()
        if not payment_qr:
            payment_qr = PaymentQR.objects.create(
                title="Standard Payment QR",
                image="mainapp/images/Imepayqr.jpg",
                instructions="Please scan the QR code to make payment, then upload your payment screenshot and enter your mobile/transaction ID below."
            )
    except Exception:
        payment_qr = None

    coupon_msg = request.session.pop('coupon_msg', None)
    coupon_status = request.session.pop('coupon_status', None)

    context = {
        'navbanner': navbanner,
        'mainbanners': mainbanners,
        'subbanners': subbanners,
        'all_header': all_header,
        'infos': infos,
        'product': product,
        'distributor': distributor,
        'profile': user,
        'payment_qr': payment_qr,
        'items_subtotal': coupon_summary['items_subtotal'],
        'coupon_discount': coupon_summary['coupon_discount'],
        'discounted_subtotal': coupon_summary['discounted_subtotal'],
        'processing_fee': coupon_summary['processing_fee'],
        'grand_total': coupon_summary['grand_total'],
        'applied_coupon': coupon_summary['applied_coupon'],
        'coupon_msg': coupon_msg,
        'coupon_status': coupon_status,
        # backward compatibility variables
        'discount': coupon_summary['coupon_discount'],
        'total': coupon_summary['grand_total'],
        'showMsg': (coupon_status == 'error'),
    }
    return render(request, 'mainapp/cart_detail.html', context)

def myorders(request):
    # game_card = Category.objects.filter(header="Game-Card")
    # music = Category.objects.filter(header="Music")
    # ott = Category.objects.filter(header="OTT")
    # more = Category.objects.filter(header="Others")
    # topup = Category.objects.filter(header="Topup")
    all_header = Header.objects.all()
    infos = Info.objects.exclude(is_draft=True)
    mainbanners = list(reversed(MainBanner.objects.all()))
    subbanners = list(reversed(SubBanner.objects.all()))[:2]
    navbanner = NavBanner.objects.filter().first()
    # get_result = list(reversed(UserProfile.objects.filter(user=request.user)))
    get_result = list(reversed(OrderUserProfile.objects.filter(user=request.user, order__approved=True)))
    get_prev_result = list(reversed(UserProfile.objects.filter(user=request.user)))
    
    user, _ = Profile.objects.get_or_create(user=request.user)
    # return render(request, "mainapp/allorders.html", {'navbanner': navbanner, 'mainbanners': mainbanners, 'subbanners': subbanners, "game_card": game_card, "music": music, "ott": ott, "more": more, "result": get_result, "user": user,"topup":topup})
    return render(request, "mainapp/allorders.html", {'navbanner': navbanner, 'mainbanners': mainbanners, 'subbanners': subbanners, "all_header":all_header,"result": get_result, "prev_result": get_prev_result, "user": user, 'infos': infos})


def profile(request):
    # game_card = Category.objects.filter(header="Game-Card")
    # music = Category.objects.filter(header="Music")
    # ott = Category.objects.filter(header="OTT")
    # more = Category.objects.filter(header="Others")
    # topup = Category.objects.filter(header="Topup")
    all_header = Header.objects.all()
    infos = Info.objects.exclude(is_draft=True)
    mainbanners = list(reversed(MainBanner.objects.all()))
    subbanners = list(reversed(SubBanner.objects.all()))[:2]
    navbanner = NavBanner.objects.filter().first()
    user, _ = Profile.objects.get_or_create(user=request.user)
    if request.method == "POST":
        if 'img' in request.FILES:
            img_file = request.FILES['img']
            ext = os.path.splitext(img_file.name)[1].lower()
            if ext in ['.jpg', '.jpeg', '.png', '.webp', '.gif']:
                user.image = img_file
            else:
                messages.error(request, "Only valid image files (JPG, PNG, WEBP, GIF) are allowed.")
        user.user.first_name = request.POST['first_name']
        user.user.last_name = request.POST['last_name']
        user.user.email = request.POST['email']
        # user.phone = request.POST['phone_number']
        if request.POST['password'] == "":
            print('do nothing')
        else:
            tmp = request.user
            tmp.set_password(request.POST['password'])
            tmp.save()
        try:
            user.save()
            user.user.save()
        except Exception as e:
            print(e)

    # return render(request, "mainapp/profile.html", {'navbanner': navbanner, 'mainbanners': mainbanners, 'subbanners': subbanners, "game_card": game_card, "music": music, "ott": ott, "more": more, "user": user,"topup":topup})
    return render(request, "mainapp/profile.html", {'navbanner': navbanner, 'mainbanners': mainbanners, 'subbanners': subbanners, "user": user,'all_header':all_header, 'infos': infos})


# @login_required(login_url="/accounts/login")
# def checkout(request):
#     if request.user.is_authenticated:
#         total = 0
#         khalti_amount = 0
#         for key in request.session['cart']:
#             total += int(request.session['cart'][key]['quantity'])*float(request.session['cart'][key]['price'])
#             khalti_amount = total*100
#         allproducts = []
#         for key in request.session['cart']:
#             product = Product.objects.get(name=request.session['cart'][key]['name'])
#             allproducts.append(product)
#         if request.method == "POST":
#             try:
#                 for o in OrderItem.objects.all():
#                     if o.product.name+"-destination_one" in request.POST.keys():
#                         o.destination_one = request.POST[o.product.name+"-destination_one"]
#                         o.save()

#                 for o in OrderItem.objects.all():
#                     if o.product.name+"-destination_two" in request.POST.keys():
#                         o.destination_two = request.POST[o.product.name+"-destination_two"]
#                         o.save()
#                 ################################################################
#                 #################### Send Codes to User Mail####################
#                 ################################################################
#                 for o in OrderItem.objects.filter(product__is_details=False):
#                     temp = SerialCode.objects.filter(category__name=o.product.category.name,status="Active")
#                     limiter = o.quantity
#                     limiter = int(limiter)
#                     for s in temp[:limiter]:
#                         u = UserProfile.objects.create(user=request.user,code=s.serial_key,category=s.category.name)
#                         u.save()
#                         s.status = "Used"
#                         s.save()


#                 cart = Cart(request)
#                 cart.clear()
#                 return render(request,"mainapp/show.html",{"status":"success"})


#             except Exception as e:
#                 return render(request,"mainapp/show.html",{"status":"failed"})


#         return render(request,"mainapp/checkout.html",{"products":allproducts,"total":khalti_amount,"ad":SubBanner.objects.first()})
#     else:
#         return redirect("cart_detail")

# @csrf_exempt
# def verify_payment(request):
#     data = request.POST
#     product_id = data['product_identity']
#     token = data['token']
#     amount = data['amount']
#     url = "https://khalti.com/api/v2/payment/verify"
#     payload = {
#         "token":token,
#         "amount":amount
#     }
#     headers = {
#         "Authorization":"Key test_secret_key_cf63e83cc9b842ff9d9edd98e78db327"
#     }
#     response = requests.post(url,payload,headers=headers)
#     response_data = json.loads(response.text)
#     status_code = str(response.status_code)

#     if status_code == '400':
#         response = JsonResponse({'status':'false','message':response_data['detail']},status=500)
#         return response

#     import pprint
#     pp = pprint.PrettyPrinter(indent=4)
#     pp.pprint(response_data)
#     newOrder = Order.objects.create(username=request.user,Amount=100,item_length=len(request.session['cart']))
#     newOrder.save()
#     grabber = Order.objects.get(id=newOrder.id)
#     for key in request.session['cart']:
#         a = OrderItem.objects.create(product=Product.objects.get(name=request.session['cart'][key]['name']),order=grabber,quantity=request.session['cart'][key]['quantity'])
#         a.save()
#     return JsonResponse(f"Payment Successfully Completed. IDX received : {response_data}",safe=False)

# # def test(request):
# #     newOrder = Order.objects.create(username=request.user,Amount=100,item_length=len(request.session['cart']))
# #     newOrder.save()
# #     grabber = Order.objects.get(id=newOrder.id)
# #     for key in request.session['cart']:
# #         a = OrderItem.objects.create(product=Product.objects.get(name=request.session['cart'][key]['name']),order=grabber,quantity=request.session['cart'][key]['quantity'])
# #         a.save()


# def myprofile(request):
#     print(request.user.username)
#     get_result = User.objects.get(username=request.user)
#     if request.method == "POST":
#         fname = request.POST['first_name']
#         lname = request.POST['last_name']
#         email = request.POST['email']
#         phone = request.POST['phone']
#         password = request.POST['res_password']
#         try:
#             image = request.POST['img']
#         finally:
#             get_result.first_name = fname
#             get_result.last_name = lname
#             get_result.email = email
#             # get_result.set_password(password)
#             get_result.save()
#             u = UserShowProfile.objects.create(
#                 user=request.user, phone=phone, image=image)
#             u.save()
#     return render(request,"mainapp/update-profile.html",{"result":get_result})




import random
def verifycontact(request):

    user = User.objects.get(id=request.user.id)
    profile = Profile.objects.get(user=user)
    if profile.is_verified and profile.phone==request.POST['phone']:
        return redirect('profile')
    else:
        if request.method == "POST":
            authtoken = 'd6659feed3e4be823efbfd90e0aa97bca9b889f5989ffea8cdaa8583a99040a8'
            phone = request.POST['phone']
            profile.phone = phone
            profile.save()
            number = random.randint(1111, 9999)
            request.session['verification_code'] = number
            r = requests.post(
                "https://sms.aakashsms.com/sms/v3/send/",
                data={ "auth_token": authtoken,
                      'to': phone,
                      'text': 'Dear User, Your Verification Code for XYgame is: '+str(number)})
            status_code = r.status_code
            response = r.text
            response_json = r.json()
            print(status_code, response, response_json)
            print(request.session['verification_code'])
            if status_code == 200:
                return render(request, 'mainapp/contact_verification.html')
            else:
                return redirect('profile')
    return render(request, 'mainapp/contact_verification.html')


def verifyphone(request, id):

    sentcode = request.session['verification_code']

    user = User.objects.get(id=id)
    profile = Profile.objects.get(user=user)
    code = int(request.POST['code'])
    if code == sentcode:
        profile.is_verified = True
        profile.save()
        messages.success(request, "Contact info verified.")
        return redirect('profile')
    else:
        msg = "The code you entered is wrong."
        return render(request, 'mainapp/contact_verification.html', {'msg':msg})





def category(request, category_slug):
    all_header = Header.objects.all()
    infos = Info.objects.exclude(is_draft=True)
    cat = Category.objects.get(slug=category_slug)
    all = SubCategory.objects.filter(category__id=cat.id)
    mainbanners = list(reversed(MainBanner.objects.all()))
    subbanners = list(reversed(SubBanner.objects.all()))[:2]
    navbanner = NavBanner.objects.filter().first()
    total = len(all)
    # return render(request, "mainapp/category.html", {'navbanner': navbanner, 'mainbanners': mainbanners, 'subbanners': subbanners, "game_card": game_card, "music": music, "ott": ott, "more": more, "all": all, "category": cat.name,"total":total,"topup":topup})
    return render(request, "mainapp/category.html", {'navbanner': navbanner, 'mainbanners': mainbanners, 'subbanners': subbanners, "all_header":all_header, "all": all, "category": cat.name,"total":total, 'infos': infos})


def product(request, subcategory):
    # game_card = Category.objects.filter(header="Game-Card")
    # music = Category.objects.filter(header="Music")
    # ott = Category.objects.filter(header="OTT")
    # more = Category.objects.filter(header="Others")
    # topup = Category.objects.filter(header="Topup")
    all_header = Header.objects.all()
    infos = Info.objects.exclude(is_draft=True)
    mainbanners = list(reversed(MainBanner.objects.all()))
    subbanners = list(reversed(SubBanner.objects.all()))[:2]
    navbanner = NavBanner.objects.filter().first()
    if subcategory == "custom-all":
        all = list(reversed(Product.objects.all()))
        subcategory= "Products"
        category="All"
    else:
        subcategory = SubCategory.objects.get(slug=subcategory)
        all = Product.objects.filter(subcategory__id=subcategory.id)
        category = subcategory.category
        subcategory = subcategory.name

    if request.user.is_authenticated and not request.user.is_superuser:
        user, _ = Profile.objects.get_or_create(user=request.user)
        if user.distributor:
            distributor = True
        else:
            distributor = False
    else:
        distributor = False
    total = len(all)
    # context = {'subcategory': subcategory, 'navbanner': navbanner,
    #            'mainbanners': mainbanners, 'subbanners': subbanners,
    #            "game_card": game_card,
    #            "music": music, "ott": ott, "more": more,
    #            "all": all, 'distributor': distributor,"category":category,"total":total,"topup":topup}

    context = {'subcategory': subcategory, 'navbanner': navbanner,
               'mainbanners': mainbanners, 'subbanners': subbanners,
               "all": all, 'distributor': distributor,"category":category,"total":total,'all_header':all_header, 'infos': infos}

    return render(request, "mainapp/products.html", context)


def getdprice(request, id):
    p = Product.objects.get(id=id)
    q = request.session['cart'][f'{id}']['quantity']
    return JsonResponse({"dprice": p.dprice,"q":q})



import json 
import requests
from django.http import HttpResponseRedirect
import datetime
import hmac, hashlib
import base64


@csrf_exempt
def yoapp_payment(request):
    if request.method == "POST":
        Amount = request.POST['yototal']
        # for testing only
        # Amount = "1"
        PaymentType = request.POST['paymentmethod']
    else:
        return redirect("cart_detail")
    users = Profile.objects.get(user=request.user)
    customer_mobile = users.phone
    customer_name = request.user.username
    now = datetime.datetime.now()
    date_time = now.strftime("%m/%d/%Y,%H:%M:%S")
    MerchantApiUsername = 'XYGAPI'
    MerchantName = 'X.Y.Game Pvt.Ltd.'
    MerchantId = '0000003396'
    MerchantTxnId = 'xy' + date_time
    Remarks = 'XYgame Payment.'
    ReturnURL = 'https://xygame.co/yoapp_payment_verification'
    ValidityTime = '50'
    Secret_Key = b'Api@Gsk123'

    message = (Amount + customer_mobile + customer_name + MerchantApiUsername + MerchantId + MerchantName + MerchantTxnId + PaymentType + Remarks + ReturnURL + ValidityTime).encode('utf-8')
    print(message)

    Signature = hmac.new(Secret_Key, message, hashlib.sha512).hexdigest()


    print(Signature)
    # url = 'https://merchantapi.yoapp.com.np/Payment'
    data = {'Amount': Amount, 'CustomerMobileNo': customer_mobile, 'CustomerName': customer_name, 'MerchantApiUsername': MerchantApiUsername, 'MerchantId': MerchantId, 'MerchantName': MerchantName, 'MerchantTxnId': MerchantTxnId, 'PaymentType': PaymentType, 'Remarks': Remarks, 'ReturnURLs': ReturnURL, 'Signature': Signature, 'ValidityTime': ValidityTime}

    # resp = requests.post(url, json=data)
    # print(resp)

    return render(request, 'mainapp/yoapp.html', {'datas': data})



def yoapp_payment_verification(request):
    MerchantTxnID = request.GET.get('MerchantTxnID', None)
    GatewayTransactionId = request.GET.get('GatewayTransactionId', None)
    MerchantApiUsername = 'XYGAPI'
    MerchantApiPassword = 'Api@Xygame#123'
    message = MerchantApiUsername+":"+MerchantApiPassword
    message_bytes = message.encode('utf8')
    base64_bytes = base64.b64encode(message_bytes)
    headercode = base64_bytes.decode('utf8')
    Secret_Key = b'Api@Gsk123'

    print(headercode)

    message = (GatewayTransactionId + MerchantTxnID + MerchantApiUsername).encode('utf-8')
    Sign = hmac.new(Secret_Key, message, hashlib.sha512).hexdigest()

    headers = {
        "Authorization": "Basic "+headercode,
        "Content-Type": "application/json"
    }

    print(Sign)
    print(MerchantTxnID)
    print(GatewayTransactionId)
    print(headers)

    url1 = "https://merchantapi.yoapp.com.np/CheckTransactionStatus"
    data1 = {"MerchantUsername": MerchantApiUsername, "MerchantTxnId": MerchantTxnID, "GatewayTxnId": GatewayTransactionId, "Signature": Sign}
    # resp = requests.post(url1, data1, headers=headers)
    x = requests.post(url1, json=data1, auth=(MerchantApiUsername, MerchantApiPassword))
    result = json.loads(x.text)
    print(x.text)
    try:
        if result['Code'] == 0:
            # print(result['Data']['Status'])
            request.session['ime_pay_amount'] = result['Data']['Amount']
            request.session['validated_payment'] = True
            return redirect("confirmorder")
    except:
        messages.error(result['errors']['error_message'])
    return redirect("cart_detail")







def prabhu_payment(request):
    if request.method == "POST":
        total = request.POST['prto']
    else:
        return redirect("cart_detail")
    zdate = datetime.datetime.now()
    invoice_no = request.user.username+str(zdate)
    request.session['invoice_no'] = invoice_no
    url = 'https://stagesys.prabhupay.com/api/EPayment/Initiate'
    data = {'totalAmount': total,'merchantId':'CETSPL','password':'5s5xxb7w','invoiceNo':invoice_no,'productDetails':[],'remarks':'test payment prabhu','returnUrl':"http://xygame.co/prabhu_confirm"}
    
    x = requests.post(url, json = data)
    result = json.loads(x.text)
    
    if result['success']:
        return HttpResponseRedirect(result['data']['redirectionUrl'])
    


def prabhu_confirm(request):
    try:
        invoice = request.POST['invoice_no']
    except:
        return redirect("cart_detail")
    url2 = "https://stagesys.prabhupay.com/api/EPayment/CheckStatus"
    data2 = {"merchantId": "CETSPL","invoiceNo": invoice,"transactionId":"","password": "5s5xxb7w"}
    y = request.posts(url2,json=data2)
    result2 = json.loads(y.text)
    if result2['success']:
        request.session['validated_payment'] = True
        return redirect("confirmorder")
    return redirect("cart_detail")
    

# @csrf_exempt
# def khalti_payment(request):
#     if request.method == "POST":
#         data = request.POST
#         product_id = data['product_identity']
#         token = data['token']
#         amount = data['amount']
#         url = "https://khalti.com/api/v2/payment/verify/"
#         payload = {
#             "token":token,
#             "amount":amount
#         }
#         headers = {
#             "Authorization":"Key live_secret_key_b372c7569b154eecaf3a0c356dcce5e6"
#         }
#         response = requests.post(url,payload,headers=headers)
        
#         response_data = json.loads(response.text)
#         status_code = str(response.status_code)

#         if status_code == '400':
#             response = JsonResponse({'status':'false','message':response_data['detail']},status=500)
#             return response
#         if status_code == '200':
#             request.session['validated_payment'] = True
#             return JsonResponse(f"Payment Successfully Completed. Status={status_code}",safe=False)
#         return redirect("cart_detail")
        
        
        
        
       
@csrf_exempt
def khalti_payment(request):
    if request.method == "GET":
        data = request.GET
        try:
            pidx = data['pidx']
        except:
            message = data['message']
            return HttpResponse(message, content_type='text/plain')
        payload = {"pidx": pidx}
        url = "https://khalti.com/api/v2/epayment/lookup/"
        # url = "https://a.khalti.com/api/v2/epayment/lookup/"

        headers = {
            "Authorization": "Key live_secret_key_b372c7569b154eecaf3a0c356dcce5e6"
            # "Authorization": "Key 15405087ad854bfebca54bd475475912"

        }
        response = requests.post(url, json=payload, headers=headers)

        response_data = json.loads(response.text)
        print(response_data)

        try:
            if response_data['status'] == "Completed" or response_data['status'] == "Pending" or response_data['status'] == "Initiated":
                # print(result['Data']['Status'])
                order = Order.objects.get(pidx=data['pidx'])
                order.approved = True
                order.save()
                messages.success(request, 'Your order has been created successfully.')
                return redirect(index)
            else:
                messages.error(request, response_data['status'])
                return redirect(index)
        except Exception as e:
            messages.error(request, f"Some error occured please take screenshot of this message and send to our facebook message: {e}")
            return redirect(index)

        # if status_code == '400':
        #     response = JsonResponse({'status':'false','message':response_data['detail']},status=500)
        #     return response
        # if status_code == '200':
        #     request.session['validated_payment'] = True
        #     return JsonResponse(f"Payment Successfully Completed. Status={status_code}",safe=False)
        # return redirect("cart_detail")
        
    
    
    
@csrf_exempt
def khalti_payment_initiate(total,id):
    user = User.objects.get(id=id)
    # profiles = Profile.objects.get(user=user)
    name = user.first_name + " " + user.last_name
    email = user.email
    amount = float(total)
    total = int(amount * 100)
    # total = float(1000)
    url = "https://khalti.com/api/v2/epayment/initiate/"
    # url = "https://a.khalti.com/api/v2/epayment/initiate/"
    data = {
                "return_url": 'https://xygame.co/khalti_payment/',
                "website_url": 'https://xygame.co/',
                "amount": total,
                "purchase_order_id": "test12",
                "purchase_order_name": "test",
                "customer_info": {
                    "name": name,
                    "email": email,
                    "phone": "9811496763"
                },
            }
    headers = {
        "Authorization": "Key live_secret_key_b372c7569b154eecaf3a0c356dcce5e6"
        # "Authorization": "Key 15405087ad854bfebca54bd475475912"
    }
    # response = requests.request("POST", url, headers=headers, data=data)
    x = requests.post(url, json=data, headers=headers)
    result = json.loads(x.text)
    print(result)
    return result["payment_url"],result["pidx"]



    
    
    

@login_required
def confirmorder(request):
    # try:
    #     check_validation = request.session['validated_payment']
    #     del request.session['validated_payment']
    # except:
    #     check_validation = False

    # if not check_validation:
    #     return redirect("cart_detail")
    u, _ = Profile.objects.get_or_create(user=request.user)
    # total = request.POST['forcalonly']

    try:
        total = request.POST['forcalonly']
    except:
        total = request.session['ime_pay_amount']
        print("Total from except block:", total)

    payment_success = "Successful payment"
    print("total:", total)
    print(request.session['cart'])
    print("debugggggg")
    payment_getway = "Khalti"

    newOrder = Order.objects.create(username=User.objects.get(
        id=request.user.id), payment_getway=payment_getway, Amount=total, item_length=len(request.session['cart']))
    # newOrder.save()
    grabber = Order.objects.get(id=newOrder.id)
    print("grabber:", grabber)
    temp_products = ""
    temp_autocode = ""
    for key in request.session['cart']:
        a = OrderItem.objects.create(product=Product.objects.get(
            name=request.session['cart'][key]['name']), order=grabber,
            quantity=request.session['cart'][key]['quantity'])
        temp_products = request.session['cart'][key]['name']
        a.save()
        ordersummary = OrderUserProfile.objects.create(order=newOrder, user=request.user)
        ordersummary.category = temp_products
        ordersummary.save()
    print(temp_products)

    for key in request.session['cart']:
        u.points = int(u.points) + int(Product.objects.get(name=request.session['cart'][key]['name']).points)
        u.save()
    order_items = OrderItem.objects.filter(order=grabber)  # added during ime_pay
    if request.method == "POST":
        # print("grabber:", grabber)
        # print("Inside post")
        # order_items = OrderItem.objects.filter(order=grabber)
        # print("lllllllll")
        # print(order_items)
        # print("pppppppp")
        try:
            for o in OrderItem.objects.filter(order=grabber):
                if o.product.name + "-destination_one" in request.POST.keys():
                    o.destination_one = request.POST[o.product.name +
                                                     "-destination_one"]
                    o.save()

            for o in OrderItem.objects.filter(order=grabber):
                if o.product.name + "-destination_two" in request.POST.keys():
                    o.destination_two = request.POST[o.product.name +
                                                     "-destination_two"]
                    o.save()
            for o in OrderItem.objects.filter(order=grabber):
                if o.product.name + "-destination_three" in request.POST.keys():
                    o.destination_three = request.POST[o.product.name +
                                                       "-destination_three"]
                    o.save()
            for o in OrderItem.objects.filter(product__is_details=True, order=grabber):
                temp = list(SerialCode.objects.filter(
                    product__name=o.product.name, status="Active"))

                limiter = o.quantity
                limiter = int(limiter)
                if limiter > len(temp):
                    result = limiter - int(len(temp))
                try:
                    comment = f"There is request of {limiter} number of code for {o.product.name}, we only have {len(temp)}. Total Shortage of {result}"
                    ShortageRegister.objects.create(user=request.user, product=o.product, req_for=limiter,
                                                    we_have=len(temp), remarks=comment)
                except:
                    print('registering failed')
                for s in temp[:limiter]:
                    # u = UserProfile.objects.create(
                    #     user=request.user, code=s.serial_key, category=s.product.name)
                    temp_autocode += s.serial_key + "\n"
                    u.save()
                    s.status = "Used"
                    s.save()
                ordersummary.code = temp_autocode
                ordersummary.save()
                print("temp_autocode:", temp_autocode)
                print("ordersummary.code:", ordersummary.code)



        except Exception as e:

            print(e)
    finalize_order_coupon(request, newOrder, request.user)
    cart = Cart(request)
    cart.clear()
    try:
        discount = request.session['showdis']
    except:
        print("no showdis.")
        discount = 0.0
    print("Disount =>>>>>>>>>>>>>>>>>>>>>>>", discount)
    try:
        del request.session['validated_payment']
    except:
        print('validated_payment dummy')
    try:
        del request.session['showdis']
    except:
        print("showdis dummy")
    try:
        del request.session['discount']  # remember to add in production
    except:
        print("discount dummy")

    # send order email to orders@xygame.co
    buyer_username = request.user.username
    html_content = render_to_string("adminapp/admin_order_email.html",
                                    {'buyer_username': buyer_username, "orderid": newOrder.id})
    text_content = strip_tags(html_content)
    email = EmailMultiAlternatives(
        # subject
        f"Order received from {buyer_username}",
        # content
        text_content,
        # from email
        settings.EMAIL_HOST_USER,
        # list of recipient
        ['orders@xygame.co', ],
    )
    email.attach_alternative(html_content, "text/html")
    email.send(fail_silently=True)

    ##################################################
    # price_before_discount = float(int(total) * 100) / (100 + 2)
    # online_txn_fee = float(total) - float(price_before_discount)
    # sub_total = float(price_before_discount) + float(discount)
    # number_of_products = order_items.count()
    ##################################################
    ##################################################
    price_before_discount = round((float(total) * 100) / (100 + 2), 1)
    online_txn_fee = round(float(total) - float(price_before_discount), 1)
    sub_total = float(price_before_discount) + float(discount)

    number_of_products = order_items.count()
    print("number_of_products:", number_of_products)

    ##################################################

    try:
        send_order_notification(request.user.username)
    except:
        print("Something went wrong while sending notification")

    # url,pidx = khalti_payment_initiate(total,request.user.id)
    user = User.objects.get(id=request.user.id)
    # profiles = Profile.objects.get(user=user)
    name = user.first_name + " " + user.last_name
    email = user.email
    amount = float(total)
    total = int(amount * 100)
    # total = float(1000)
    url = "https://khalti.com/api/v2/epayment/initiate/"
    # url = "https://a.khalti.com/api/v2/epayment/initiate/"
    data = {
                "return_url": 'https://xygame.co/khalti_payment/',
                "website_url": 'https://xygame.co/',
                "amount": total,
                "purchase_order_id": "test12",
                "purchase_order_name": "test",
                "customer_info": {
                    "name": name,
                    "email": email,
                    "phone": "9811496763"
                },
            }
    headers = {
        "Authorization": "Key live_secret_key_b372c7569b154eecaf3a0c356dcce5e6"
        # "Authorization": "Key 15405087ad854bfebca54bd475475912"
    }
    # response = requests.request("POST", url, headers=headers, data=data)
    x = requests.post(url, json=data, headers=headers)
    result = json.loads(x.text)
    print(result)
    # return result["payment_url"],result["pidx"]

    
    
    
    newOrder.pidx = result["pidx"]
    newOrder.save()
    return redirect(result["payment_url"])

 
    
@login_required
def confirmorderime(request):
    # try:
    #     check_validation = request.session['validated_payment']
    #     del request.session['validated_payment']
    # except:
    #     check_validation = False
    #
    # if not check_validation:
    #     return redirect("cart_detail")
    u, _ = Profile.objects.get_or_create(user=request.user)
    total = request.POST['forcalonly']

    # try:
    #     total = request.POST['forcalonly']
    #     payment_getway = "Khalti"
    # except:
    # total = request.session['ime_pay_amount']
    # del request.session['ime_pay_amount']
    payment_getway = "ImePay"
    print("Total from except block:", total)

    payment_success = "Successful payment"
    print("total:", total)
    print(request.session['cart'])
    print("debugggggg")

    newOrder = Order.objects.create(
        username=User.objects.get(id=request.user.id),
        payment_getway="QR / Manual Payment",
        Amount=total,
        item_length=len(request.session['cart']),
        approved=False,
        status="Pending"
    )
    # ordersummary = OrderUserProfile.objects.create(order=newOrder, user=request.user)
    # newOrder.save()
    grabber = Order.objects.get(id=newOrder.id)
    print("grabber:", grabber)
    temp_products = ""
    temp_autocode = ""
    for key in request.session['cart']:
        a = OrderItem.objects.create(product=Product.objects.get(
            name=request.session['cart'][key]['name']), order=grabber,
            quantity=request.session['cart'][key]['quantity'], Screenshot=request.FILES.get('imeimage', False), phonenum=request.POST['imecontact'])
        temp_products = request.session['cart'][key]['name']
        a.save()
        for i in range(0, a.quantity):
            ordersummary = OrderUserProfile.objects.create(order=newOrder, user=request.user)
            ordersummary.category = temp_products
            ordersummary.save()
    print(temp_products)

    for key in request.session['cart']:
        u.points = int(u.points) + int(Product.objects.get(name=request.session['cart'][key]['name']).points)
        u.save()
    order_items = OrderItem.objects.filter(order=grabber)  # added during ime_pay
    if request.method == "POST":
        # print("grabber:", grabber)
        # print("Inside post")
        # order_items = OrderItem.objects.filter(order=grabber)
        # print("lllllllll")
        # print(order_items)
        # print("pppppppp")
        try:
            for o in OrderItem.objects.filter(order=grabber):
                if o.product.name + "-destination_one" in request.POST.keys():
                    o.destination_one = request.POST[o.product.name +
                                                     "-destination_one"]
                    o.save()

            for o in OrderItem.objects.filter(order=grabber):
                if o.product.name + "-destination_two" in request.POST.keys():
                    o.destination_two = request.POST[o.product.name +
                                                     "-destination_two"]
                    o.save()
            for o in OrderItem.objects.filter(order=grabber):
                if o.product.name + "-destination_three" in request.POST.keys():
                    o.destination_three = request.POST[o.product.name +
                                                       "-destination_three"]
                    o.save()
            for o in OrderItem.objects.filter(product__is_details=True, order=grabber):
                temp = list(SerialCode.objects.filter(
                    product__name=o.product.name, status="Active"))

                limiter = o.quantity
                limiter = int(limiter)
                if limiter > len(temp):
                    result = limiter - int(len(temp))
                try:
                    comment = f"There is request of {limiter} number of code for {o.product.name}, we only have {len(temp)}. Total Shortage of {result}"
                    ShortageRegister.objects.create(user=request.user, product=o.product, req_for=limiter,
                                                    we_have=len(temp), remarks=comment)
                except:
                    print('registering failed')
                for s in temp[:limiter]:
                    # u = UserProfile.objects.create(
                    #     user=request.user, code=s.serial_key, category=s.product.name)
                    temp_autocode += s.serial_key + "\n"
                    u.save()
                    s.status = "Used"
                    s.save()
                ordersummary.code = temp_autocode
                ordersummary.save()
                print("temp_autocode:", temp_autocode)
                print("ordersummary.code:", ordersummary.code)



        except Exception as e:

            print(e)
    finalize_order_coupon(request, newOrder, request.user)
    cart = Cart(request)
    cart.clear()
    try:
        discount = request.session['showdis']
    except:
        print("no showdis.")
        discount = 0.0
    print("Disount =>>>>>>>>>>>>>>>>>>>>>>>", discount)
    try:
        del request.session['validated_payment']
    except:
        print('validated_payment dummy')
    try:
        del request.session['showdis']
    except:
        print("showdis dummy")
    try:
        del request.session['discount']  # remember to add in production
    except:
        print("discount dummy")

    # send order email to orders@xygame.co
    try:
        buyer_username = request.user.username
        html_content = render_to_string("adminapp/admin_order_email.html",
                                        {'buyer_username': buyer_username, "orderid": newOrder.id})
        text_content = strip_tags(html_content)
        email = EmailMultiAlternatives(
            # subject
            f"Order received from {buyer_username}",
            # content
            text_content,
            # from email
            settings.EMAIL_HOST_USER,
            # list of recipient
            ['orders@xygame.co', ],
        )
        email.attach_alternative(html_content, "text/html")
        email.send(fail_silently=True)
    except:
        print('email has failed.')
    ##################################################
    # price_before_discount = float(int(total) * 100) / (100 + 2)
    # online_txn_fee = float(total) - float(price_before_discount)
    # sub_total = float(price_before_discount) + float(discount)
    # number_of_products = order_items.count()
    ##################################################
    ##################################################
    price_before_discount = round((float(total) * 100) / (100 + 2), 1)
    online_txn_fee = round(float(total) - float(price_before_discount), 1)
    sub_total = float(price_before_discount) + float(discount)

    number_of_products = order_items.count()
    print("number_of_products:", number_of_products)

    ##################################################

    try:
        send_order_notification(request.user.username)
    except:
        print("Something went wrong while sending notification")

    # context = {"total": total, "orderid": newOrder.id, "date": date.today,"discount":discount,"stotal":int(float(total)+float(discount))}
    context = {"total": total, "orderid": newOrder.id, "date": date.today, "discount": float(discount),
               "stotal": (float(total) + float(discount)), 'items': order_items,
               'price_before_discount': price_before_discount, 'online_txn_fee': online_txn_fee, 'sub_total': sub_total,
               'payment_success': payment_success, 'number_of_products': number_of_products,
               'payment_method': newOrder.payment_getway}
    return render(request, "mainapp/thankyou.html", context)




def submitreview(request):
    if request.method == "POST":
        print('here')
        name = request.POST['name']
        email = request.POST['email']
        title = request.POST['title']
        try:
            rating = request.POST['rating']
        except:
            rating = "Not Given"
        review = request.POST['review']
        Review.objects.create(name=name, email=email,
                              title=title, rating=rating, review=review)

    return redirect("/")


def singleproduct(request, name):
    all_header = Header.objects.all()
    infos = Info.objects.exclude(is_draft=True)
    mainbanners = list(reversed(MainBanner.objects.all()))
    subbanners = list(reversed(SubBanner.objects.all()))[:2]
    navbanner = NavBanner.objects.filter().first()
    p = Product.objects.filter(slug=name).first()
    if not p:
        try:
            p = Product.objects.filter(id=int(name)).first()
        except (ValueError, TypeError):
            p = None
    if not p:
        p = Product.objects.filter(name__iexact=name).first()
    if not p:
        return redirect("/")

    if request.user.is_authenticated and not request.user.is_superuser:
        try:
            user, _ = Profile.objects.get_or_create(user=request.user)
            distributor = bool(user.distributor)
        except Exception:
            distributor = False
    else:
        distributor = False
    return render(request, "mainapp/single-product.html", {'navbanner': navbanner, 'mainbanners': mainbanners, 'subbanners': subbanners, "all_header":all_header, "p": p, "distributor": distributor, 'infos': infos})


def search(request):
    # game_card = Category.objects.filter(header="Game-Card")
    # music = Category.objects.filter(header="Music")
    # ott = Category.objects.filter(header="OTT")
    # more = Category.objects.filter(header="Others")
    # topup = Category.objects.filter(header="Topup")
    all_header = Header.objects.all()
    infos = Info.objects.exclude(is_draft=True)
    mainbanners = list(reversed(MainBanner.objects.all()))
    subbanners = list(reversed(SubBanner.objects.all()))[:2]
    navbanner = NavBanner.objects.filter().first()
    if request.method == "POST":
        q = request.POST['q']
        if q:
            results = Product.objects.filter(name__icontains=q)
        else:
            results = {}
        # return render(request, "mainapp/searched.html", {'navbanner': navbanner, 'mainbanners': mainbanners, 'subbanners': subbanners, "game_card": game_card, "music": music, "ott": ott, "more": more, "results": results, "keyword": q,"topup":topup})
        return render(request, "mainapp/searched.html", {'navbanner': navbanner, 'mainbanners': mainbanners, 'subbanners': subbanners, "all_header":all_header, "results": results, "keyword": q, 'infos': infos})
    else:
        return redirect("/")


def getproduct(request, id):
    product = Product.objects.get(id=id)
    return JsonResponse({"d1": product.detail_one, "d2": product.detail_two, "d3": product.detail_three, "automable": product.is_details})





def carttest(request):
    cart = Cart(request)
    print(cart)


def promotions(request):
    subbanners = list(reversed(SubBanner.objects.all()))
    all_header = Header.objects.all()
    return render(request, "mainapp/promotions.html",{"sb":subbanners, "all_header": all_header})


def singlePromotion(request):
    return render(request, "mainapp/single-promotion.html")

def aboutus(request):
    return render(request,"mainapp/aboutus.html")


def privacypolicy(request):
    return render(request,"mainapp/privacypolicy.html")

def cancelrefund(request):
    return render(request,"mainapp/cancelrefund.html")

def useragreement(request):
    return render(request,"mainapp/useragreement.html")


# def reedemcoupon(request,coupon):
#     try:
#         c = Coupons.objects.filter(coupon=coupon,used=False).first()
#         request.session['discount'] = c.price
#         request.session['coupon'] = c.coupon
#         c.used = True
#         c.save()
#     except:
#         request.session['coupon_failed'] = "show"
#     finally:
#         return redirect("cart_detail")

def reedemcoupon(request, coupon=None, product_id=None):
    code = coupon or request.POST.get('coupon') or request.GET.get('coupon')
    pid = product_id or request.POST.get('product_id') or request.GET.get('product_id')

    if not request.user.is_authenticated:
        msg = "Please log in to redeem coupons."
        if request.headers.get('x-requested-with') == 'XMLHttpRequest' or request.GET.get('format') == 'json':
            return JsonResponse({'success': False, 'message': msg})
        request.session['coupon_msg'] = msg
        request.session['coupon_status'] = 'error'
        return redirect("cart_detail")

    cart_dict = request.session.get('cart', {})
    is_distributor = False
    if request.user.is_authenticated:
        prof, _ = Profile.objects.get_or_create(user=request.user)
        is_distributor = prof.distributor

    is_valid, message, coupon_obj, discount, target_pid = validate_and_get_coupon(
        code=code,
        product_id=pid,
        user=request.user,
        cart_dict=cart_dict,
        is_distributor=is_distributor
    )

    if is_valid and coupon_obj:
        apply_coupon_to_session(request, coupon_obj, target_pid, discount)
        request.session['coupon_msg'] = message
        request.session['coupon_status'] = 'success'
        if request.headers.get('x-requested-with') == 'XMLHttpRequest' or request.GET.get('format') == 'json':
            summary = get_cart_coupon_summary(request, cart_dict, is_distributor)
            return JsonResponse({
                'success': True,
                'message': message,
                'discount': discount,
                'applied_coupon': summary['applied_coupon'],
                'items_subtotal': summary['items_subtotal'],
                'processing_fee': summary['processing_fee'],
                'grand_total': summary['grand_total'],
            })
    else:
        request.session['coupon_msg'] = message
        request.session['coupon_status'] = 'error'
        if request.headers.get('x-requested-with') == 'XMLHttpRequest' or request.GET.get('format') == 'json':
            return JsonResponse({'success': False, 'message': message})

    return redirect("cart_detail")


def remove_coupon(request):
    clear_coupon_from_session(request)
    request.session['coupon_msg'] = "Coupon removed."
    request.session['coupon_status'] = 'info'
    if request.headers.get('x-requested-with') == 'XMLHttpRequest' or request.GET.get('format') == 'json':
        cart_dict = request.session.get('cart', {})
        is_distributor = False
        if request.user.is_authenticated:
            prof, _ = Profile.objects.get_or_create(user=request.user)
            is_distributor = prof.distributor
        summary = get_cart_coupon_summary(request, cart_dict, is_distributor)
        return JsonResponse({
            'success': True,
            'message': 'Coupon removed.',
            'items_subtotal': summary['items_subtotal'],
            'discount': 0.0,
            'processing_fee': summary['processing_fee'],
            'grand_total': summary['grand_total'],
        })
    return redirect("cart_detail")


def esewa(request):
    return render(request,"mainapp/esewa.html")


def contact(request):
    # game_card = Category.objects.filter(header="Game-Card")
    # music = Category.objects.filter(header="Music")
    # ott = Category.objects.filter(header="OTT")
    # more = Category.objects.filter(header="Others")
    # topup = Category.objects.filter(header="Topup")
    all_header = Header.objects.all()
    infos = Info.objects.exclude(is_draft=True)
    form = ContactForm()
    # context={'game_card':game_card,'music':music,'ott':ott,'more':more,'topup':topup,'form':form}
    context={'all_header':all_header,'form':form, 'infos': infos}

    if request.method == "POST":
        form = ContactForm(request.POST)
        if form.is_valid():
             full_name = form.cleaned_data['fullName']
             email = form.cleaned_data['email']
             phone = form.cleaned_data['phone_number']
             message = form.cleaned_data['message']
             contact_obj = Contact(full_name=full_name,email=email,phone_number=phone,message=message)
             contact_obj.save()
             messages.success(request, 'Your message has been sent successfully.')
             return redirect("/")
            
    return render(request,"mainapp/contact.html",context)

def each_info(request, title_slug):
    info = Info.objects.filter(slug=title_slug).first()
    infos = Info.objects.exclude(is_draft=True)
    all_header = Header.objects.all()
    context = {
        "info": info,
        "infos": infos,
        "all_header": all_header,
    }
    return render(request, "mainapp/info.html", context)
    
    
def showFirebaseJS(request):
    data = 'importScripts("https://www.gstatic.com/firebasejs/7.14.6/firebase-app.js");' \
           'importScripts("https://www.gstatic.com/firebasejs/7.14.6/firebase-messaging.js"); ' \
           'var firebaseConfig = {' \
           '        apiKey: "AIzaSyAYxJv1xjxl7Us3dqGdCeVmQH6BmxM7S1E",' \
           '        authDomain: "xygame-d16e8.firebaseapp.com",' \
           '        projectId: "xygame-d16e8",' \
           '        storageBucket: "xygame-d16e8.appspot.com",' \
           '        messagingSenderId: "370604277595",' \
           '        appId: "1:370604277595:web:aee3e9a8f5aac7b1cd247e",' \
           '        measurementId: "G-DMLR619FPJ"' \
           ' };' \
           'firebase.initializeApp(firebaseConfig);' \
           'const messaging=firebase.messaging();' \
           'messaging.setBackgroundMessageHandler(function (payload) {' \
           '    console.log(payload);' \
           '    const notification=JSON.parse(payload);' \
           '    const notificationOption={' \
           '        body:notification.body,' \
           '        icon:notification.icon' \
           '    };' \
           '    return self.registration.showNotification(payload.notification.title,notificationOption);' \
           '});'

    return HttpResponse(data, content_type="text/javascript")


def send_order_notification(user):
    message = f"New order received from {user}"
    superusers = User.objects.filter(is_superuser=True)
    tokens = []
    for superuser in superusers:
        try:
            token = superuser.fcmtoken.fcm_token
            tokens.append(token)
        except:
            print("token not found")
    print(tokens)
    url = "https://fcm.googleapis.com/fcm/send"
    headers = {"Content-Type": "application/json",
               "Authorization": "key=AAAAVkm8f1s:APA91bFwXyDwDs748a3lJIFzO2jzEckfvHd-vEUp6Kvi9pOA7bcgihhQY8J1OKf9xtKi2-nQScDzJC3UWL7Oi0f3U0Ec3YplUEfONRcnEaK-786XnhKSVIS3BSsoOKu6mH4iJianZfh8"}
    for token in tokens:
        body = {
            "notification": {
                "title": "XYGAME - New Order Alert",
                "body": message,
                "click_action": "https://xygame.co/admin/",
                "icon": "https://xygame.co/static/mainapp/images/xygame.png"
            },
            "to": token
        }
        try:
            data = requests.post(url, data=json.dumps(body), headers=headers)
            print(data.text)
        except:
            print("Something went wrong")
    return HttpResponse("True")


def imepay_payment(request):
    if request.method == "POST":
        total = request.POST['imepay_prto']
        print("total:", total)
        # else:
        #     return redirect("cart_detail")
        ###################################
        refid = str(uuid.uuid4())
        request.session['refid'] = refid

        url = "https://stg.imepay.com.np:7979/api/Web/GetToken"
        data = {
            "MerchantCode": "CUTEDGETE",
            "Amount": total,
            "RefId": refid,
        }
        headers = {
            "Content-Type": "application/json",
            "Authorization": "Basic Y3V0ZWRnZXRlY2hub2xvZ3k6aW1lQDEyMzQ=",
            "Module": "Q1VURURHRVRF",
        }
        r = requests.post(url=url, json=data, headers=headers)
        print(">>>>>>>>>>>>>>>>>>>>>>>>>", r)
        result = json.loads(r.text)
        print("result:", result)
        if str(r.status_code) == '200':
            print("Success1")
            Imepay.objects.create(
                merchant_code="CUTEDGETE",
                tran_amount=result['Amount'],
                ref_id=result['RefId'],
                token_id=result['TokenId'],
            )

            RespUrl = "https://xygame.co/imepay_confirm/"
            CancelUrl = "https://xygame.co/cart/cart-detail/"
            beforeencodedata = result['TokenId'] + "|" + "CUTEDGETE" + "|" + result['RefId'] + "|" + result[
                'Amount'] + "|" + "POST" + "|" + RespUrl + "|" + CancelUrl
            print("beforeencodedata", beforeencodedata)
            aftereencodedata = str(b64encode(beforeencodedata.encode("utf-8")), "utf-8")
            print("aftereencodedata", aftereencodedata)
            print("Success2")
            print("logged in=>>>>>12", request.user)
            redirect_url = f"https://stg.imepay.com.np:7979/WebCheckout/Checkout?data={aftereencodedata}"
            return redirect(redirect_url)
    return redirect("cart_detail")


@csrf_exempt
def imepay_confirm(request):
    print("logged in=>>>>>111111", request.user)
    if not request.user.is_authenticated:
        print("Not Authenticated")
    # if request.method == 'POST' and request.user.is_authenticated:
    if request.method == 'POST':

        print("logged in=>>>>>1", request.user)
        ResponseCode = request.POST['ResponseCode']
        ResponseDescription = request.POST['ResponseDescription']
        RefId = request.POST['RefId']
        TranAmount = request.POST['TranAmount']
        Msisdn = request.POST['Msisdn']
        TransactionId = request.POST['TransactionId']
        TokenId = request.POST['TokenId']
        obj = Imepay.objects.filter(ref_id=RefId).first()
        obj.transaction_id = TransactionId
        obj.msisdn = Msisdn
        obj.ime_txn_status = ResponseCode
        obj.save()
        print("logged in=>>>asdas>>1", request.user)

        url = " https://stg.imepay.com.np:7979/api/Web/Confirm"
        
        data = {
            "MerchantCode": "CUTEDGETE",
            "RefId": RefId,
            "TokenId": TokenId,
            "TransactionId": TransactionId,
            "Msisdn": Msisdn,
        }
        
        headers = {
            "Content-Type": "application/json",
            "Authorization": "Basic Y3V0ZWRnZXRlY2hub2xvZ3k6aW1lQDEyMzQ=",
            "Module": "Q1VURURHRVRF",
        }
        r = requests.post(url, json=data, headers=headers)
        result = json.loads(r.text)
        if str(result['ResponseCode']) == "0":
        # if str(ResponseCode) == "0":
            request.session['validated_payment'] = True
            print("logged in=>>>>>asdasdasdsad1", request.user)
            request.session['ime_pay_amount'] = TranAmount
            return redirect("confirmorder")
            
    return redirect("cart_detail")



def change_currency(request):
    last_url = request.META.get('HTTP_REFERER')
    if request.method == 'POST':
        request.session['currency'] = request.POST['currency']
        print("Currency is==>>>>>>.", request.session['currency'])
        return HttpResponseRedirect(last_url)
    else:
        return HttpResponseRedirect(last_url)
        
        
def cancel_order(request, id):
    order = Order.objects.get(id=id)
    if request.method == "POST":
        order.status = "cancel"
        order.save()
        return redirect("myorders")
    context = {
        "order": order,
    }
    return render(request, "mainapp/cancelorder.html", context)
    
    
    
    
@csrf_exempt
def verifycontactinfo(request):
    if request.method == 'POST':
        contactinfo = request.POST.get('contact')
        try:
            if Profile.objects.filter(phone=contactinfo).exists():
                return JsonResponse({'message': "Already Exists."})
            else:
                return JsonResponse({'message': "Doesn't Exists."})
        except Exception as e:
            return JsonResponse({'message': str(e)}, status=400)
    return JsonResponse({'message': 'Invalid request'}, status=400)


