import json
import logging

from django.views import View 
from django.conf import settings
from django.shortcuts import render, redirect
from django.core.mail.message import EmailMessage
from django.http import JsonResponse, HttpResponse
from django.template.loader import render_to_string
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger

from apps.subscriptions.models import Plan, PlanType
from apps.process.utils import get_media, last_uploaded_pm 
from apps.accounts.utils import contact_us_send_message, add_mailer_user
from apps.process.models import ProcessedMedia
from apps.process.tasks import delete_mailerlite_user

# Create a logger for this file
logger = logging.getLogger(__file__)

# Create your views here.
def is_ajax(request):
    return request.META.get('HTTP_X_REQUESTED_WITH') == 'XMLHttpRequest'

class RemoverView(View):
    """ Index view """
    def get(self, request, *args, **kwargs):
        # code to process a GET request:
        if request.user.is_authenticated:
            return redirect("landing:dashboard")
        context = {
            'plans_monthly': Plan.objects.filter(plan_duration=PlanType.Monthly).order_by('price'),
            'plans_yearly': Plan.objects.filter(plan_duration=PlanType.Yearly).order_by('price'),
            'plans_weekly': Plan.objects.filter(plan_duration=PlanType.Weekly).order_by('price'),
        }
        template = "landing/index.html"
        return render(request, template,context)

    def post(self, request, *args, **kwargs):
        # code to process a POST request
        if request.user.is_authenticated:
            pass

class EnhancerView(View):
    """ Index view """
    def get(self, request, *args, **kwargs):
        # code to process a GET request:
        if request.user.is_authenticated:
            return redirect("landing:dashboard")
        context = {
            'plans_monthly': Plan.objects.filter(plan_duration=PlanType.Monthly).order_by('price'),
            'plans_yearly': Plan.objects.filter(plan_duration=PlanType.Yearly).order_by('price'),
            'plans_weekly': Plan.objects.filter(plan_duration=PlanType.Weekly).order_by('price'),
        }
        template = "landing/enhancement.html"
        return render(request, template, context)

    def post(self, request, *args, **kwargs):
        # code to process a POST request
        if request.user.is_authenticated:
            pass

class Home1View(View):
    """ Index view """
    def get(self, request, *args, **kwargs):
        # code to process a GET request:
        if request.user.is_authenticated:
            return redirect("landing:dashboard")
        context = {
            'plans_monthly': Plan.objects.filter(plan_duration=PlanType.Monthly).order_by('price'),
            'plans_yearly': Plan.objects.filter(plan_duration=PlanType.Yearly).order_by('price'),
            'plans_weekly': Plan.objects.filter(plan_duration=PlanType.Weekly).order_by('price'),
        }
        template = "landing/home1.html"
        return render(request, template, context)

    def post(self, request, *args, **kwargs):
        # code to process a POST request
        if request.user.is_authenticated:
            pass

class Home2View(View):
    """ Index view """
    def get(self, request, *args, **kwargs):
        # code to process a GET request:
        if request.user.is_authenticated:
            return redirect("landing:dashboard")
        context = {
            'plans_monthly': Plan.objects.filter(plan_duration=PlanType.Monthly).order_by('price'),
            'plans_yearly': Plan.objects.filter(plan_duration=PlanType.Yearly).order_by('price'),
            'plans_weekly': Plan.objects.filter(plan_duration=PlanType.Weekly).order_by('price'),
        }
        template = "landing/home2.html"
        return render(request, template, context)

    def post(self, request, *args, **kwargs):
        # code to process a POST request
        if request.user.is_authenticated:
            pass

class Home3View(View):
    """ Index view """
    def get(self, request, *args, **kwargs):
        # code to process a GET request:
        if request.user.is_authenticated:
            return redirect("landing:dashboard")
        context = {
            'plans_monthly': Plan.objects.filter(plan_duration=PlanType.Monthly).order_by('price'),
            'plans_yearly': Plan.objects.filter(plan_duration=PlanType.Yearly).order_by('price'),
            'plans_weekly': Plan.objects.filter(plan_duration=PlanType.Weekly).order_by('price'),
        }
        template = "landing/home3.html"
        return render(request, template, context)

    def post(self, request, *args, **kwargs):
        # code to process a POST request
        if request.user.is_authenticated:
            pass

class Home4View(View):
    """ Index view """
    def get(self, request, *args, **kwargs):
        # code to process a GET request:
        if request.user.is_authenticated:
            return redirect("landing:dashboard")
        context = {
            'plans_monthly': Plan.objects.filter(plan_duration=PlanType.Monthly).order_by('price'),
            'plans_yearly': Plan.objects.filter(plan_duration=PlanType.Yearly).order_by('price'),
            'plans_weekly': Plan.objects.filter(plan_duration=PlanType.Weekly).order_by('price'),
        }
        template = "landing/home4.html"
        return render(request, template, context)

    def post(self, request, *args, **kwargs):
        # code to process a POST request
        if request.user.is_authenticated:
            pass

