from django.shortcuts import render, redirect
import stripe
from .models import *
from django.http import JsonResponse,HttpResponse
from django.views.decorators.csrf import csrf_exempt
import json
import copy
from random import randint
from django.core.mail import send_mail
from datetime import date
from django.db.models import Q
stripe.api_key = "sk_test_51HXORwLwNyzJ3q1tYG3ZwQD9LfOQYRM7vH8mStbYeDDz6nk4qAkZk4SCPyEyf7pjSkNErcyGxoM38TgPAKkEEZgu00ogadXKno"
# Create your views here.


def index(request):
    cag = list(reversed(Art.objects.all()))[:8]
    test = list(reversed(Testimonials.objects.all()))
    mainbanners = list(reversed(MainBanner.objects.all()))[:3]
    product  = SubProduct.objects.all().order_by('id')
    header = Header.objects.all()
    category = list(reversed(Category.objects.all()))
    
    try:
        temp = request.session['subscribed']
        subscribed = True
        showmsg = request.session['showmsg']

        del request.session['subscribed']
        del request.session['showmsg']
    except:
        subscribed = False
        showmsg = None
    pcategory = Category.objects.filter(ispromotional=True)
    context = {"products":product,"mainbanners":mainbanners,"cag":cag,"ts":test,"subscribed":subscribed,'showmsg':showmsg,"header":header,"category":category}
    return render(request, "shapeprint_app/index.html",context)

def privacy(request):
    product  = list(reversed(SubProduct.objects.all()))
    header = Header.objects.all()
    category = list(reversed(Category.objects.all()))
    return render(request, "shapeprint_app/privacy.html",{"product":product,"header":header,"category":category})
    
def faq(request):
    product  = list(reversed(SubProduct.objects.all()))
    header = Header.objects.all()
    category = list(reversed(Category.objects.all()))
    return render(request, "shapeprint_app/faq.html",{"product":product,"header":header,"category":category})   

def termsandconditions(request):
    product  = list(reversed(SubProduct.objects.all()))
    header = Header.objects.all()
    category = list(reversed(Category.objects.all()))
    return render(request, "shapeprint_app/termsandconditions.html",{"product":product,"header":header,"category":category})

def promotion(request):
    product  = list(reversed(SubProduct.objects.all()))
    header = Header.objects.all()
    category = list(reversed(Category.objects.all()))
    return render(request, "shapeprint_app/promotion.html",{"product":product,"header":header,"category":category})

def productorder(request):
    product  = list(reversed(SubProduct.objects.all()))
    header = Header.objects.all()
    category = list(reversed(Category.objects.all()))
    return render(request, "shapeprint_app/productorder.html",{"product":product,"header":header,"category":category})

def website(request):
    product  = list(reversed(SubProduct.objects.all()))
    header = Header.objects.all()
    category = list(reversed(Category.objects.all()))
    try:
        temp = request.session['subscribed']
        subscribed = True
        showmsg = request.session['showmsg']
        del request.session['subscribed']
        del request.session['showmsg']
    except:
        subscribed = False
        showmsg = None
    all = WebsiteSection.objects.all()
    return render(request, "shapeprint_app/website.html",{"all":all,"subscribed":subscribed,"showmsg":showmsg,"product":product,"header":header,"category":category})

def product(request,category):
    product  = list(reversed(SubProduct.objects.filter(category__name=category)))
    header = Header.objects.all()
    c = Category.objects.filter(name=category).first()
    category = list(reversed(Category.objects.all()))
    return render(request, "shapeprint_app/product.html",{"product":product,"header":header,"category":category,"c":c})

# def shop(request,product):
#     category = Category.objects.get(name=product)
#     fields = Product.objects.filter(main_category__category=category)
#     value = ProductFieldValue.objects.filter(field_name__main_category = category)
#     q = request.GET.get('q',None)
#     if q is not None:
#         sb = SubProduct.objects.get(id=q)
#     else:
#         sb = SubProduct.objects.first()
#     images = SubImages.objects.filter(subproduct__category=category)
#     try:
#         faqs = FAQ.objects.filter(subproduct=sb)
#     except:
#         faqs = None
#     try:
#         related_product = SubProduct.objects.filter(category=category).exclude(id=sb.id)
#     except:
#         related_product = None
#     context = {"fields":fields,"category":category,"value":value,"product":product,"sb":sb,"images":images,"related_product":related_product,"faqs":faqs,"pcategory":Category.objects.filter(ispromotional=True)}
#     return render(request,"shapeprint_app/shop.html",context)


