from urllib import request
from django.views.generic.base import View
from auth_apis.models import *
from django.contrib.auth import authenticate, login, logout
from django.shortcuts import render, redirect
from auth_apis.models import User
from django.contrib.auth import get_user_model
from django.http import JsonResponse
from django.http.response import HttpResponse
from . import forms
import random
from .functions import *
from django.template.loader import render_to_string
from django.core import mail
from django.contrib import messages
from django.conf import settings
import math, random, pytz, string
from django.contrib.auth.decorators import login_required
from django.utils.decorators import method_decorator
from admin_panel.models import *
from datetime  import datetime
from django.core.paginator import Paginator
from django.db.models import Q
from store_apis.models import *
from passlib.hash import django_pbkdf2_sha256 as handler
from panel_apis.models import *
from django.db.models import Sum
from django.db.models import Count
import csv

from functools import wraps
from django.http import HttpResponseForbidden

def user_has_permission(perm):
    def decorator(view_func):
        @wraps(view_func)
        def wrapper(request, *args, **kwargs):
            if not request.user.has_perm(perm):
                return HttpResponseForbidden()
            return view_func(request, *args, **kwargs)
        return wrapper
    return decorator

# Create your views here.

def checkLoginPassword(request):
    text = request.GET.get('email','')
    password = request.GET.get('password')
    user         = User.objects.get(email=text)
    if user.check_password(password) == False:
        message = 'Please enter the correct password'
        return JsonResponse(message,safe=False)
    else:
        return HttpResponse ('true')

def checkEmail(request):
    text = request.GET.get('email')
    post = User.objects.filter(email=text).first()
    if post:
        return HttpResponse ('true')
    else:
        message = 'This email does not exist in our database'
        return JsonResponse(message,safe=False)

def checkAddEmail(request):
    text = request.GET.get('email')
    post = User.objects.filter(email=text,is_superuser=0).count()
    if post != 1:
        return HttpResponse ('true')
    else:
        message = 'This email already exist in our database'
        return JsonResponse(message,safe=False)
    
def checkEditEmail(request):
    user_id = request.GET.get('user_id')
    text = request.GET.get('email')
    post = User.objects.filter(email=text,is_superuser=0).exclude(id=user_id).first()
    if post:
        message = 'This email already exist in our database'
        return JsonResponse(message,safe=False)
    else:
        return HttpResponse ('true')


def adminCheckPassword(request):
    old_password = request.GET.get('old_password')
    user         = User.objects.get(email=request.user.email)
    if user.check_password(old_password) == False:
        message = 'Does not match with the old password.'
        return JsonResponse(message,safe=False)
    else:
        return HttpResponse ('true')

def randomStringFunctionForImage():
    import random,string
    str1 = ''.join((random.choice(string.ascii_letters) for x in range(8)))
    str1 += ''.join((random.choice(string.digits) for x in range(4)))
    sam_list = list(str1)
    random.shuffle(sam_list)
    finalString = ''.join(sam_list)
    return finalString


def gernateToken():
	import random
	import array
	MAX_LEN = 66
	DIGITS = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'] 
	LOCASE_CHARACTERS = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h','i', 'j', 'k', 'm', 'n', 'o', 'p', 'q','r', 's', 't', 'u', 'v', 'w', 'x', 'y','z']
	COMBINED_LIST = DIGITS + LOCASE_CHARACTERS
	rand_digit = random.choice(DIGITS)
	rand_lower = random.choice(LOCASE_CHARACTERS)
	temp_pass = rand_digit + rand_lower
	for x in range(MAX_LEN - 4):
		temp_pass = temp_pass + random.choice(COMBINED_LIST)
		temp_pass_list = array.array('u', temp_pass)
		random.shuffle(temp_pass_list)
	token = ""
	for x in temp_pass_list:
			token = token + x
	return token


class adminSignIn(View):
    def get(self,request):
        return render(request,'admin_login.html')
    def post(self,request):
        form         = forms.admin_signin(request.POST)
        if form.is_valid():
            email    = form.cleaned_data.get('email')
            password = form.cleaned_data.get('password')

            user     = authenticate(email=email, password=password)
            if user:
                    login(request, user)
                    if request.user.status == 0:
                        messages.error(request, "You account is temporarily disable.")
                        return redirect('/admin-signin')
                    else:
                        return redirect('/admin-dashboard')

            else:
                return render(request, 'admin_login.html')
        else:
            return render(request, 'admin_login', {'form': form})

class adminForgetPw(View):
    def get(self,request):
        return render(request,'admin_forget_pw.html')
    def post(self,request):
        form = forms.adminforgetpassword(request.POST)
        if form.is_valid():
            email =  form.cleaned_data.get('email')
            user_obj = User.objects.filter(email = email).first()
            ran_num = ''.join([random.choice(string.ascii_letters + string.digits) for n in range(12)])
            baselink =  '/forgot-admin/' + str(user_obj.email) + '/' + ran_num
            completelink = str(settings.BASE_URL) + baselink
            user_obj.forgot_password_link = baselink
            user_obj.save()            
            subject = 'Forgot Password'
            html_message = render_to_string('forget_password_email.html', {'link': completelink})
            plain_message = html_message
            print("seeeee",settings.EMAIL_HOST_USER)
            from_email = settings.EMAIL_HOST_USER
            to = email
            hello = mail.send_mail(subject, plain_message, from_email, [to], html_message=html_message)
            print("+++++++++++++",hello)
            messages.success(request, "A link has been successfully sent to your mail.")
            return redirect('/admin-signin')
        else:
            return render(request, 'admin_forget_pw.html', {'form': form})


class forgetPasswordVerification(View):
    def get(self,request):
        link = str(self.request.path)
        user_email = link.split('/')[-2]
        link_expiry = User.objects.filter(email = user_email).first()
        if link_expiry.forgot_password_link == "LinkExpiry":
            return render(request,'link_expire.html')
        user_obj = User.objects.filter(email = user_email, forgot_password_link = link).first()
        if user_obj:
            valid = True
        else:
            valid = False
        return render(request,'forget_admin.html',{'valid':valid})	

    def post(self,request):
        form = forms.forgetverification(request.POST)
        if form.is_valid():
            new_password = form.cleaned_data.get('new_password')
            confirm_new_password = form.cleaned_data.get('confirm_new_password')
            link = str(self.request.path)
            user_email = link.split('/')[-3]
            user_obj = User.objects.filter(email = user_email).first()
            if user_obj:
                user_obj.set_password(new_password)
                user_obj.forgot_password_link = "LinkExpiry"
                user_obj.save()
                messages.success(request, "Password changed successfully")
                return redirect('/admin-signin')
            else:
                messages.error(request, "Something went wrong")
                return redirect('/admin-signin')
        else:
            return render(request, 'forget_admin.html', {'form': form})	


class adminProfile(View):
    @method_decorator(login_required(login_url='/admin-signin'))
    def get(self,request):
        user_obj = User.objects.filter(id=request.user.id).first()
        return render(request,'admin_profile.html',{'user_obj':user_obj})

    def post(self,request):
        form = forms.profileform(request.POST)
        if form.is_valid():
            full_name = form.cleaned_data.get('full_name')
            isd_code = form.cleaned_data.get('isd_code')
            phone_number = form.cleaned_data.get('phone_number')
            email= form.cleaned_data.get('email')
            User.objects.filter(id=request.user.id).update(full_name=full_name,isd_code=isd_code,phone_number=phone_number,email=email)
            if request.FILES.get('avatar'):
                fileUrl=uploadTheImages(request.FILES.get('avatar'))
                fileUrl=str(settings.BASE_URL)+'/'+fileUrl
                User.objects.filter(email=request.user.email,is_superuser = True).update(avatar=str(fileUrl))
            messages.success(request, "Profile Updated successfully")

            return redirect('/admin-profile')
        else:

            return render(request,'admin_profile.html',{'form':form})


class adminDashboard(View):
    @method_decorator(login_required(login_url='/admin-signin'))
    def get(self,request):
        total_customer = User.objects.filter(is_buyer=1,end_date__isnull=True,is_profile_completed = 1).count()
        total_orders = orderPack.objects.filter(isPaid=True).count()
        total_store = Stores.objects.filter(end_date__isnull=True,is_profile_completed = 1).count()
        total_earnings = orderPack.objects.filter(isPaid=True)
        total = 0
        for earning in total_earnings:
            total += float(earning.totalAmount)

        from django.db.models.functions import TruncMonth
        import datetime
        current_year = datetime.datetime.now().year
        #data= User.objects.annotate(month=TruncMonth('start_date')).values('month').annotate(total=Count('id'))
        month_list = ['01' , '02' , '03' , '04' , '05' , '06' , '07' ,'08' , '09' , '10' , '11' , '12']
        user_count = []
        store_count = []
        order_data = []
        for mnth in month_list:
            all_users = User.objects.filter(is_buyer=1,end_date__isnull=True,is_profile_completed = 1,start_date__year='2023' ,start_date__month=mnth).count()
            user_count.append(all_users)
            all_store = Stores.objects.filter(end_date__isnull=True,is_profile_completed = 1,start_date__year=current_year ,start_date__month=mnth).count()
            store_count.append(all_store)
            all_orders = orderPack.objects.filter(isPaid=True,created_at__year=current_year ,created_at__month=mnth).count()
            order_data.append(all_orders)


        return render(request,'admin_dashboard.html',{'total_customer':total_customer,'total_orders':total_orders,'total_store':total_store,'total_earnings':total,'customers':user_count,'stores':store_count,'orders':order_data})


class adminResetPassword(View):
    @method_decorator(login_required(login_url='/admin-signin'))
    def get(self,request):
        return render(request,'admin_reset_password.html')

    def post(self,request):
        form = forms.change_password_form(request.POST)
        if form.is_valid():
            password = request.POST.get("confirmPassword")
            user     = User.objects.get(email=request.user.email)
            user.set_password(password)
            user.save()
            logout(request)
            messages.info(request, 'You have successfully reset your password')
            return redirect('/admin-signin')
        else:
            return render(request, 'admin_reset_password.html', {'form': form})

class logoutAdmin(View):
    @method_decorator(login_required(login_url='/admin-signin'))
    def get(self,request):
        logout(request)
        messages.success(request, "Logout Succesfully")
        return redirect('/admin-signin')


class privacyPolicy(View):
    @method_decorator(login_required(login_url='/admin-signin'))
    def get(self,request):
        role_user_id = User.objects.filter(id=request.user.id).first()
        if role_user_id.is_superuser:
            get_permission = [1,2,3,4,5,6,7,8,9,10,11]
        else:
            get_permission = RolesPermission.objects.filter(role = role_user_id.role)
        for i in get_permission:
            if request.user.id == 1:
                user_var = 4
            else:
                user_var =  i.permission.id
            if user_var == 4:
                privacy_obj = ContentPages.objects.filter(page_type='Privacy_Policy').first()
                return render(request,'privacy_policy.html',{'privacy_obj':privacy_obj})
        else:
            messages.error(request, "You do not have access for this.")
            return redirect('/admin-dashboard')     
    

    def post(self,request):
        form = forms.contentpages_form(request.POST)
        if form.is_valid():
            data = ContentPages.objects.filter(page_type='Privacy_Policy').first()
            if data:
                ContentPages.objects.filter(id=data.id).update(english_page_title=form.cleaned_data.get('english_page_title'),english_content=form.cleaned_data.get('english_content'),arabic_page_title=form.cleaned_data.get('arabic_page_title'),arabic_content=form.cleaned_data.get('arabic_content'),page_type='Privacy_Policy')
                messages.success(request,'Privacy policy updated successfully')
            else:
                ContentPages.objects.create(english_page_title=form.cleaned_data.get('english_page_title'),english_content=form.cleaned_data.get('english_content'),arabic_page_title=form.cleaned_data.get('arabic_page_title'),arabic_content=form.cleaned_data.get('arabic_content'),page_type='Privacy_Policy')
                messages.success(request,'Privacy policy created successfully')
            return redirect('/privacy-policy')
        else:
            return render(request,'privacy_policy.html',{'form':form})

