import json
import logging

from django.views import View
from django.conf import settings
from django.http import JsonResponse, HttpResponse
from django.shortcuts import render, redirect
from django.core.mail.message import EmailMessage
from django.template.loader import render_to_string

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
from apps.process.models import ProcessedMedia

# 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 LandingView(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 DashBoardView(View):
    """ DashBoard view """
    def get(self, request, *args, **kwargs):
        # code to process a GET request:
        if not request.user.is_authenticated:
            return redirect("landing:index")
        last_video = get_media(request.user, 1).get() if get_media(request.user, 1) is not None else None
        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")

        context = {
            "page":"workspace",
            "Videos":get_media(request.user),
        }
        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 LandingTowView(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 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 TemrsServicesView(View):
    def get(self, request,*args, **kwargs):
        template = 'landing/terms.html'
        return render(request, template)

class PrivacyPolicyView(View):
    def get(self, request,*args, **kwargs):
        template = 'landing/privacy.html'
        return render(request, template)

class FAQView(View):
    def get(self,request,*args,**kwargs):
        template = 'landing/faq.html'
        return render(request,template)
        

class ContactUsView(View):
    def get(self,request,*args,**kwargs):
        template = 'landing/contactus.html'
        return render(request,template)
    def post(self, request,*args,**kwargs):
        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')
            mail = EmailMessage(
                subject = subject,
                body = f"{message} \nSent by {full_name} \nEmail: {email}.",
                to=[settings.EMAIL_HOST_USER],
                from_email=email
            )
            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 CareersView(View):
    def get(self,request,*args,**kwargs):
        template = 'landing/careers.html'
        return render(request,template)


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'})


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})

    
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')


 



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