def shop(request,product):
    product  = list(reversed(SubProduct.objects.all()))
    header = Header.objects.all()
    category = list(reversed(Category.objects.all()))
    q = request.GET.get('q',None)
    if q is not None:
        sb = SubProduct.objects.get(id=q)
    else:
        sb = SubProduct.objects.first()
    try:
        subcategory = SubProduct.objects.get(id=q)
    except:
        subcategory = SubProduct.objects.filter().first()
    fields = Product.objects.filter(main_category = subcategory)
    value = ProductFieldValue.objects.filter(field_name__main_category=subcategory)
    
    images = SubImages.objects.filter(subproduct = subcategory)
    try:
        faqs = FAQ.objects.filter(subproduct=sb)
    except:
        faqs = None
    try:
        related_product = SubProduct.objects.filter().exclude(id=sb.id)
    except:
        related_product = None
    context = {"product_name":subcategory,"fields":fields,"value":value,"product":product,"sb":sb,"images":images,"related_product":related_product,"faqs":faqs,"category":category,"header":header,"product":product}
    return render(request,"shapeprint_app/shop.html",context)


def login(request):
    return render(request, "accounts/login.html")


def register(request):
    return render(request, "accounts/signup.html")


def thanks(request):
    return render(request, "shapeprint_app/thankyou.html")

def cart(request):
    product  = list(reversed(SubProduct.objects.all()))
    header = Header.objects.all()
    category = list(reversed(Category.objects.all()))
    return render(request, "shapeprint_app/cart.html",{"product":product,"header":header,"category":category})



def checkout(request):
    product  = list(reversed(SubProduct.objects.all()))
    header = Header.objects.all()
    category = list(reversed(Category.objects.all()))
    return render(request, "shapeprint_app/checkout.html",{"product":product,"header":header,"category":category})


def profile(request):
    product  = list(reversed(SubProduct.objects.all()))
    header = Header.objects.all()
    category = list(reversed(Category.objects.all()))
    if not request.user.is_authenticated:
        return redirect("/accounts/login")
    if request.user.is_superuser:
        return redirect("/accounts/logout")
    u = UserProfile.objects.get(user=request.user)
    allorders = Order.objects.filter(user_id=request.user.id)
    return render(request, "shapeprint_app/update-profile.html",{"u":u,"allorders":allorders,"product":product,"header":header,"category":category})


def charge(request):
    if request.method == "POST":
        print("DATA", request.POST)
        customer = stripe.Customer.create(
            email=request.POST['email'],
            name=request.POST['nickname'],
            source=request.POST['stripeToken']
        )
        charge = stripe.Charge.create(
            customer=customer,
            amount=50,
            currency='usd',
            description="payment"
        )
        return redirect("finalizeorder")
    else:
        print('not supported')


def contact(request):
    product  = list(reversed(SubProduct.objects.all()))
    header = Header.objects.all()
    category = list(reversed(Category.objects.all()))
    if request.method == "POST":
        data = request.POST
        try:
            Contact.objects.create(
                title=data['title'], first_name=data['first_name'], sur_name=data['sur_name'], email=data['email'],telephone=data['telephone'],c_no=data['c_no'],o_no=data['o_no'],subject=data['subject'],query=data['query'])
        except Exception as e:
            print(e)
        finally:
            return redirect("contact")
    return render(request, "shapeprint_app/contact.html",{"header":header,"product":product,"category":category})


def webquery(request):
  
    if request.method == "POST":
        data = request.POST
        try:
            WebsiteQuery.objects.create(
                name=data['f_name']+data['l_name'], contact=data['email'], subject=data['message'], message=data['description'])
            request.session['subscribed'] = True
            request.session['showmsg'] = "Message Sent Successfully!"
            send_mail('WEBSITE QUERY FROM SHAPEPRINT','Here is the message.','from@example.com',['to@example.com'],fail_silently=False,)
        finally:
            return redirect("website")

def contactquery(request):
    if request.method == "POST":
        data = request.POST
        try:
            Contact.objects.create(
                title=data['title'], first_name=data['first_name'], sur_name=data['sur_name'], email=data['email'],telephone=data['telephone'],c_no=data['c_no'],o_no=data['o_no'],subject=data['subject'],query=data['query'])
            request.session['subscribed'] = True
            request.session['showmsg'] = "Message Sent Successfully!"
        except Exception as e:
            print(e)
        finally:
            return redirect("/")


@csrf_exempt
def addtocart(request):
    if request.method == "POST":
        if 'currentCount' not in request.session:
            request.session['currentCount'] = 1
        else:
            request.session['currentCount'] += 1
        
        if 'cart' not in request.session:
            request.session['cart'] = {}
        

        details = json.loads(request.body.decode("utf-8"))
        prod_details = eval(details)
        request.session['cart'][str(request.session['currentCount'])] = prod_details
        print(request.session['cart'])
    return JsonResponse({"success":"Success added","cart":len(request.session['cart'])})


def show(request):
    # products = []
    # print(Product.objects.all())
    # for x in request.session['cart']:
    #     print(request.session['cart'][x].category)
    
    return render(request,"shapeprint_app/show.html")

def removefromcart(request,id):
    try:
        del request.session['cart'][id]
        request.session.modified = True
    finally:
        return redirect("cart")

def duplicate(request,id):
    try:
        rn = randint(100,2550)
        new_name = id+"new"+str(rn)
        request.session['cart'][new_name]=copy.deepcopy(request.session['cart'][id])
        request.session.modified = True
    except Exception as e:
        print('error',e)
    return redirect("cart")