class termsConditions(View):
    @method_decorator(login_required(login_url='/admin-signin'))
    def get(self,request):
        role_user_id = User.objects.filter(id=request.user.id).first()
        if role_user_id.is_superuser:
            get_permission = [1,2,3,4,5,6,7,8,9,10,11]
        else:
            get_permission = RolesPermission.objects.filter(role = role_user_id.role)
        for i in get_permission:
            if request.user.id == 1:
                user_var = 4
            else:
                user_var =  i.permission.id
            if user_var == 4:
                terms_obj = ContentPages.objects.filter(page_type='Terms_and_conditions').first()
                return render(request,'terms_conditions.html',{'terms_obj':terms_obj})
        else:
            messages.error(request, "You do not have access for this.")
            return redirect('/admin-dashboard') 
        
    def post(self,request):
        form = forms.contentpages_form(request.POST)
        if form.is_valid():
            data = ContentPages.objects.filter(page_type='Terms_and_conditions').first()
            if data:
                ContentPages.objects.filter(id=data.id).update(english_page_title=form.cleaned_data.get('english_page_title'),english_content=form.cleaned_data.get('english_content'),arabic_page_title=form.cleaned_data.get('arabic_page_title'),arabic_content=form.cleaned_data.get('arabic_content'),page_type='Terms_and_conditions')
                messages.success(request,'Terms and Conditions updated successfully')
            else:
                ContentPages.objects.create(english_page_title=form.cleaned_data.get('english_page_title'),english_content=form.cleaned_data.get('english_content'),arabic_page_title=form.cleaned_data.get('arabic_page_title'),arabic_content=form.cleaned_data.get('arabic_content'),page_type='Terms_and_conditions')
                messages.success(request,'Terms and Conditions created successfully')
            return redirect('/terms-and-conditions')
        else:
            return render(request,'terms_conditions.html',{'form':form})

class returnPolicy(View):
    @method_decorator(login_required(login_url='/admin-signin'))
    def get(self,request):
        role_user_id = User.objects.filter(id=request.user.id).first()
        if role_user_id.is_superuser:
            get_permission = [1,2,3,4,5,6,7,8,9,10,11]
        else:
            get_permission = RolesPermission.objects.filter(role = role_user_id.role)
        for i in get_permission:
            if request.user.id == 1:
                user_var = 4
            else:
                user_var =  i.permission.id
            if user_var == 4:
                refund_obj = ContentPages.objects.filter(page_type='Return_Policy').first()
                return render(request,'return_policy.html',{'refund_obj':refund_obj})
        else:
            messages.error(request, "You do not have access for this.")
            return redirect('/admin-dashboard') 
        
    def post(self,request):
        form = forms.contentpages_form(request.POST)
        if form.is_valid():
            data = ContentPages.objects.filter(page_type='Return_Policy').first()
            if data:
                ContentPages.objects.filter(id=data.id).update(english_page_title=form.cleaned_data.get('english_page_title'),english_content=form.cleaned_data.get('english_content'),arabic_page_title=form.cleaned_data.get('arabic_page_title'),arabic_content=form.cleaned_data.get('arabic_content'),page_type='Return_Policy')
                messages.success(request,'Return policy updated successfully')
            else:
                ContentPages.objects.create(english_page_title=form.cleaned_data.get('english_page_title'),english_content=form.cleaned_data.get('english_content'),arabic_page_title=form.cleaned_data.get('arabic_page_title'),arabic_content=form.cleaned_data.get('arabic_content'),page_type='Return_Policy')
                messages.success(request,'Return policy created successfully')

            return redirect('/return-policy')
        else:
            return render(request,'return_policy.html',{'form':form})
    


class helpSupportList(View):
    @method_decorator(login_required(login_url='/admin-signin'))
    def get(self,request):
        role_user_id = User.objects.filter(id=request.user.id).first()
        if role_user_id.is_superuser:
            get_permission = [1,2,3,4,5,6,7,8,9,10,11]
        else:
            get_permission = RolesPermission.objects.filter(role = role_user_id.role)
        for i in get_permission:
            if request.user.id == 1:
                user_var = 9
            else:
                user_var =  i.permission.id
            if user_var == 9:
                total = HelpSupport.objects.all().count()
                resolved = HelpSupport.objects.filter(status = True).count()
                pending = HelpSupport.objects.filter(status = False).count()
                help_obj = HelpSupport.objects.all()
                paginator = Paginator(help_obj, 8)
                page_number = request.GET.get('page')
                rooms_obj = paginator.get_page(page_number)
                return render(request,'help_support_list.html',{'help_obj':rooms_obj,'total':total,'resolved':resolved,'pending':pending})
        else:
            messages.error(request, "You do not have access for this.")
            return redirect('/admin-dashboard')     


class sendSupport(View):
    @method_decorator(login_required(login_url='/admin-signin'))
    def get(self,request,id):
        role_user_id = User.objects.filter(id=request.user.id).first()
        if role_user_id.is_superuser:
            get_permission = [1,2,3,4,5,6,7,8,9,10,11]
        else:
            get_permission = RolesPermission.objects.filter(role = role_user_id.role)
        for i in get_permission:
            if request.user.id == 1:
                user_var = 9
            else:
                user_var =  i.permission.id
            if user_var == 9:
                help =  HelpSupport.objects.filter(id=id).first()
                return render(request,'send_support.html',{'help':help})
        else:
            messages.error(request, "You do not have access for this.")
            return redirect('/admin-dashboard')  
          
    def post(self,request,id):
        form = forms.sendsupportform(request.POST)
        if form.is_valid():
            # username = form.cleaned_data.get('username')
            email =  form.cleaned_data.get('email')
            subject = form.cleaned_data.get('subject')
            reply = form.cleaned_data.get('reply')
            html_message = render_to_string('support_email.html', {'reply_text': reply,'email':email,'subject':subject})
            plain_message = html_message
            from_email = settings.EMAIL_HOST_USER
            to = email
            mail.send_mail(subject, plain_message, from_email, [to], html_message=html_message)
            HelpSupport.objects.filter(id=id).update(reply=reply,reply_date = datetime.now(),status=True)
            messages.success(request, "send successfully")
            return redirect('/help-support-list')
        else:
            return render(request,'send_support.html',{'form':form})

class viewSupport(View):
    @method_decorator(login_required(login_url='/admin-signin'))
    def get(self,request,id):
        role_user_id = User.objects.filter(id=request.user.id).first()
        if role_user_id.is_superuser:
            get_permission = [1,2,3,4,5,6,7,8,9,10,11]
        else:
            get_permission = RolesPermission.objects.filter(role = role_user_id.role)
        for i in get_permission:
            if request.user.id == 1:
                user_var = 9
            else:
                user_var =  i.permission.id
            if user_var == 9:
                sup_obj = HelpSupport.objects.filter(id=id).first()
                return render(request,'view_support.html',{'sup_obj':sup_obj})
        else:
            messages.error(request, "You do not have access for this.")
            return redirect('/admin-dashboard')  

class userListing(View):
    @method_decorator(login_required(login_url='/admin-signin'))
    def get(self,request):
        role_user_id = User.objects.filter(id=request.user.id).first()
        if role_user_id.is_superuser:
            get_permission = [1,2,3,4,5,6,7,8,9,10,11]
        else:
            get_permission = RolesPermission.objects.filter(role = role_user_id.role)
        for i in get_permission:
            if request.user.id == 1:
                user_var = 5
            else:
                user_var =  i.permission.id
            if user_var == 5:
                page_obj = Buyer.objects.filter(user__end_date__isnull=True).order_by('-id')
                search_start = request.GET.get('start_date')
                search_end = request.GET.get('end_date')
                time = datetime.now().strftime('%H:%M:%S')
                if search_start:
                    page_obj = Buyer.objects.filter(user__start_date__range=[search_start, search_end + ' '+ time],user__is_superuser = 0,user__end_date__isnull = True).order_by('-id')
                search_post = request.GET.get('search')
                if search_post:
                    page_obj = Buyer.objects.filter(Q(first_name__icontains=search_post)|Q(last_name__icontains=search_post)|Q(user__phone_number__icontains=search_post),user__end_date__isnull=True).order_by('-id')
                paginator = Paginator(page_obj, 8)
                page_number = request.GET.get('page')
                buyer_obj = paginator.get_page(page_number)
                return render(request,'user_lisiting.html',{'buyer_obj':buyer_obj,'search_start':search_start,'search_end':search_end,'search_post':search_post})
        else:
            messages.error(request, "You do not have access for this.")
            return redirect('/admin-dashboard')     

class userStatus(View):
    @method_decorator(login_required(login_url='/admin-signin'))
    def post(self,request):
        pub        = User.objects.get(id = request.POST['main_id'])
        pub.status = request.POST['status']
        pub.save()
        if pub.status == "1":
            messages.success(request, "User is activated")
            return HttpResponse(request.META.get('HTTP_REFERER'))
        else:
            messages.error(request, "User is deactivated")
            return HttpResponse(request.META.get('HTTP_REFERER'))

class deleteUser(View):
    @method_decorator(login_required(login_url='/admin-signin'))
    def get(self,request,id):
        role_user_id = User.objects.filter(id=request.user.id).first()
        if role_user_id.is_superuser:
            get_permission = [1,2,3,4,5,6,7,8,9,10,11]
        else:
            get_permission = RolesPermission.objects.filter(role = role_user_id.role)
        for i in get_permission:
            if request.user.id == 1:
                user_var = 5
            else:
                user_var =  i.permission.id
            if user_var == 5: 
                User.objects.filter(id=id).update(end_date=datetime.now())
                messages.success(request, "Deleted successfully")
                return redirect('/user-lisiting')
        else:
            messages.error(request, "You do not have access for this.")
            return redirect('/admin-dashboard')  

