from django.shortcuts import redirect, render
from django.contrib import messages
from datetime import datetime, timedelta
from django.db.models import Sum, Count, Q, F
from django.urls import reverse
from account.models import *
from django.core.paginator import Paginator
from .utils.decorators import role_required
#for pdf
from django.template.loader import get_template
from django.http import HttpResponse
from xhtml2pdf import pisa



from django.contrib.auth import get_user_model
from django.contrib.auth.decorators import login_required
User = get_user_model()
from .variable import *
from .custom_today import get_custom_today



@login_required
def create_list(request):
    members = Member.objects.filter(
        attendancemember__date=get_custom_today(),
        attendancemember__status=True
    ).distinct()
    unit = ""
    role = request.user.role
    if role and role.modules.filter(name='create_list_admin').exists():
        unit = "93 Armd Brigade"
    elif role and role.modules.filter(name='create_list_battalion').exists():
        companies = request.user.battalion.companies.all()
        members = members.filter(company__in=companies)
        unit = request.user.battalion.name
    elif role and role.modules.filter(name='create_list_company').exists():
        company = request.user.company
        members = members.filter(company=company)
        unit = f"{company.name} - {company.battalion.name}"
    else :
        return render(request, 'others/no_permission.html')
    

    if request.method == "POST":
        title = request.POST.get("title")
        date = request.POST.get("date")
        category_id = request.POST.get("category")
        member_ids = request.POST.getlist("members")

        category = ListCategory.objects.get(id=category_id) if category_id else None
        list_obj = List.objects.create(title=title, date=date, category=category, unit=unit)

        # Add members to ManyToMany
        list_obj.members.set(member_ids)

        return redirect("read_list")

    categories = ListCategory.objects.all()
    context = {
        "categories": categories, "members": members
        }
    return render(request, "list/create_list.html", context)


@login_required
def read_list(request):    
    list_category = ListCategory.objects.all()
    category_id = request.GET.get("category")
    if category_id:
        lists = List.objects.filter(category_id=category_id)
    else:
        lists = List.objects.all()
    # paginator
    paginator = Paginator(lists, 20)  # Show 20 notices per page
    page_number = request.GET.get("page")
    lists = paginator.get_page(page_number)

    query_dict = request.GET.copy()
    if 'page' in query_dict:
        query_dict.pop('page')
    query_string = query_dict.urlencode()
    context = {
        "lists": lists,
        "list_category": list_category,
        "category_id": int(category_id) if category_id else "",
        "query_string":query_string
        }
    return render(request, "list/read_list.html", context)

login_required
def delete_list(request, id):
    role = request.user.role
    if role and role.modules.filter(name='delete_list_admin').exists():
        pass
    elif role and role.modules.filter(name='delete_list_battalion').exists():
        pass
    elif role and role.modules.filter(name='delete_list_company').exists():
        pass
    else :
        return render(request, 'others/no_permission.html')
    list_obj = List.objects.get(id=id)
    list_obj.delete()
    messages.success(request, "List deleted successfully.")
    return redirect("read_list")




def read_list_pdf(request,id):
    list = List.objects.get(id=id)
    context = {
        'list': list,
    }

    # Load the HTML template and render it with context data
    template = get_template('list/read_list_pdf.html')
    html = template.render(context)

    # Create a response with PDF content type
    response = HttpResponse(content_type='application/pdf')
    response['Content-Disposition'] = f'inline; filename="list_{list.title}.pdf"'

    # Convert HTML to PDF
    pisa_status = pisa.CreatePDF(html, dest=response)

    if pisa_status.err:
        return HttpResponse("Error generating PDF", status=500)
    
    return response