class Home1View(View):
    """ Index view """
    def get(self, request, *args, **kwargs):
        # code to process a GET request:
        if request.user.is_authenticated:
            return redirect("landing:dashboard")
        context = {
            'plans_monthly': Plan.objects.filter(plan_duration=PlanType.Monthly).order_by('price'),
            'plans_yearly': Plan.objects.filter(plan_duration=PlanType.Yearly).order_by('price'),
            'plans_weekly': Plan.objects.filter(plan_duration=PlanType.Weekly).order_by('price'),
        }
        template = "landing/index_v2.html"
        return render(request, template, context)

    def post(self, request, *args, **kwargs):
        # code to process a POST request
        if request.user.is_authenticated:
            pass

class AboutUsView(View):
    def get(self, request, *args, **kwargs):
        # code to process a GET request:
        template = 'landing/aboutus.html'
        context = {}
        return render(request, template, context)

    def post(self, request, *args, **kwargs):
        # code to process a POST request
        pass

class WhoWeAreView(View):
    def get(self, request, *args, **kwargs):
        # code to process a GET request:
        template = 'landing/aboutus_v1.html'
        context = {}
        return render(request, template, context)

    def post(self, request, *args, **kwargs):
        # code to process a POST request
        pass

class AboutUsV2View(View):
    def get(self, request, *args, **kwargs):
        # code to process a GET request:
        template = 'landing/aboutus_v2.html'
        context = {}
        return render(request, template, context)

    def post(self, request, *args, **kwargs):
        # code to process a POST request
        pass

class TemrsServicesView(View):
    def get(self, request, *args, **kwargs):
        # code to process a GET request:
        template = 'landing/terms.html'
        context = {}
        return render(request, template, context)

    def post(self, request, *args, **kwargs):
        # code to process a POST request
        pass

class PrivacyPolicyView(View):
    def get(self, request, *args, **kwargs):
        # code to process a GET request:
        template = 'landing/privacy.html'
        context = {}
        return render(request, template, context)

    def post(self, request, *args, **kwargs):
        # code to process a POST request
        pass


class HelpView(View):
    def get(self, request, *args, **kwargs):
        # code to process a GET request:
        template = 'landing/help.html'
        context = {}
        return render(request, template, context)

    def post(self, request, *args, **kwargs):
        # code to process a POST request
        pass

class FAQView(View):
    def get(self, request, *args, **kwargs):
        # code to process a GET request:
        template = 'landing/faq.html'
        context = {}
        return render(request, template, context)

    def post(self, request, *args, **kwargs):
        # code to process a POST request
        pass

class CookiesPolicyView(View): 
    def get(self, request, *args, **kwargs):
        # code to process a GET request:
        template = 'landing/cookies_policy.html'
        context = {}
        return render(request, template, context)

    def post(self, request, *args, **kwargs):
        # code to process a POST request
        pass

class CareersView(View):
    def get(self, request, *args, **kwargs):
        # code to process a GET request:
        template = 'landing/careers.html'
        context = {}
        return render(request, template, context)

    def post(self, request, *args, **kwargs):
        # code to process a POST request
        pass
    
class ContactUsView(View):
    def get(self, request, *args, **kwargs):
        # code to process a GET request:
        template = 'landing/contactus.html'
        context = {}
        return render(request, template, context)

    def post(self, request, *args, **kwargs):
        # code to process a POST request
        if is_ajax(request):
            full_name = request.POST.get('name')
            email = request.POST.get('email')
            subject = request.POST.get('subject')
            message = request.POST.get('comments')
            
            # send message by Mailerlite
            added_user = add_mailer_user(
                email=email,
                first_name=full_name.split(' ')[0],
                group='Contact_Us',
                fields={
                    "last_name":full_name.split(' ')[1] if ' ' in full_name else "",
                    "contact_us_subject":subject,
                    "contact_us_message":message,
                }
                )
            print("Added user: ",added_user)
            logger.info("added User: ",added_user)
            mail = EmailMessage(
                subject = subject,
                body = f"{message} \nSent by {full_name} \nEmail: {email}.",
                to=[settings.EMAIL_HOST_USER],
                from_email=email
            )
            mail.send()

            # deleting user from mailer lite after 5min 
            delete_mailerlite_user.delay("Contact_Us",added_user['id'])

           
            return JsonResponse({'message':'Thanks you for your submission - Our Team will be in touch soon!', 'status': 'success'})
        return JsonResponse({'message':'Sorry, Something went wrong. Please try again.', 'status': 'error'})
    
class DashBoardView(View):
    """ DashBoard view """
    def get(self, request, *args, **kwargs):
        # code to process a GET request:
        if not request.user.is_authenticated:
            print("USER NOT AUTHENICATED")
            return redirect("landing:index")
        last_video = get_media(request.user, 1)[0] if get_media(request.user, 1) is not None else None
        print("Last Video: ",last_video)
        context = {
            "page":"dashboard",
            "Videos":get_media(request.user, 5),
            "last_video": last_video,
        }
        template = "dashboard.html"
        return render(request, template, context)

    def post(self, request, *args, **kwargs):
        # code to process a POST request
        if request.user.is_authenticated:
            pass