class addUser(View):
    @method_decorator(login_required(login_url='/admin-signin'))
    def get(self,request):
        role_user_id = User.objects.filter(id=request.user.id).first()
        if role_user_id.is_superuser:
            get_permission = [1,2,3,4,5,6,7,8,9,10,11]
        else:
            get_permission = RolesPermission.objects.filter(role = role_user_id.role)
        for i in get_permission:
            if request.user.id == 1:
                user_var = 5
            else:
                user_var =  i.permission.id
            if user_var == 5:
                return render(request,'add_user.html')
        else:
            messages.error(request, "You do not have access for this.")
            return redirect('/admin-dashboard')  
        
    def post(self,request):
        form = forms.adduserform(request.POST)
        if form.is_valid():
            
            check_number = User.objects.filter(isd_code =form.cleaned_data.get('isd_code'), phone_number=form.cleaned_data.get('phone_number'),is_buyer = True,is_profile_completed = True)
            if check_number:
                messages.warning(request, "This phone number is alreay registered with us.")
                return redirect('/add-user') 
            user_obj =  User.objects.create(
                isd_code = form.cleaned_data.get('isd_code'),
                phone_number=form.cleaned_data.get('phone_number'),
                 email=form.cleaned_data.get('email'),
                is_buyer = True,
                is_profile_completed = True)
            password = randomStringFunctionForImage()
            user_obj.set_password(password)
            theToken=str(gernateToken())
            user_obj.token=theToken
            user_obj.save()
            
            Buyer.objects.create(user_id=user_obj.id,
            first_name=form.cleaned_data.get('first_name'),
            last_name = form.cleaned_data.get('last_name'),
            dob = form.cleaned_data.get('dob'))
            if request.FILES.get('avatar'):
                fileUrl=uploadTheProfile(request.FILES.get('avatar'))
                fileUrl=str(settings.BASE_URL)+'/'+fileUrl
                user_obj.avatar=str(fileUrl)
            user_obj.save()
            html_message = render_to_string('new_user.html',{'phone_number':user_obj.isd_code+'-'+user_obj.phone_number,'password':password})
            plain_message = html_message
            from_email = settings.EMAIL_HOST_USER
            to = form.cleaned_data.get('email')
            subject = 'Registered Successfully'
            mail.send_mail(subject, plain_message, from_email, [to], html_message=html_message)
            messages.success(request,'User created successfully')
            return redirect('/user-lisiting')
        else:
            return render(request,'add_user.html',{'form':form})



class editUser(View):
    @method_decorator(login_required(login_url='/admin-signin'))
    def get(self,request,id):
        role_user_id = User.objects.filter(id=request.user.id).first()
        if role_user_id.is_superuser:
            get_permission = [1,2,3,4,5,6,7,8,9,10,11]
        else:
            get_permission = RolesPermission.objects.filter(role = role_user_id.role)
        for i in get_permission:
            if request.user.id == 1:
                user_var = 5
            else:
                user_var =  i.permission.id
            if user_var == 5:
                user_obj = User.objects.filter(id=id).first()
                buyer_obj = Buyer.objects.filter(user_id=user_obj.id).first()
                return render(request,'edit_user.html',{'user_obj':user_obj,'buyer_obj':buyer_obj})
        else:
            messages.error(request, "You do not have access for this.")
            return redirect('/admin-dashboard')  
        
    def post(self,request,id):
        form = forms.adduserform(request.POST)
        if form.is_valid():
            user_obj =  User.objects.filter(id=id).update(
                isd_code = form.cleaned_data.get('isd_code'),
                phone_number=form.cleaned_data.get('phone_number'),
                 email=form.cleaned_data.get('email'),
                is_buyer = True,
                is_profile_completed = True)

            Buyer.objects.filter(user_id = id).update(user_id= id,
            first_name=form.cleaned_data.get('first_name'),
            last_name = form.cleaned_data.get('last_name'),
            dob = form.cleaned_data.get('dob'))
            if request.FILES.get('avatar'):
                fileUrl=uploadTheProfile(request.FILES.get('avatar'))
                fileUrl=str(settings.BASE_URL)+'/'+fileUrl
                User.objects.filter(id=id).update(avatar = str(fileUrl))
            messages.success(request,'User updated successfully')
            return redirect('/user-lisiting')
        else:
            return render(request,'edit_user.html',{'form':form})




class faqlisting(View):
    @method_decorator(login_required(login_url='/admin-signin'))
    def get(self,request):
        role_user_id = User.objects.filter(id=request.user.id).first()
        if role_user_id.is_superuser:
            get_permission = [1,2,3,4,5,6,7,8,9,10,11]
        else:
            get_permission = RolesPermission.objects.filter(role = role_user_id.role)
        for i in get_permission:
            if request.user.id == 1:
                user_var = 10
            else:
                user_var =  i.permission.id
            if user_var == 10:
                search_post = request.GET.get('search')
                data_obj = Faq.objects.all().order_by('-id')
                # if search_post:
                #     data_obj = Faq.objects.filter(Q(title__icontains=search_post))
                paginator = Paginator(data_obj, 8)
                page_number = request.GET.get('page')
                faq_obj = paginator.get_page(page_number)
                return render(request,'faq_listing.html',{'faq_obj':faq_obj,'data_obj':data_obj})
        else:
            messages.error(request, "You do not have access for this.")
            return redirect('/admin-dashboard')     


class addFaq(View):
    @method_decorator(login_required(login_url='/admin-signin'))
    def get(self,request):
        role_user_id = User.objects.filter(id=request.user.id).first()
        if role_user_id.is_superuser:
            get_permission = [1,2,3,4,5,6,7,8,9,10,11]
        else:
            get_permission = RolesPermission.objects.filter(role = role_user_id.role)
        for i in get_permission:
            if request.user.id == 1:
                user_var = 10
            else:
                user_var =  i.permission.id
            if user_var == 10:
                return render(request,'add_faq.html')
        else:
            messages.error(request, "You do not have access for this.")
            return redirect('/admin-dashboard')      
    def post(self,request):
        form = forms.faqform(request.POST)
        if form.is_valid():
            english_title =  form.cleaned_data.get('english_title')
            english_content = form.cleaned_data.get('english_content')
            arabic_title = form.cleaned_data.get('arabic_title')
            arabic_content = form.cleaned_data.get('arabic_content')
            Faq.objects.create(english_title=english_title,english_content=english_content,arabic_title=arabic_title,arabic_content=arabic_content)
            messages.success(request,'FAQ created successfully')
            return redirect('/faq-listing')
        else:
            return render(request,'add_faq.html',{'form':form})


class editFaq(View):
    @method_decorator(login_required(login_url='/admin-signin'))
    def get(self,request,id):
        role_user_id = User.objects.filter(id=request.user.id).first()
        if role_user_id.is_superuser:
            get_permission = [1,2,3,4,5,6,7,8,9,10,11]
        else:
            get_permission = RolesPermission.objects.filter(role = role_user_id.role)
        for i in get_permission:
            if request.user.id == 1:
                user_var = 10
            else:
                user_var =  i.permission.id
            if user_var == 10:
                faq_obj = Faq.objects.filter(id=id).first()
                return render(request,'edit_faq.html',{'faq_obj':faq_obj})
        else:
            messages.error(request, "You do not have access for this.")
            return redirect('/admin-dashboard')   
              
    def post(self,request,id):
        form = forms.faqform(request.POST)
        if form.is_valid():
            english_title =  form.cleaned_data.get('english_title')
            english_content = form.cleaned_data.get('english_content')
            arabic_title = form.cleaned_data.get('arabic_title')
            arabic_content = form.cleaned_data.get('arabic_content')
            Faq.objects.filter(id=id).update(english_title=english_title,english_content=english_content,arabic_title=arabic_title,arabic_content=arabic_content)
            messages.success(request,'FAQ updated successfully')
            return redirect('/faq-listing')
        else:
            return render(request,'edit_faq.html',{'form':form})

class deleteFaq(View):
    @method_decorator(login_required(login_url='/admin-signin'))
    def get(self,request,id):
        role_user_id = User.objects.filter(id=request.user.id).first()
        if role_user_id.is_superuser:
            get_permission = [1,2,3,4,5,6,7,8,9,10,11]
        else:
            get_permission = RolesPermission.objects.filter(role = role_user_id.role)
        for i in get_permission:
            if request.user.id == 1:
                user_var = 10
            else:
                user_var =  i.permission.id
            if user_var == 10: 
                Faq.objects.filter(id=id).delete()
                messages.success(request, "Deleted successfully")
                return redirect('/faq-listing')
        else:
            messages.error(request, "You do not have access for this.")
            return redirect('/admin-dashboard') 

class contactManagement(View):
    @method_decorator(login_required(login_url='/admin-signin'))
    def get(self,request):
        role_user_id = User.objects.filter(id=request.user.id).first()
        if role_user_id.is_superuser:
            get_permission = [1,2,3,4,5,6,7,8,9,10,11]
        else:
            get_permission = RolesPermission.objects.filter(role = role_user_id.role)
        for i in get_permission:
            if request.user.id == 1:
                user_var = 3
            else:
                user_var =  i.permission.id
            if user_var == 3:
                user_obj = Contactmanage.objects.all().first()
                return render(request,'contact_manage.html',{'user_obj':user_obj})
        else:
            messages.error(request, "You do not have access for this.")
            return redirect('/admin-dashboard')            
    def post(self,request):
        form = forms.contactform(request.POST)
        if form.is_valid():
            data = Contactmanage.objects.all().first()
            if data:
                Contactmanage.objects.filter(id=data.id).update(
                    phone_number=form.cleaned_data.get('phone_number'),
                    whatsapp_number=form.cleaned_data.get('whatsapp_number'),
                    email=form.cleaned_data.get('email'),
                    instagram_url=form.cleaned_data.get('instagram_url'),
                    twitter_url=form.cleaned_data.get('twitter_url'),
                    youtube_url=form.cleaned_data.get('youtube_url'),
                    facebook_url=form.cleaned_data.get('facebook_url'),
                    contact_description = form.cleaned_data.get('contact_description'),
                    contact_description_ar = form.cleaned_data.get('contact_description_ar'),
                    address = form.cleaned_data.get('address')
                    )
                messages.success(request,'Contact details updated successfully')
            else:
                Contactmanage.objects.create(
                    isd_code=form.cleaned_data.get('isd_code'),
                    phone_number=form.cleaned_data.get('phone_number'),
                    whatsapp_number=form.cleaned_data.get('whatsapp_number'),
                    email=form.cleaned_data.get('email'),
                    instagram_url=form.cleaned_data.get('instagram_url'),
                    twitter_url=form.cleaned_data.get('twitter_url'),
                    youtube_url=form.cleaned_data.get('youtube_url'),
                    facebook_url=form.cleaned_data.get('facebook_url'),
                    contact_description = form.cleaned_data.get('contact_description'),
                    contact_description_ar = form.cleaned_data.get('contact_description_ar'),
                    address = form.cleaned_data.get('address')
                    )
                messages.success(request,'Contact details created successfully')
            return redirect('/contact-management')
        else:
            return render(request,'contact_manage.html',{'form':form})


class mainCategoriesList(View):
    @method_decorator(login_required(login_url='/admin-signin'))

    def get(self,request):
        role_user_id = User.objects.filter(id=request.user.id).first()
        if role_user_id.is_superuser:
            get_permission = [1,2,3,4,5,6,7,8,9,10,11]
        else:
            get_permission = RolesPermission.objects.filter(role = role_user_id.role)
        for i in get_permission:
            if request.user.id == 1:
                user_var = 1
            else:
                user_var =  i.permission.id
            if user_var == 1:
                data_obj =  MainCategories.objects.filter(end_date__isnull = True)
                search_post = request.GET.get('search')
                if search_post:
                    data_obj = MainCategories.objects.filter(Q(category_name_english__icontains=search_post)|Q(category_name_arabic__icontains=search_post))
                paginator = Paginator(data_obj, 8)
                page_number = request.GET.get('page')
                main_obj = paginator.get_page(page_number)
                return render(request,'main_categories_list.html',{'main_obj':main_obj,'search_post':search_post})
        else:
            messages.error(request, "You do not have access for this.")
            return redirect('/admin-dashboard')