def finalizeorder(request):
    if True:
        if request.method == "POST":
            name = request.POST['name']
            address = request.POST['address']
            phone = request.POST['phone']
            email = request.POST['email']
            try:
                remarks = request.POST['remarks']
            except:
                remarks = "None"
            if "cart" not in request.session:
                return redirect("/")
            o = Order.objects.create(name=name,phone=phone,email=email,address=address,remarks=remarks,description=request.session['cart'])
            o.save()
            if request.user.is_authenticated:
                o.user_id = request.user.id
            else:
                o.user_id = "None"
            o.save()
            # send_mail('Order Placed Successfully','Your order has been placed Successfully.Thank you for your business with shapeprint','info@xygaming.lancemeup.com',['sushrantrizal@gmail.com.com'],fail_silently=False,)
            total = request.session['total']
            try:
                del request.session['cart']
                del request.session['total']
            except:
                print('Not Found')
            return render(request,"shapeprint_app/thankyou.html",{"name":name,"o":o.id,"total":total,"date":date.today()})
            
        else:
            if request.user.is_authenticated and not request.user.is_superuser:
                u = UserProfile.objects.get(user=request.user)
            else:
                u = None
            return render(request,"shapeprint_app/finalizeorder.html",{"u":u})
    return redirect("/")


@csrf_exempt
def checkout_payment(request):
    if request.method == "POST":
        body = json.loads(request.body.decode("utf-8"))
        total = int(body['total'])
        request.session['total']=total
        return JsonResponse({"success":"success"})
    return HttpResponse('hohoho')

def subscription(request):
    if request.method == "POST":
        name = request.POST['name']
        email = request.POST['email']
        Subscription.objects.create(name=name,email=email)
    request.session['subscribed'] = True
    request.session['showmsg'] = "Subscribtion Added Successfully!"
    return redirect("/")

def paypal(request):
    try:
        temp = request.session['total']
        return render(request,"shapeprint_app/paypal.html",{"total":request.session['total'],"p":"paypal"})
    except Exception as e:
        print(e)
        return redirect("cart")
        


def searched(request,key):
    if True:
        # key = request.POST['key']
        # product = SubProduct.objects.filter(name__contains=key)
        key = key.replace("%20", " ")
        product = SubProduct.objects.filter(Q(name__contains=key) | Q(
                description__contains=key) | Q(top_description__contains=key)| Q(
                category__name__contains=key)| Q(artwork__contains=key)).distinct()
        return render(request, "shapeprint_app/searched.html",{"product":product,"key":key})
    return redirect("/")

def viewall(request):
    product  = list(reversed(SubProduct.objects.all()))
    header = Header.objects.all()
    category = list(reversed(Category.objects.all()))
    
    return render(request,"shapeprint_app/viewall.html",{"product":product,"header":header,"category":category})


def changepassword(request):
    if not request.user.is_authenticated:
        return redirect("/")
    if request.method == "POST":
        p1 = request.POST['p1']
        p2 = request.POST['p2']
        if p1 == p2:
            user = request.user
            user.set_password(p1)
            user.save()
            print('password changed')
    return redirect("profile")


def updetails(request):
    if request.method == "POST":
        u = UserProfile.objects.get(user=request.user)
        us = request.user
        u.full_name = request.POST['full_name']
        us.email = request.POST['email']
        u.town = request.POST['address']
        u.postcode = request.POST['postcode']
        u.telephone_number = request.POST['phone']
        u.save()
        us.save()
    return redirect("profile")


def getImage(request):
    return JsonResponse({'fi': Category.objects.get(name='Flyers').image.url,'bi': Category.objects.get(name='Brochures').image.url,
    'bbi': Category.objects.get(name='Business-Cards').image.url,'ci': Category.objects.get(name='Calendars').image.url})


def customsearch(request):
    bs = Category.objects.filter(main_category="bs")
    mm = Category.objects.filter(main_category="mm")
    sb = Category.objects.filter(main_category="sb")
    bd = Category.objects.filter(main_category="bd")
    pp = Category.objects.filter(main_category="pp")
    key = request.GET.get('key')
    product = SubProduct.objects.filter(Q(name__contains=key) | Q(description__contains=key) | Q(top_description__contains=key)| Q(category__name__contains=key)| Q(artwork__contains=key)).distinct()
    return render(request, "shapeprint_app/searched.html",{"product":product,"key":key,"bs":bs,"mm":mm,"bd":bd,"sb":sb})

@csrf_exempt
def getPriceTotal(request):
    if request.method == "POST":
        details = json.loads(request.body.decode("utf-8"))
        combination = eval(details)
        combination = str(combination)[:-1]+", }"
        try:
            p = list(reversed(Price.objects.filter(combination = combination)))[0]
            getPrice = p.price        
        except:
            getPrice = 0
    
        return JsonResponse({"total":getPrice})