class WorkSpaceView(View):
    """ WorkSpace View """
    def get(self, request, *args, **kwargs):
        # code to process a GET request:
        if not request.user.is_authenticated:
            return redirect("landing:index")
        
        videos_list = get_media(request.user)
        page = request.GET.get('page', 1)
        
        paginator = Paginator(videos_list, 6)  # Show 6 videos per page

        try:
            videos = paginator.page(page)
        except PageNotAnInteger:
            # If page is not an integer, deliver first page.
            videos = paginator.page(1)
        except EmptyPage:
            # If page is out of range (e.g. 9999), deliver last page of results.
            videos = paginator.page(paginator.num_pages)

        context = {
            "page":"workspace",
            "Videos": videos,
        }
        template = "workspace.html"
        return render(request, template, context)

    def post(self, request, *args, **kwargs):
        # code to process a POST request
        if request.user.is_authenticated:
            pass

class EnhancementView(View):
    """ WorkSpace View """
    def get(self, request, *args, **kwargs):
        # code to process a GET request:
        if not request.user.is_authenticated:
            return redirect("landing:index")

        context = {
            "page":"enhancement",
        }
        template = "enhancement.html"
        return render(request, template, context)

    def post(self, request, *args, **kwargs):
        # code to process a POST request
        if request.user.is_authenticated:
            pass

class SubscriptionView(View):
    """ Subscription View  """
    def get(self, request, *args, **kwargs):
        # code to process a GET request:
        if not request.user.is_authenticated:
            return redirect("landing:index")
        plan = None
        try:
            plan = request.user.subscription.plan
        except Exception as e   :
            print(e)
        context = {
            "page":"subscribe",
            "plan":plan
        }
        template = "subscribe.html"
        return render(request, template, context)

    def post(self, request, *args, **kwargs):
        # code to process a POST request
        if request.user.is_authenticated:
            pass
            
class SupportView(View):
    def post(self, request, *args, **kwargs):
        if is_ajax(request):
            full_name = request.user.get_full_name()
            email = request.user.email
            subject = request.POST.get('subject')
            message = request.POST.get('description')
            # file = request.FILES['file']
            files = request.FILES.getlist('file')
            issue = request.POST.get('issue_type')

            mail = EmailMessage(
                subject = f"{subject} :: {issue} ",
                body = f"{message} \nSent by {full_name} \nEmail: {email}.",
                to=[settings.EMAIL_HOST_USER],
                from_email=email
            )
            
            for f in files:
                mail.attach(f.name, f.read(), f.content_type)
            
            mail.send()
            
            return JsonResponse({'message':'You message sended Succesfuly, We will Retch You Soon', 'status': 'success'})
        return JsonResponse({'message':'Sorry, Something went wrong. Please try again.', 'status': 'error'})
    
class GetAudioView(View):
    def post(self,request,*args,**kwargs):
        if not request.user.is_authenticated:
            return redirect("account:signin")
        pass
    
    def get(self, request, audio_id, *args, **kwargs):
        if not request.user.is_authenticated:
            return redirect("account:signin")
        if is_ajax(request):     
            # logger.info(f"request : {request}")
            # nbr = request.GET.get('audio_id')
            # logger.info(f"audio id: {nbr}")
            try:
                last_audio = ProcessedMedia.objects.get(id=audio_id)
                print(last_audio)
            except ProcessedMedia.DoesNotExist:
                last_audio = None
                
                

            context = {'last_audio':last_audio}
            data = dict()
            data['table_content'] = render_to_string('includes/audio_table.html', context, request=request)
            return JsonResponse(data)
        # return 403 method mot alowed
        # return render(request,'errors/404.html')

# status endpoint for health checks
class StatusView(View):
    def get(self, request, *args, **kwargs):
        return JsonResponse({"status": "OK"}, status=200)
        
def get_table(request, nbr=None):
    if not request.user.is_authenticated:
        return redirect('accounts:signin')
    data = dict()
    final_videos = get_media(request.user, nbr)
    context = {'Videos':final_videos , 'nbr':nbr}
    data['table_content'] = render_to_string('includes/table.html',context,request=request)
    if nbr != None and final_videos != None:
        # last_uploaded = last_uploaded_pm(request.user)
        # logging.info(last_uploaded)
        data['last_uploaded'] = last_uploaded_pm(request.user)
        # logging.info(data['last_uploaded'])
        
        return JsonResponse(data)
    return JsonResponse(data)
    # We need to get table.html and set final_videos on it then return all htmls':final_videos })
    # return TemplateResponse(request, 'includes/table.html', {'Videos':final_videos , 'nbr':nbr})

    
def handler404(request, *args, **argv):
    context = {} # RequestContext(request)
    response = render(request, "errors/404.html", context=context)
    response.status_code = 404
    return response

def handler500(request, *args, **argv):
    context = {}
    response = render(request, "errors/500.html", context=context)
    response.status_code = 500
    return response