class addMainCategory(View):
    @method_decorator(login_required(login_url='/admin-signin'))
    def get(self,request):
        role_user_id = User.objects.filter(id=request.user.id).first()
        if role_user_id.is_superuser:
            get_permission = [1,2,3,4,5,6,7,8,9,10,11]
        else:
            get_permission = RolesPermission.objects.filter(role = role_user_id.role)
        for i in get_permission:
            if request.user.id == 1:
                user_var = 1
            else:
                user_var =  i.permission.id
            if user_var == 1:
                return render(request,'add_maincategory.html')
        else:
            messages.error(request, "You do not have access for this.")
            return redirect('/admin-dashboard')
        
    def post(self,request):
        form = forms.addmaincategorform(request.POST)
        if form.is_valid():
            main_obj = MainCategories.objects.create(
                category_name_english=form.cleaned_data.get('category_name_english'),
                category_content_english=form.cleaned_data.get('category_content_english'),
                category_name_arabic = form.cleaned_data.get('category_name_arabic'),
                category_content_arabic = form.cleaned_data.get('category_content_arabic'))
            if request.FILES.get('category_icon'):
                fileUrl=uploadTheCategory(request.FILES.get('category_icon'))
                fileUrl=str(settings.BASE_URL)+'/'+fileUrl
                main_obj.category_icon=str(fileUrl)
            main_obj.save()
            messages.success(request,'Main category created succesfully')
            return redirect('/main-categories-list')
        else:
            return render(request,'add_maincategory.html',{'form':form})


class editMainCategory(View):
    @method_decorator(login_required(login_url='/admin-signin'))    
    def get(self,request,id):
        role_user_id = User.objects.filter(id=request.user.id).first()
        if role_user_id.is_superuser:
            get_permission = [1,2,3,4,5,6,7,8,9,10,11]
        else:
            get_permission = RolesPermission.objects.filter(role = role_user_id.role)
        for i in get_permission:
            if request.user.id == 1:
                user_var = 1
            else:
                user_var =  i.permission.id
            if user_var == 1:
                main_obj = MainCategories.objects.filter(id=id).first()
                return render(request,'edit_maincategory.html',{'main_obj':main_obj})
            
        else:
            messages.error(request, "You do not have access for this.")
            return redirect('/admin-dashboard')
        
    def post(self,request,id):
        form = forms.addmaincategorform(request.POST)
        if form.is_valid():
            MainCategories.objects.filter(id=id).update(
                category_name_english=form.cleaned_data.get('category_name_english'),
                category_content_english=form.cleaned_data.get('category_content_english'),
                category_name_arabic = form.cleaned_data.get('category_name_arabic'),
                category_content_arabic = form.cleaned_data.get('category_content_arabic')
            )
            if request.FILES.get('category_icon'):
                fileUrl=uploadTheCategory(request.FILES.get('category_icon'))
                fileUrl=str(settings.BASE_URL)+'/'+fileUrl
                MainCategories.objects.filter(id=id).update(category_icon=str(fileUrl)) 
            messages.success(request,'Main category updated successfully')
            return redirect('/main-categories-list')
        else:
            return render(request,'edit_maincategory.html',{'form':form})



class changeMainStatus(View):
    @method_decorator(login_required(login_url='/admin-signin'))
    def post(self,request):
        pub        = MainCategories.objects.get(id = request.POST['main_id'])
        pub.status = request.POST['status']
        pub.save()
        if pub.status == "1":
            messages.success(request, "Main category is activated")
            return HttpResponse(request.META.get('HTTP_REFERER'))
        else:
            messages.error(request, "Main category is deactivated")
            return HttpResponse(request.META.get('HTTP_REFERER'))

class deleteMaincategory(View):
    @method_decorator(login_required(login_url='/admin-signin'))
    def get(self,request,id):
        role_user_id = User.objects.filter(id=request.user.id).first()
        if role_user_id.is_superuser:
            get_permission = [1,2,3,4,5,6,7,8,9,10,11]
        else:
            get_permission = RolesPermission.objects.filter(role = role_user_id.role)
        for i in get_permission:
            if request.user.id == 1:
                user_var = 1
            else:
                user_var =  i.permission.id
            if user_var == 1:
                MainCategories.objects.filter(id=id).update(end_date=datetime.now())
                messages.success(request, "Deleted successfully")
                return redirect('/main-categories-list')
        else:
            messages.error(request, "You do not have access for this.")
            return redirect('/admin-dashboard')




class subCategoriesList(View):
    @method_decorator(login_required(login_url='/admin-signin'))
    def get(self,request):
        role_user_id = User.objects.filter(id=request.user.id).first()
        if role_user_id.is_superuser:
            get_permission = [1,2,3,4,5,6,7,8,9,10,11]
        else:
            get_permission = RolesPermission.objects.filter(role = role_user_id.role)
        for i in get_permission:
            if request.user.id == 1:
                user_var = 1
            else:
                user_var =  i.permission.id
            if user_var == 1:
                data_obj =  Subcategories.objects.filter(end_date__isnull = True).order_by('-id')
                search_post = request.GET.get('search')
                if search_post:
                    data_obj = Subcategories.objects.filter(Q(category_name_english__icontains=search_post)|Q(category_name_arabic__icontains=search_post)).order_by('-id')
                paginator = Paginator(data_obj, 8)
                page_number = request.GET.get('page')
                main_obj = paginator.get_page(page_number)
                return render(request,'sub_categories_list.html',{'main_obj':main_obj,'search_post':search_post})
        else:
            messages.error(request, "You do not have access for this.")
            return redirect('/admin-dashboard')

class addSubCategory(View):
    @method_decorator(login_required(login_url='/admin-signin'))
    def get(self,request):
        role_user_id = User.objects.filter(id=request.user.id).first()
        if role_user_id.is_superuser:
            get_permission = [1,2,3,4,5,6,7,8,9,10,11]
        else:
            get_permission = RolesPermission.objects.filter(role = role_user_id.role)
        for i in get_permission:
            if request.user.id == 1:
                user_var = 1
            else:
                user_var =  i.permission.id
            if user_var == 1:
                main = MainCategories.objects.filter(end_date__isnull=True)
                return render(request,'add_subcategory.html',{'main':main})
        else:
            messages.error(request, "You do not have access for this.")
            return redirect('/admin-dashboard')  

    def post(self,request):
        main = MainCategories.objects.filter(end_date__isnull=True)
        form = forms.addsubcategorform(request.POST)

        if form.is_valid():
            main_id = MainCategories.objects.filter(id=form.cleaned_data.get('main_category')).first()
            main_obj = Subcategories.objects.create(
                maincategory = main_id,
                category_name_english=form.cleaned_data.get('category_name_english'),
                category_content_english=form.cleaned_data.get('category_content_english'),
                category_name_arabic = form.cleaned_data.get('category_name_arabic'),
                category_content_arabic = form.cleaned_data.get('category_content_arabic'))
            if request.FILES.get('category_icon'):
                fileUrl=uploadTheCategory(request.FILES.get('category_icon'))
                fileUrl=str(settings.BASE_URL)+'/'+fileUrl
                main_obj.category_icon=str(fileUrl)
            main_obj.save()
            messages.success(request,'Sub category added successfully')
            return redirect('/sub-categories-list')
        else:
            return render(request,'add_subcategory.html',{'form':form,'main':main})


class editSubCategory(View):
    @method_decorator(login_required(login_url='/admin-signin'))
    def get(self,request,id):
        role_user_id = User.objects.filter(id=request.user.id).first()
        if role_user_id.is_superuser:
            get_permission = [1,2,3,4,5,6,7,8,9,10,11]
        else:
            get_permission = RolesPermission.objects.filter(role = role_user_id.role)
        for i in get_permission:
            if request.user.id == 1:
                user_var = 1
            else:
                user_var =  i.permission.id
            if user_var == 1:
                main = MainCategories.objects.filter(end_date__isnull=True)
                main_obj = Subcategories.objects.filter(id=id).first()
                return render(request,'edit_subcategory.html',{'main_obj':main_obj,'main':main})
        else:
            messages.error(request, "You do not have access for this.")
            return redirect('/admin-dashboard')  
        

    def post(self,request,id):
        form = forms.addsubcategorform(request.POST)
        if form.is_valid():
            main_id = MainCategories.objects.filter(id=form.cleaned_data.get('main_category')).first()

            Subcategories.objects.filter(id=id).update(
                maincategory = main_id.id,
                category_name_english=form.cleaned_data.get('category_name_english'),
                category_content_english=form.cleaned_data.get('category_content_english'),
                category_name_arabic = form.cleaned_data.get('category_name_arabic'),
                category_content_arabic = form.cleaned_data.get('category_content_arabic')
            )
            if request.FILES.get('category_icon'):
                fileUrl=uploadTheCategory(request.FILES.get('category_icon'))
                fileUrl=str(settings.BASE_URL)+'/'+fileUrl
                Subcategories.objects.filter(id=id).update(category_icon=str(fileUrl)) 
            messages.success(request,'Sub category updated successfully')
            return redirect('/sub-categories-list')
        else:
            return render(request,'edit_subcategory.html',{'form':form})



class changeSubStatus(View):
    @method_decorator(login_required(login_url='/admin-signin'))
    def post(self,request):
        pub        = Subcategories.objects.get(id = request.POST['main_id'])
        pub.status = request.POST['status']
        pub.save()
        if pub.status == "1":
            messages.success(request, "Subcategory is activated")
            return HttpResponse(request.META.get('HTTP_REFERER'))
        else:
            messages.error(request, "Subcategory is deactivated")
            return HttpResponse(request.META.get('HTTP_REFERER'))

class deleteSubcategory(View):
    @method_decorator(login_required(login_url='/admin-signin'))
    def get(self,request,id):
        role_user_id = User.objects.filter(id=request.user.id).first()
        if role_user_id.is_superuser:
            get_permission = [1,2,3,4,5,6,7,8,9,10,11]
        else:
            get_permission = RolesPermission.objects.filter(role = role_user_id.role)
        for i in get_permission:
            if request.user.id == 1:
                user_var = 1
            else:
                user_var =  i.permission.id
            if user_var == 1:
                Subcategories.objects.filter(id=id).update(end_date=datetime.now())
                messages.success(request, "Deleted successfully")
                return redirect('/sub-categories-list')
        else:
            messages.error(request, "You do not have access for this.")
            return redirect('/admin-dashboard') 

class stonesList(View):
    @method_decorator(login_required(login_url='/admin-signin'))
    def get(self,request):
        role_user_id = User.objects.filter(id=request.user.id).first()
        if role_user_id.is_superuser:
            get_permission = [1,2,3,4,5,6,7,8,9,10,11]
        else:
            get_permission = RolesPermission.objects.filter(role = role_user_id.role)
        for i in get_permission:
            if request.user.id == 1:
                user_var = 1
            else:
                user_var =  i.permission.id
            if user_var == 1:
                data_obj =  Stones.objects.filter(end_date__isnull = True)
                search_post = request.GET.get('search')
                if search_post:
                    data_obj = Stones.objects.filter(Q(stone_name_english__icontains=search_post)|Q(stone_name_arabic__icontains=search_post))
                paginator = Paginator(data_obj, 8)
                page_number = request.GET.get('page')
                main_obj = paginator.get_page(page_number)
                return render(request,'stone_listing.html',{'main_obj':main_obj,'search_post':search_post})
        else:
            messages.error(request, "You do not have access for this.")
            return redirect('/admin-dashboard') 
        
class addStones(View):
    @method_decorator(login_required(login_url='/admin-signin'))
    def get(self,request):
        role_user_id = User.objects.filter(id=request.user.id).first()
        if role_user_id.is_superuser:
            get_permission = [1,2,3,4,5,6,7,8,9,10,11]
        else:
            get_permission = RolesPermission.objects.filter(role = role_user_id.role)
        for i in get_permission:
            if request.user.id == 1:
                user_var = 1
            else:
                user_var =  i.permission.id
            if user_var == 1:
                return render(request,'add_stone.html')
        else:
            messages.error(request, "You do not have access for this.")
            return redirect('/admin-dashboard') 
        
    def post(self,request):
        form = forms.stonesform(request.POST)
        if form.is_valid():
            main_obj = Stones.objects.create(
                stone_name_english=form.cleaned_data.get('stone_name_english'),
                stone_name_arabic = form.cleaned_data.get('stone_name_arabic'),
                stone_content_english=form.cleaned_data.get('stone_content_english'),
                stone_content_arabic=form.cleaned_data.get('stone_content_arabic'))
            if request.FILES.get('stone_icon'):
                fileUrl=uploadTheCategory(request.FILES.get('stone_icon'))
                fileUrl=str(settings.BASE_URL)+'/'+fileUrl
                main_obj.stone_icon=str(fileUrl)
            main_obj.save()
            messages.success(request,'Stone created succesfully')
            return redirect('/stones-list')
        else:
            return render(request,'add_stone.html',{'form':form})


class editStones(View):
    @method_decorator(login_required(login_url='/admin-signin'))
    def get(self,request,id):
        role_user_id = User.objects.filter(id=request.user.id).first()
        if role_user_id.is_superuser:
            get_permission = [1,2,3,4,5,6,7,8,9,10,11]
        else:
            get_permission = RolesPermission.objects.filter(role = role_user_id.role)
        for i in get_permission:
            if request.user.id == 1:
                user_var = 1
            else:
                user_var =  i.permission.id
            if user_var == 1:
                main_obj = Stones.objects.filter(id=id).first()
                return render(request,'edit_stone.html',{'main_obj':main_obj})
        else:
            messages.error(request, "You do not have access for this.")
            return redirect('/admin-dashboard') 
        
    def post(self,request,id):
        form = forms.stonesform(request.POST)
        if form.is_valid():
            Stones.objects.filter(id=id).update(
                stone_name_english=form.cleaned_data.get('stone_name_english'),
                stone_name_arabic = form.cleaned_data.get('stone_name_arabic'),
                stone_content_english=form.cleaned_data.get('stone_content_english'),
                stone_content_arabic=form.cleaned_data.get('stone_content_arabic')
            )
            if request.FILES.get('stone_icon'):
                fileUrl=uploadTheCategory(request.FILES.get('stone_icon'))
                fileUrl=str(settings.BASE_URL)+'/'+fileUrl
                Stones.objects.filter(id=id).update(stone_icon=str(fileUrl)) 
            messages.success(request,'Stone updated successfully')
            return redirect('/stones-list')
        else:
            return render(request,'edit_stone.html',{'form':form})



class changeStoneStatus(View):
    @method_decorator(login_required(login_url='/admin-signin'))
    def post(self,request):
        pub        = Stones.objects.get(id = request.POST['main_id'])
        pub.status = request.POST['status']
        pub.save()
        if pub.status == "1":
            messages.success(request, "Stone status is activated")
            return HttpResponse(request.META.get('HTTP_REFERER'))
        else:
            messages.error(request, "Stone status is deactivated")
            return HttpResponse(request.META.get('HTTP_REFERER'))

class deleteStonecategory(View):
    @method_decorator(login_required(login_url='/admin-signin'))
    def get(self,request,id):
        role_user_id = User.objects.filter(id=request.user.id).first()
        if role_user_id.is_superuser:
            get_permission = [1,2,3,4,5,6,7,8,9,10,11]
        else:
            get_permission = RolesPermission.objects.filter(role = role_user_id.role)
        for i in get_permission:
            if request.user.id == 1:
                user_var = 1
            else:
                user_var =  i.permission.id
            if user_var == 1:
                Stones.objects.filter(id=id).update(end_date=datetime.now())
                messages.success(request, "Deleted successfully")
                return redirect('/stones-list')
        else:
            messages.error(request, "You do not have access for this.")
            return redirect('/admin-dashboard') 


class brandList(View):
    @method_decorator(login_required(login_url='/admin-signin'))
    def get(self,request):
        role_user_id = User.objects.filter(id=request.user.id).first()
        if role_user_id.is_superuser:
            get_permission = [1,2,3,4,5,6,7,8,9,10,11]
        else:
            get_permission = RolesPermission.objects.filter(role = role_user_id.role)
        for i in get_permission:
            if request.user.id == 1:
                user_var = 1
            else:
                user_var =  i.permission.id
            if user_var == 1:
                data_obj =  Brands.objects.filter(end_date__isnull = True)
                search_post = request.GET.get('search')
                if search_post:
                    data_obj = Brands.objects.filter(Q(brand_name_english__icontains=search_post)|Q(brand_name_arabic__icontains=search_post))
                paginator = Paginator(data_obj, 8)
                page_number = request.GET.get('page')
                main_obj = paginator.get_page(page_number)
                return render(request,'brand_listing.html',{'main_obj':main_obj,'search_post':search_post})
        else:
            messages.error(request, "You do not have access for this.")
            return redirect('/admin-dashboard') 
        
class addBrand(View):
    @method_decorator(login_required(login_url='/admin-signin'))
    def get(self,request):
        role_user_id = User.objects.filter(id=request.user.id).first()
        if role_user_id.is_superuser:
            get_permission = [1,2,3,4,5,6,7,8,9,10,11]
        else:
            get_permission = RolesPermission.objects.filter(role = role_user_id.role)
        for i in get_permission:
            if request.user.id == 1:
                user_var = 1
            else:
                user_var =  i.permission.id
            if user_var == 1:
                return render(request,'add_brand.html')
        else:
            messages.error(request, "You do not have access for this.")
            return redirect('/admin-dashboard')  
        
    def post(self,request):
        form = forms.brandform(request.POST)
        if form.is_valid():
            main_obj = Brands.objects.create(
                brand_name_english=form.cleaned_data.get('brand_name_english'),
                brand_name_arabic=form.cleaned_data.get('brand_name_arabic'),
                brand_content_english=form.cleaned_data.get('brand_content_english'),
                brand_content_arabic=form.cleaned_data.get('brand_content_arabic'))
            if request.FILES.get('brand_icon'):
                fileUrl=uploadTheCategory(request.FILES.get('brand_icon'))
                fileUrl=str(settings.BASE_URL)+'/'+fileUrl
                main_obj.brand_icon=str(fileUrl)
            main_obj.save()
            messages.success(request,'Brand created succesfully')
            return redirect('/brand-list')
        else:
            return render(request,'add_brand.html',{'form':form})


class editBrand(View):
    @method_decorator(login_required(login_url='/admin-signin'))
    def get(self,request,id):
        role_user_id = User.objects.filter(id=request.user.id).first()
        if role_user_id.is_superuser:
            get_permission = [1,2,3,4,5,6,7,8,9,10,11]
        else:
            get_permission = RolesPermission.objects.filter(role = role_user_id.role)
        for i in get_permission:
            if request.user.id == 1:
                user_var = 1
            else:
                user_var =  i.permission.id
            if user_var == 1:
                main_obj = Brands.objects.filter(id=id).first()
                return render(request,'edit_brand.html',{'main_obj':main_obj})
        else:
            messages.error(request, "You do not have access for this.")
            return redirect('/admin-dashboard')  
        
    def post(self,request,id):
        form = forms.brandform(request.POST)
        if form.is_valid():
            Brands.objects.filter(id=id).update(  
                brand_name_english=form.cleaned_data.get('brand_name_english'),
                brand_name_arabic=form.cleaned_data.get('brand_name_arabic'),
                brand_content_english=form.cleaned_data.get('brand_content_english'),
                brand_content_arabic=form.cleaned_data.get('brand_content_arabic')
            )
            if request.FILES.get('brand_icon'):
                fileUrl=uploadTheCategory(request.FILES.get('brand_icon'))
                fileUrl=str(settings.BASE_URL)+'/'+fileUrl
                Brands.objects.filter(id=id).update(brand_icon=str(fileUrl)) 
            messages.success(request,'Brand updated successfully')
            return redirect('/brand-list')
        else:
            return render(request,'edit_brand.html',{'form':form})



class changeBrandStatus(View):
    @method_decorator(login_required(login_url='/admin-signin'))
    def post(self,request):
        pub        = Brands.objects.get(id = request.POST['main_id'])
        pub.status = request.POST['status']
        pub.save()
        if pub.status == "1":
            messages.success(request, "Brand status is activated")
            return HttpResponse(request.META.get('HTTP_REFERER'))
        else:
            messages.error(request, "Brand status is deactivated")
            return HttpResponse(request.META.get('HTTP_REFERER'))

class deleteBrandcategory(View):
    @method_decorator(login_required(login_url='/admin-signin'))
    def get(self,request,id):
        role_user_id = User.objects.filter(id=request.user.id).first()
        if role_user_id.is_superuser:
            get_permission = [1,2,3,4,5,6,7,8,9,10,11]
        else:
            get_permission = RolesPermission.objects.filter(role = role_user_id.role)
        for i in get_permission:
            if request.user.id == 1:
                user_var = 1
            else:
                user_var =  i.permission.id
            if user_var == 1:
                Brands.objects.filter(id=id).update(end_date=datetime.now())
                messages.success(request, "Deleted successfully")
                return redirect('/stones-list')
        else:
            messages.error(request, "You do not have access for this.")
            return redirect('/admin-dashboard') 

class serviceList(View):
    @method_decorator(login_required(login_url='/admin-signin'))
    def get(self,request):
        role_user_id = User.objects.filter(id=request.user.id).first()
        if role_user_id.is_superuser:
            get_permission = [1,2,3,4,5,6,7,8,9,10,11]
        else:
            get_permission = RolesPermission.objects.filter(role = role_user_id.role)
        for i in get_permission:
            if request.user.id == 1:
                user_var = 6
            else:
                user_var =  i.permission.id
            if user_var == 6:
                data_obj =  Services.objects.filter(end_date__isnull = True)
                search_post = request.GET.get('search')
                if search_post:
                    data_obj = Services.objects.filter(Q(english_service_name__icontains=search_post)|Q(arabic_service_name__icontains=search_post))
                paginator = Paginator(data_obj, 8)
                page_number = request.GET.get('page')
                service_obj = paginator.get_page(page_number)
                return render(request,'service_listing.html',{'main_obj':service_obj,'search_post':search_post})
        else:
            messages.error(request, "You do not have access for this.")
            return redirect('/admin-dashboard')
         
class addService(View):
    @method_decorator(login_required(login_url='/admin-signin'))
    def get(self,request):
        role_user_id = User.objects.filter(id=request.user.id).first()
        if role_user_id.is_superuser:
            get_permission = [1,2,3,4,5,6,7,8,9,10,11]
        else:
            get_permission = RolesPermission.objects.filter(role = role_user_id.role)
        for i in get_permission:
            if request.user.id == 1:
                user_var = 6
            else:
                user_var =  i.permission.id
            if user_var == 6:
                return render(request,'add_service.html')
        else:
            messages.error(request, "You do not have access for this.")
            return redirect('/admin-dashboard')
        
    def post(self,request):
        form = forms.serviceform(request.POST)
        if form.is_valid():
            main_obj = Services.objects.create(
                english_service_name=form.cleaned_data.get('english_service_name'),
                arabic_service_name=form.cleaned_data.get('arabic_service_name'),
                english_service_content=form.cleaned_data.get('english_service_content'),
                arabic_service_content = form.cleaned_data.get('arabic_service_content'))
            if request.FILES.get('service_icon'):
                fileUrl=uploadTheCategory(request.FILES.get('service_icon'))
                fileUrl=str(settings.BASE_URL)+'/'+fileUrl
                main_obj.service_icon=str(fileUrl)
            main_obj.save()
            messages.success(request,'Service created succesfully')
            return redirect('/service-list')
        else:
            return render(request,'add_service.html',{'form':form})


class editService(View):
    @method_decorator(login_required(login_url='/admin-signin'))
    def get(self,request,id):
        role_user_id = User.objects.filter(id=request.user.id).first()
        if role_user_id.is_superuser:
            get_permission = [1,2,3,4,5,6,7,8,9,10,11]
        else:
            get_permission = RolesPermission.objects.filter(role = role_user_id.role)
        for i in get_permission:
            if request.user.id == 1:
                user_var = 6
            else:
                user_var =  i.permission.id
            if user_var == 6:
                main_obj = Services.objects.filter(id=id).first()
                return render(request,'edit_service.html',{'main_obj':main_obj})
        else:
            messages.error(request, "You do not have access for this.")
            return redirect('/admin-dashboard')
        

    def post(self,request,id):
        form = forms.serviceform(request.POST)
        if form.is_valid():
            Services.objects.filter(id=id).update(  
                english_service_name=form.cleaned_data.get('english_service_name'),
                arabic_service_name=form.cleaned_data.get('arabic_service_name'),
                english_service_content=form.cleaned_data.get('english_service_content'),
                arabic_service_content = form.cleaned_data.get('arabic_service_content')
            )
            if request.FILES.get('service_icon'):
                fileUrl=uploadTheCategory(request.FILES.get('service_icon'))
                fileUrl=str(settings.BASE_URL)+'/'+fileUrl
                Services.objects.filter(id=id).update(service_icon=str(fileUrl)) 
            messages.success(request,'Service updated successfully')
            return redirect('/service-list')
        else:
            return render(request,'edit_service.html',{'form':form})



class changeServiceStatus(View):
    @method_decorator(login_required(login_url='/admin-signin'))
    def post(self,request):
        pub        = Services.objects.get(id = request.POST['main_id'])
        pub.status = request.POST['status']
        pub.save()
        if pub.status == "1":
            messages.success(request, "Service status is activated")
            return HttpResponse(request.META.get('HTTP_REFERER'))
        else:
            messages.error(request, "Service status is deactivated")
            return HttpResponse(request.META.get('HTTP_REFERER'))

class deleteServicecategory(View):
    @method_decorator(login_required(login_url='/admin-signin'))
    def get(self,request,id):
        role_user_id = User.objects.filter(id=request.user.id).first()
        if role_user_id.is_superuser:
            get_permission = [1,2,3,4,5,6,7,8,9,10,11]
        else:
            get_permission = RolesPermission.objects.filter(role = role_user_id.role)
        for i in get_permission:
            if request.user.id == 1:
                user_var = 6
            else:
                user_var =  i.permission.id
            if user_var == 6:
                Services.objects.filter(id=id).update(end_date=datetime.now())
                messages.success(request, "Deleted successfully")
                return redirect('/service-list')
        else:
            messages.error(request, "You do not have access for this.")
            return redirect('/admin-dashboard')

class storeRequestListing(View):
    @method_decorator(login_required(login_url='/admin-signin'))
    def get(self,request):
        role_user_id = User.objects.filter(id=request.user.id).first()
        if role_user_id.is_superuser:
            get_permission = [1,2,3,4,5,6,7,8,9,10,11]
        else:
            get_permission = RolesPermission.objects.filter(role = role_user_id.role)
        for i in get_permission:
            if request.user.id == 1:
                user_var = 2
            else:
                user_var =  i.permission.id
            if user_var == 2:
                store_data = StoreRequests.objects.all().order_by('-id')
                search_post = request.GET.get('search')
                if search_post:
                    store_data = StoreRequests.objects.filter(Q(email__icontains=search_post)).exclude(status=1)
                paginator = Paginator(store_data, 8)
                page_number = request.GET.get('page')
                store_obj = paginator.get_page(page_number)
                return render(request,'store_request_list.html',{'store_obj':store_obj,'search_post':search_post})
        else:
            messages.error(request, "You do not have access for this.")
            return redirect('/admin-dashboard') 
        
class viewStoreRequest(View):
    @method_decorator(login_required(login_url='/admin-signin'))
    def get(self,request,id):
        role_user_id = User.objects.filter(id=request.user.id).first()
        if role_user_id.is_superuser:
            get_permission = [1,2,3,4,5,6,7,8,9,10,11]
        else:
            get_permission = RolesPermission.objects.filter(role = role_user_id.role)
        for i in get_permission:
            if request.user.id == 1:
                user_var = 2
            else:
                user_var =  i.permission.id
            if user_var == 2:
                store_obj = StoreRequests.objects.filter(id=id).first()
                return render(request,'view_request_list.html',{'store_obj':store_obj}) 
        else:
            messages.error(request, "You do not have access for this.")
            return redirect('/admin-dashboard') 
        
class disapproveStoreRequest(View):
    @method_decorator(login_required(login_url='/admin-signin'))
    def get(self,request,id):
        role_user_id = User.objects.filter(id=request.user.id).first()
        if role_user_id.is_superuser:
            get_permission = [1,2,3,4,5,6,7,8,9,10,11]
        else:
            get_permission = RolesPermission.objects.filter(role = role_user_id.role)
        for i in get_permission:
            if request.user.id == 1:
                user_var = 2
            else:
                user_var =  i.permission.id
            if user_var == 2:
                store_obj = StoreRequests.objects.filter(id=id).first()
                return render(request,'disapprove_store_request.html',{'store_obj':store_obj})
        else:
            messages.error(request, "You do not have access for this.")
            return redirect('/admin-dashboard') 
        
    def post(self,request,id):
        form = forms.disapprovestoreform(request.POST)
        if form.is_valid():
            store_obj = StoreRequests.objects.filter(id=id).first()
            message = form.cleaned_data.get('message')
            StoreRequests.objects.filter(id=id).update(status=2,message=message)
            html_message = render_to_string('store_disapproved_mail.html',{'message':message})
            plain_message = html_message
            from_email = settings.EMAIL_HOST_USER
            to = store_obj.email
            subject = 'Store Request Disapproved'
            mail.send_mail(subject, plain_message, from_email, [to], html_message=html_message)
            messages.success(request,'Disapproved Successfully')
            return redirect('/store-request-listing')
        else:
            return render(request,'disapprove_store_request.html',{'form':form})  

class approveStoreRequest(View):
    @method_decorator(login_required(login_url='/admin-signin'))
    def get(self,request,id):
        role_user_id = User.objects.filter(id=request.user.id).first()
        if role_user_id.is_superuser:
            get_permission = [1,2,3,4,5,6,7,8,9,10,11]
        else:
            get_permission = RolesPermission.objects.filter(role = role_user_id.role)
        for i in get_permission:
            if request.user.id == 1:
                user_var = 2
            else:
                user_var =  i.permission.id
            if user_var == 2:
                store_req = StoreRequests.objects.filter(id=id).first()
                string_password =  randomStringFunctionForPw()
                password = handler.hash(string_password)
                user_obj = User.objects.create(isd_code = store_req.isd_code,phone_number = store_req.mobile_number,email=store_req.email,password=password,is_seller=1)
                Stores.objects.create(user_id=user_obj.id)
                html_message = render_to_string('store_approved.html',{'password':string_password,'isd_code':store_req.isd_code,'phone_number':store_req.mobile_number})
                plain_message = html_message
                from_email = settings.EMAIL_HOST_USER
                to = store_req.email
                subject = 'Store Request Approved Successfully'
                mail.send_mail(subject, plain_message, from_email, [to], html_message=html_message)
                StoreRequests.objects.filter(id=id).update(status = 1)
                messages.success(request,'Stored Approved Successfully')
                return redirect('/store-request-listing')
        else:
            messages.error(request, "You do not have access for this.")
            return redirect('/admin-dashboard') 

class storeListing(View):
    @method_decorator(login_required(login_url='/admin-signin'))
    def get(self,request):
        role_user_id = User.objects.filter(id=request.user.id).first()
        if role_user_id.is_superuser:
            get_permission = [1,2,3,4,5,6,7,8,9,10,11]
        else:
            get_permission = RolesPermission.objects.filter(role = role_user_id.role)
        for i in get_permission:
            if request.user.id == 1:
                user_var = 2
            else:
                user_var =  i.permission.id
            if user_var == 2:      
                data_obj =  Stores.objects.filter(end_date__isnull = True,is_profile_completed=True).order_by('-id')
                search_start = request.GET.get('start_date')
                search_end = request.GET.get('end_date')
                time = datetime.now().strftime('%H:%M:%S')
                if search_start:
                    data_obj = Stores.objects.filter(start_date__range=[search_start, search_end + ' '+ time],end_date__isnull = True).order_by('-id')
                search_post = request.GET.get('search')
                if search_post:
                    data_obj = Stores.objects.filter(Q(store_name_english__icontains=search_post)|Q(store_name_arabic__icontains=search_post)|Q(store_email__icontains=search_post)|Q(store_number__icontains=search_post),end_date__isnull=True).order_by('-id')
                paginator = Paginator(data_obj, 8)
                page_number = request.GET.get('page')
                store_obj = paginator.get_page(page_number)
                return render(request,'store_listing.html',{'store_obj':store_obj,'search_start':search_start,'search_end':search_end,'search_post':search_post})
        else:
            messages.error(request, "You do not have access for this.")
            return redirect('/admin-dashboard') 

class getStoreDetails(View):
    @method_decorator(login_required(login_url='/admin-signin'))
    def get(self,request,id):
        store_obj = Stores.objects.filter(id=id,end_date__isnull = True).first()
        return render(request,'store_details.html',{'store_obj':store_obj})




class changeStoreStatus(View):
    @method_decorator(login_required(login_url='/admin-signin'))
    def post(self,request):
        pub        = Stores.objects.get(id = request.POST['main_id'])
        pub.status = request.POST['status']
        pub.save()
        store_obj = Stores.objects.filter(id=request.POST['main_id']).first()
        store_user = User.objects.filter(id=store_obj.user_id).first()
        store_user.status = request.POST['status']
        store_user.save()
        if pub.status == "1":
            messages.success(request, "Store status is activated")
            return HttpResponse(request.META.get('HTTP_REFERER'))
        else:
            messages.error(request, "Store status is deactivated")
            return HttpResponse(request.META.get('HTTP_REFERER'))




class getAdminNotifications(View):
    @method_decorator(login_required(login_url='/admin-signin'))
    def get(self,request):
        role_user_id = User.objects.filter(id=request.user.id).first()
        if role_user_id.is_superuser:
            get_permission = [1,2,3,4,5,6,7,8,9,10,11]
        else:
            get_permission = RolesPermission.objects.filter(role = role_user_id.role)
        for i in get_permission:
            if request.user.id == 1:
                user_var = 3
            else:
                user_var =  i.permission.id
            if user_var == 3: 
                not_obj = AdminNotifications.objects.filter(end_date__isnull = True).order_by('-id')
                search_start = request.GET.get('start_date')
                time = '22:44:46.873182+00'
               
                search_end = request.GET.get('end_date') 
                if search_start:
                    not_obj = AdminNotifications.objects.filter(start_date__range=[search_start, search_end + ' '+ time],end_date__isnull=True).order_by('-id')
                
                paginator = Paginator(not_obj, 10)
                page_number = request.GET.get('page')
                notify_obj = paginator.get_page(page_number)
                return render(request,'get_admin_notifications.html',{"notify_obj":notify_obj,'search_start':search_start,'search_end':search_end})
        else:
            messages.error(request, "You do not have access for this.")
            return redirect('/admin-dashboard') 

class deleteAdminNotifications(View):
    @method_decorator(login_required(login_url='/admin-signin'))

    def get(self,request):
        role_user_id = User.objects.filter(id=request.user.id).first()
        if role_user_id.is_superuser:
            get_permission = [1,2,3,4,5,6,7,8,9,10,11]
        else:
            get_permission = RolesPermission.objects.filter(role = role_user_id.role)
        for i in get_permission:
            if request.user.id == 1:
                user_var = 3
            else:
                user_var =  i.permission.id
            if user_var == 3:
                ids = request.GET.get('delete_id')
                if ids:
                    int_id_list = [int(id) for id in ids.split(',')]
                    AdminNotifications.objects.filter(pk__in=int_id_list).delete()
                    messages.success(request,"Deleted Sucessfully")
                else:
                    messages.error(request,"At least One notification must be selected")
                return redirect('/get-admin-notifications')
        else:
            messages.error(request, "You do not have access for this.")
            return redirect('/admin-dashboard') 
        

class readNotification(View):
    @method_decorator(login_required(login_url='/admin-signin'))
    def get(self,request):
        role_user_id = User.objects.filter(id=request.user.id).first()
        if role_user_id.is_superuser:
            get_permission = [1,2,3,4,5,6,7,8,9,10,11]
        else:
            get_permission = RolesPermission.objects.filter(role = role_user_id.role)
        for i in get_permission:
            if request.user.id == 1:
                user_var = 3
            else:
                user_var =  i.permission.id
            if user_var == 3:
                not_obj = AdminNotifications.objects.all().last()
                not_obj.is_read = False
                not_obj.save()
                return redirect('/get-admin-notifications') 
        else:
            messages.error(request, "You do not have access for this.")
            return redirect('/admin-dashboard') 


class marketingRequestList(View):
    @method_decorator(login_required(login_url='/admin-signin'))
    def get(self,request):
        role_user_id = User.objects.filter(id=request.user.id).first()
        if role_user_id.is_superuser:
            get_permission = [1,2,3,4,5,6,7,8,9,10,11]
        else:
            get_permission = RolesPermission.objects.filter(role = role_user_id.role)
        for i in get_permission:
            if request.user.id == 1:
                user_var = 8
            else:
                user_var =  i.permission.id
            if user_var == 8:
                data_obj = MarketingRequest.objects.all().order_by('-id')
                search_post = request.GET.get('search')
                if search_post:
                    data_obj = MarketingRequest.objects.filter(Q(product_name=search_post)|Q(owner_name=search_post),end_date__isnull=True).order_by('-id')
                paginator = Paginator(data_obj, 8)
                page_number = request.GET.get('page')
                req_obj = paginator.get_page(page_number)
                return render(request,'marketing_request_list.html',{'req_obj':req_obj,'search_post':search_post})
        else:
            messages.error(request, "You do not have access for this.")
            return redirect('/admin-dashboard') 

class marketingRequestDetail(View):
    @method_decorator(login_required(login_url='/admin-signin'))
    def get(self,request,id):
        role_user_id = User.objects.filter(id=request.user.id).first()
        if role_user_id.is_superuser:
            get_permission = [1,2,3,4,5,6,7,8,9,10,11]
        else:
            get_permission = RolesPermission.objects.filter(role = role_user_id.role)
        for i in get_permission:
            if request.user.id == 1:
                user_var = 8
            else:
                user_var =  i.permission.id
            if user_var == 8:
                req_obj = MarketingRequest.objects.filter(id=id).first()
                return render(request,'marketing_details.html',{'req_obj':req_obj})
        else:
            messages.error(request, "You do not have access for this.")
            return redirect('/admin-dashboard') 


class customerReportSections(View):
    @method_decorator(login_required(login_url='/admin-signin'))
    def get(self,request):
        role_user_id = User.objects.filter(id=request.user.id).first()
        if role_user_id.is_superuser:
            get_permission = [1,2,3,4,5,6,7,8,9,10,11]
        else:
            get_permission = RolesPermission.objects.filter(role = role_user_id.role)
        for i in get_permission:
            if request.user.id == 1:
                user_var = 7
            else:
                user_var =  i.permission.id
            if user_var == 7:
                return render(request,'customer_report.html')
        else:
            messages.error(request, "You do not have access for this.")
            return redirect('/admin-dashboard') 

class StoresReportSections(View):
    @method_decorator(login_required(login_url='/admin-signin'))
    def get(self,request):
        role_user_id = User.objects.filter(id=request.user.id).first()
        if role_user_id.is_superuser:
            get_permission = [1,2,3,4,5,6,7,8,9,10,11]
        else:
            get_permission = RolesPermission.objects.filter(role = role_user_id.role)
        for i in get_permission:
            if request.user.id == 1:
                user_var = 7
            else:
                user_var =  i.permission.id
            if user_var == 7:
                allData = []
                stores_obj =  Stores.objects.filter(end_date__isnull=True,is_profile_completed = 1)

                order_obj = orderPack.objects.all()
                search_start = request.GET.get('start_date')
                search_end = request.GET.get('end_date')
                store_id = request.GET.get('store_id')
                delivery_status = request.GET.get('delivery_status')
                payment_status  = request.GET.get('payment_status')
                time = "11:59:59"
                lookups = Q()
                if search_start and search_end:
                    lookups.add(Q(created_at__range=[search_start, search_end + ' '+ time]), Q.AND)

                if store_id:
                    lookups.add(Q(productDetail__product__store=store_id), Q.AND)

                if delivery_status:
                    lookups.add(Q(delivery_status=int(delivery_status)), Q.AND)
                
                if payment_status:
                    lookups.add(Q(isPaid=int(payment_status)), Q.AND)

                order_obj = orderPack.objects.filter(lookups).order_by('-id')
        
                search_post = request.GET.get('search')
                if search_post:
                    order_obj = orderPack.objects.filter(Q(orderId__icontains=search_post)).order_by('-id')
                for order in order_obj:
                    allData.append(order)
                paginator = Paginator(allData, 10)
                page_number = request.GET.get('page')
                order_obj = paginator.get_page(page_number)
                csv_export = request.GET.get('csv_export')
                if csv_export:
                    response = HttpResponse(content_type='text/csv')
                    response['Content-Disposition'] = 'attachment; filename="mydata.csv"'
                    writer = csv.writer(response)
                    writer.writerow(['OrderID', 'Customer', 'Order Date', 'Total Amount', 'Delivery Status', 'Payment Status', 'Store ID'])

                    # Write the query results to the CSV file
                    for row in allData:
                        if row.delivery_status == 0:
                            delivery_status = 'Pending'
                        elif row.delivery_status == 1:
                            delivery_status = 'On the way'
                        else:
                            delivery_status = 'Delivered'
                        
                        if row.isPaid == 1:
                            payment_status = 'Paid'
                        else:
                            payment_status = 'Unpaid'
                        writer.writerow([row.orderId, row.customer.email, row.created_at,row.totalAmount,delivery_status,payment_status,row.productDetail.product.store.id])
                    return response
                vat_value = CommissionSection.objects.all().first()
                return render(request,'store_report.html',{'search_start':search_start,'search_end':search_end,'all_order':order_obj,'search_post':search_post,'stores_obj':stores_obj,'store_id_send':store_id,'delivery_status_send':delivery_status,'payment_status_send':payment_status,'vat_value':vat_value.vat_percentage})     
        else:
            messages.error(request, "You do not have access for this.")
            return redirect('/admin-dashboard') 


class addRoleAdmin(View):
    @method_decorator(login_required(login_url='/admin-signin'))
    def get(self,request):
        permission_obj = Permissions.objects.all()
        return render(request,'add_role.html',{'permission_obj':permission_obj})
    
    def post(self,request):
        form = forms.addroleform(request.POST)
        if form.is_valid():
            role_name = form.cleaned_data.get('role_name')
            role_id= Roles.objects.create(role_name=role_name)
            list_drop =request.POST.getlist("permission_data")
            for i in list_drop:
                permission_obj = Permissions.objects.filter(id=i).first()
                RolesPermission.objects.create(role=role_id,permission=permission_obj)
            messages.success(request,'Role created successfully')
            return redirect('/role-listing-admin')
        else:
            return render(request,'add_role.html',{'form':form})

class roleListingAdmin(View):
    @method_decorator(login_required(login_url='/admin-signin'))
    def get(self,request):
        roles_obj_data = Roles.objects.filter(end_date__isnull = True)
        search_post = request.GET.get('search')
        if search_post:
            roles_obj_data = Roles.objects.filter(Q(role_name__icontains=search_post),end_date__isnull = True)
        paginator = Paginator(roles_obj_data, 8)
        page_number = request.GET.get('page')
        roles_obj = paginator.get_page(page_number)
        return render(request,'role_listing.html',{'roles_obj':roles_obj,'search_post':search_post})


class editRoleAdmin(View):
    @method_decorator(login_required(login_url='/admin-signin'))
    def get(self,request,id):
        permission_obj = Permissions.objects.all()
        role = Roles.objects.filter(id=id,end_date__isnull = True).first()
        role_obj = RolesPermission.objects.filter(role=id)

        return render(request,'edit_role.html',{'role_obj':role_obj,'role':role,'permission_obj':permission_obj})
    def post(self,request,id):
        form = forms.addroleform(request.POST)
        if form.is_valid():
            role_name = form.cleaned_data.get('role_name')
            role_id= Roles.objects.filter(id=id,end_date__isnull = True).update(role_name=role_name)
            list_drop =request.POST.getlist("permission_data")
            role_delete = RolesPermission.objects.filter(role=id)
            for role in role_delete:
                role.delete()
            for i in list_drop:
                permission_obj = Permissions.objects.filter(id=i).first()
                role_obj = Roles.objects.filter(id=id).first()
                RolesPermission.objects.create(role=role_obj,permission=permission_obj)
            messages.success(request,'Role updated successfully')
            return redirect('/role-listing-admin')
        else:
            return render(request,'edit_role.html',{'form':form})

class deleteRole(View):
    @method_decorator(login_required(login_url='/admin-signin'))
    def get(self,request,id):
        Roles.objects.filter(id=id).update(end_date=datetime.now())
        messages.success(request, "Deleted successfully")
        return redirect('/role-listing-admin')



class subAdminManagement(View):
    @method_decorator(login_required(login_url='/admin-signin'))
    def get(self,request):
        user_obj_data = User.objects.filter(role__isnull = False).order_by('-id')
        search_post = request.GET.get('search')
        if search_post:
            user_obj_data = User.objects.filter(Q(full_name__icontains=search_post)|Q(email__icontains=search_post))
        paginator = Paginator(user_obj_data, 8)
        page_number = request.GET.get('page')
        user_obj = paginator.get_page(page_number)
        return render(request,'sub_admin_management.html',{'user_obj':user_obj,'search_post':search_post})
    

class addSubAdmin(View):
    @method_decorator(login_required(login_url='/admin-signin'))
    def get(self,request):
        roles_data = Roles.objects.filter(end_date__isnull = True)
        return render(request,'add_sub_admin.html',{'roles_obj':roles_data})
    

    def post(self,request):
        form = forms.addsubadminform(request.POST)
        if form.is_valid():
            full_name = form.cleaned_data.get('full_name')
            isd_code = form.cleaned_data.get('isd_code')
            phone_number = form.cleaned_data.get('phone_number')
            email= form.cleaned_data.get('email')
            password = form.cleaned_data.get('password')
            confirm_password = form.cleaned_data.get('confirm_password')
            role_id = form.cleaned_data.get('role_id')
            role_name = Roles.objects.filter(id=role_id,end_date__isnull = True).first()
            user_data = User.objects.create(full_name=full_name,isd_code=isd_code,phone_number=phone_number,email=email,role=role_id,role_name=role_name.role_name)
            user_data.set_password(password)
            user_data.save()
            if request.FILES.get('avatar'):
                fileUrl=uploadTheImages(request.FILES.get('avatar'))
                fileUrl=str(settings.BASE_URL)+'/'+fileUrl
                user_data.avatar=str(fileUrl)
                user_data.save()
            subject = 'Sub Admin Details'
            html_message = render_to_string('sub_admin_mail.html', {'email': email,'password':password})
            plain_message = html_message
            from_email = settings.EMAIL_HOST_USER
            to = email
            mail.send_mail(subject, plain_message, from_email, [to], html_message=html_message)
            messages.success(request,'Added successfully')
            return redirect('/sub-admin-management')
        else:

            return render(request,'add_sub_admin.html',{'form':form})


class editSubAdmin(View):
    @method_decorator(login_required(login_url='/admin-signin'))
    def get(self,request,id):
        roles_data = Roles.objects.filter(end_date__isnull = True)
        user_obj = User.objects.filter(role__isnull = False,id=id).first()
        return render(request,'edit_sub_admin.html',{'user_obj':user_obj,'roles_obj':roles_data})

    def post(self,request,id):
        form = forms.editsubadminform(request.POST)
        if form.is_valid():
            full_name = form.cleaned_data.get('full_name')
            isd_code = form.cleaned_data.get('isd_code')
            phone_number = form.cleaned_data.get('phone_number')
            email= form.cleaned_data.get('email')
            role_id = form.cleaned_data.get('role_id')
            role_name = Roles.objects.filter(id=role_id,end_date__isnull = True).first()
            user_data = User.objects.filter(id=id).update(full_name=full_name,isd_code=isd_code,phone_number=phone_number,email=email,role=role_id,role_name=role_name.role_name)
            messages.success(request,'Updated successfully')
            return redirect('/sub-admin-management')
        else:
            return render(request,'edit_sub_admin.html',{'form':form})
        


class changeSubAdminStatus(View):
    @method_decorator(login_required(login_url='/admin-signin'))
    def post(self,request):
        pub        = User.objects.get(id = request.POST['main_id'])
        pub.status = request.POST['status']
        pub.save()
        if pub.status == "1":
            messages.success(request, "User is activated")
            return HttpResponse(request.META.get('HTTP_REFERER'))
        else:
            messages.error(request, "User is deactivated")
            return HttpResponse(request.META.get('HTTP_REFERER'))
        


class addTranscationWallet(View):
    @method_decorator(login_required(login_url='/admin-signin'))
    def get(self,request):
        buyer_obj = Buyer.objects.all()
        return render(request,'add_transcation_wallet.html',{'buyer_obj':buyer_obj})
    def post(self,request):
        form = forms.addtranscationwalletform(request.POST)
        if form.is_valid():
            type = form.cleaned_data.get('type')
            buyer = form.cleaned_data.get('buyer')
            buyer_obj =  Buyer.objects.filter(id=buyer).first()
            amount = form.cleaned_data.get('amount')
            reason = form.cleaned_data.get('reason')
            transcation_type  = 'Manual'
            if type == "Addition":
                amount_obj = Buyer.objects.filter(id=buyer).first()
                new_amount = int(amount_obj.wallet_amount) + int(amount)
                Buyer.objects.filter(id=buyer).update(wallet_amount=new_amount)
            else:
                amount_obj = Buyer.objects.filter(id=buyer).first()
                new_amount = int(amount_obj.wallet_amount) - int(amount)
                Buyer.objects.filter(id=buyer).update(wallet_amount=new_amount)

            Wallet.objects.create(type=type,buyer=buyer_obj,amount=amount,reason=reason,transcation_type=transcation_type,balance=new_amount)
            messages.success(request,'Added successfully')
            return redirect('/transcation-wallet-list')
        else:
            return render(request,'add_transcation_wallet.html',{'form':form})
        



class transcationWalletList(View):
    @method_decorator(login_required(login_url='/admin-signin'))
    def get(self,request):
        wallet_obj = Wallet.objects.all().order_by('-id')
        search_post = request.GET.get('search')
        if search_post:
            wallet_obj = Wallet.objects.filter(Q(amount__icontains=search_post)|Q(type__icontains=search_post)|Q(transcation_type__icontains=search_post)|Q(order_id__icontains=search_post)|Q(buyer__user__id__icontains=search_post))
        search_start = request.GET.get('start_date')
        time = datetime.now().strftime('%H:%M:%S')
        search_end = request.GET.get('end_date') 
        if search_start:
            wallet_obj = Wallet.objects.filter(start_date__range=[search_start, search_end + ' '+ time],end_date__isnull=True).order_by('-id')
        paginator = Paginator(wallet_obj, 8)
        page_number = request.GET.get('page')
        wallet = paginator.get_page(page_number)
        return render(request,'transcation_wallet_list.html',{'wallet_obj':wallet,'search_post':search_post,'search_start':search_start,'search_end':search_end})



class generalSettingAdmin(View):
    def get(self,request):
        commissionObj = CommissionSection.objects.all().first()
        return render(request,'general_settings.html',{'commission':commissionObj})  
                
    def post(self,request):
            form = forms.commissionsectionform(request.POST)
            if form.is_valid():
                vat_number = form.cleaned_data.get('vat_number')
                vat_percentage = form.cleaned_data.get('vat_percentage')
                commissin_obj =  CommissionSection.objects.all().first()
                if commissin_obj:
                    commissin_obj.vat_number = vat_number
                    commissin_obj.vat_percentage = vat_percentage
                    commissin_obj.save()
                else:
                    commissin_obj = CommissionSection.objects.create(vat_number=vat_number,vat_percentage=vat_percentage)
                messages.success(request,'Saved successfully')
                return redirect('/general-setting-admin')
            else:
                return render(request,'general_settings.html',{'form':form})
            
class StoresInvoiceReportSections(View):
    @method_decorator(login_required(login_url='/admin-signin'))
    def get(self,request):
        role_user_id = User.objects.filter(id=request.user.id).first()
        if role_user_id.is_superuser:
            get_permission = [1,2,3,4,5,6,7,8,9,10,11]
        else:
            get_permission = RolesPermission.objects.filter(role = role_user_id.role)
        for i in get_permission:
            if request.user.id == 1:
                user_var = 7
            else:
                user_var =  i.permission.id
            if user_var == 7:
                allData = []
                stores_obj =  Stores.objects.filter(end_date__isnull=True,is_profile_completed = 1)

                serviceInvoice_obj = ServiceInvoice.objects.all()
                search_start = request.GET.get('start_date')
                search_end = request.GET.get('end_date')
                store_id = request.GET.get('store_id')
                delivery_status = request.GET.get('delivery_status')
                payment_status  = request.GET.get('payment_status')
                time = "11:59:59"
                lookups = Q()
                if search_start and search_end:
                    lookups.add(Q(start_date__range=[search_start, search_end + ' '+ time]), Q.AND)

                if store_id:
                    lookups.add(Q(store=store_id), Q.AND)
                
                if payment_status:
                    lookups.add(Q(is_paid=int(payment_status)), Q.AND)

                serviceInvoice_obj = ServiceInvoice.objects.filter(lookups).order_by('-id')
        
                search_post = request.GET.get('search')
                if search_post:
                    serviceInvoice_obj = ServiceInvoice.objects.filter(Q(orderId__icontains=search_post)).order_by('-id')
                for order in serviceInvoice_obj:
                    allData.append(order)
                paginator = Paginator(allData, 10)
                page_number = request.GET.get('page')
                serviceInvoice_obj = paginator.get_page(page_number)
                csv_export = request.GET.get('csv_export')
                if csv_export:
                    response = HttpResponse(content_type='text/csv')
                    response['Content-Disposition'] = 'attachment; filename="mydata.csv"'
                    writer = csv.writer(response)
                    writer.writerow(['InvoiceNo.', 'Customer', 'Order Date', 'Total Amount', 'Payment Status', 'Store ID'])

                    # Write the query results to the CSV file
                    for row in allData:
                        if row.is_paid == True:
                            payment_status = 'Paid'
                        else:
                            payment_status = 'Unpaid'
                        writer.writerow([row.invoice_number, row.customer_name, row.start_date,row.total_amount,payment_status,row.store.id])
                    return response
                return render(request,'store_service_report.html',{'search_start':search_start,'search_end':search_end,'all_order':serviceInvoice_obj,'search_post':search_post,'stores_obj':stores_obj,'store_id_send':store_id,'delivery_status_send':delivery_status,'payment_status_send':payment_status})     
        else:
            messages.error(request, "You do not have access for this.")
            return redirect('/admin-dashboard')