import re
from dateutil.relativedelta import relativedelta
from django.shortcuts import redirect, render
from django.contrib.auth.password_validation import validate_password
from django.core.exceptions import ValidationError
from django.contrib import messages
from itertools import groupby
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
from django.contrib.auth.decorators import login_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
User = get_user_model()
from .variable import *
from .custom_today import get_custom_today


#TODO:report
#blood
@login_required
def report_blood(request):
    role = request.user.role
    if role and role.modules.filter(name='report_blood_admin').exists():
        basic_info = BasicInformation.objects.filter(member__active=True).exclude(blood=None).order_by('blood','member__company__battalion__sn','member__company__sn','member__member_type','member__rank')
    elif role and role.modules.filter(name='report_blood_battalion').exists():
        companies = request.user.battalion.companies.all()
        basic_info = BasicInformation.objects.filter(Q(member__company__in=companies)|Q(member__p_company__in=companies),member__active=True).exclude(blood=None).order_by('blood', 'member__company__battalion__sn','member__company__sn','member__member_type','member__rank')
    elif role and role.modules.filter(name='report_blood_company').exists():
        company=request.user.company
        basic_info = BasicInformation.objects.filter(Q(member__company=company)|Q(member__p_company=company),member__active=True).exclude(blood=None).order_by('blood', 'member__company__battalion__sn','member__company__sn','member__member_type','member__rank')
    else:
        messages.error(request, "You don't have permission to view this page.")
        return render(request, 'others/no_permission.html')

    # Get search query
    search_query = request.GET.get("search", "")  
    if search_query:
        basic_info = basic_info.filter(blood=search_query)
    paginator = Paginator(basic_info, 30)  # 10 basic_info per page
    page_number = request.GET.get("page")   
    basic_info_page = paginator.get_page(page_number)
    
    # get the current page number with query string
    query_dict = request.GET.copy()
    if 'page' in query_dict:
        query_dict.pop('page')
    query_string = query_dict.urlencode()
    context = {
        "basic_info": basic_info_page,
        "blood_groups":BasicInformation.BLOOD_LIST,
        "search_query": search_query,  # Pass search query to template
        "query_string":query_string
        
    }
    return render(request,'report/search_blood.html',context)
#age
@login_required
def report_age(request):
    today = date.today()
    role = request.user.role
    if role and role.modules.filter(name='report_age_admin').exists():
        basic_info = BasicInformation.objects.filter(member__active=True,date_of_birth__isnull=False).order_by('-date_of_birth','member__company__battalion__sn','member__company__sn','member__member_type','member__rank')
    elif role and role.modules.filter(name='report_age_battalion').exists():
        companies = request.user.battalion.companies.all()
        basic_info = BasicInformation.objects.filter(Q(member__company__in=companies) | Q(member__p_company__in=companies),member__active=True,date_of_birth__isnull=False
    ).order_by('-date_of_birth', 'member__company__battalion__sn','member__company__sn','member__member_type','member__rank')
    elif role and role.modules.filter(name='report_age_company').exists():
        company=request.user.company
        basic_info = BasicInformation.objects.filter(Q(member__company=company) | Q(member__p_company=company),member__active=True,date_of_birth__isnull=False).order_by('-date_of_birth', 'member__company__battalion__sn','member__company__sn','member__member_type','member__rank') 
    else:
        messages.error(request, "You don't have permission to view this page.")
        return render(request, 'others/no_permission.html')
    
    age_gt = request.GET.get('age_gt')
    age_lt = request.GET.get('age_lt')
    age_eq = request.GET.get('age_eq')
    # Convert age to date comparisons
    if age_gt:
        max_dob = date(today.year - int(age_gt), today.month, today.day)
        basic_info = basic_info.filter(date_of_birth__lt=max_dob)  # Older than age_gt

    if age_lt:
        min_dob = date(today.year - int(age_lt), today.month, today.day)
        basic_info = basic_info.filter(date_of_birth__gt=min_dob)  # Younger than age_lt

    if age_eq:
        dob_start = date(today.year - int(age_eq), today.month, today.day)
        dob_end = date(today.year - int(age_eq) - 1, today.month, today.day)
        basic_info = basic_info.filter(date_of_birth__lte=dob_start, date_of_birth__gt=dob_end)
        
    paginator = Paginator(basic_info, 30)  # 10 basic_info per page
    page_number = request.GET.get("page")   
    basic_info_page = paginator.get_page(page_number)
    
    # get the current page number with query string
    query_dict = request.GET.copy()
    if 'page' in query_dict:
        query_dict.pop('page')
    query_string = query_dict.urlencode()
    context = {
        "basic_info": basic_info_page,
        "age_gt":age_gt,
        "age_eq":age_eq,
        "age_lt":age_lt,
        "query_string":query_string

    }
    return render(request,'report/search_age.html',context)

@login_required
#med_cat
def report_med_cat(request):  
    role = request.user.role
    if role and role.modules.filter(name='report_med_cat_admin').exists():
        service_info = ServiceInformation.objects.filter(member__active=True).exclude(med_cat=None).order_by('med_cat','member__company__battalion__sn','member__company__sn','member__member_type','member__rank')
    elif role and role.modules.filter(name='report_med_cat_battalion').exists():
        companies = request.user.battalion.companies.all()  
        service_info = ServiceInformation.objects.filter(Q(member__company__in=companies)|Q(member__p_company__in=companies),member__active=True).exclude(med_cat=None).order_by('med_cat', 'member__company__battalion__sn','member__company__sn','member__member_type','member__rank')
    elif role and role.modules.filter(name='report_med_cat_company').exists():
        company=request.user.company
        service_info = ServiceInformation.objects.filter(Q(member__company=company)|Q(member__p_company=company),member__active=True).exclude(med_cat=None).order_by('med_cat', 'member__company__battalion__sn','member__company__sn','member__member_type','member__rank')
    else:
        messages.error(request, "You don't have permission to view this page.")
        return render(request, 'others/no_permission.html')

    search_query = request.GET.get("search", "")  # Get search query
    if search_query:
        # Use Q objects for OR logic
        service_info = service_info.filter(
            Q(med_cat__icontains=search_query)
        )
    paginator = Paginator(service_info, 30)  # 10 service_info per page
    page_number = request.GET.get("page")   
    service_info_page = paginator.get_page(page_number)
    
    # get the current page number with query string
    query_dict = request.GET.copy()
    if 'page' in query_dict:
        query_dict.pop('page')
    query_string = query_dict.urlencode()
    context = {
        "service_info": service_info_page,
        "med_cats":ServiceInformation.MED_CAT_LIST,
        "search_query": search_query,  # Pass search query to template
        "query_string":query_string

    }
    return render(request,'report/search_med_cat.html',context)

#absent
@login_required
def report_absent(request):
    role = request.user.role
    if role and role.modules.filter(name='report_absent_admin').exists():
        absent = AttendanceMember.objects.filter(status=False).order_by('-date','member__company__battalion__sn','member__company__sn','member__member_type','member__rank')
    elif role and role.modules.filter(name='report_absent_battalion').exists():
        companies = request.user.battalion.companies.all()
        absent = AttendanceMember.objects.filter(member__company__in=companies,status=False).order_by('-date', 'member__company__battalion__sn','member__company__sn','member__member_type','member__rank')
    elif role and role.modules.filter(name='report_absent_company').exists():
        company=request.user.company
        absent = AttendanceMember.objects.filter(member__company=company,status=False).order_by('-date', 'member__company__battalion__sn','member__company__sn','member__member_type','member__rank')
    else:
        messages.error(request, "You don't have permission to view this page.")
        return render(request, 'others/no_permission.html')

    date_from = request.GET.get('date_from')
    date_to = request.GET.get('date_to')
    if date_from:
        absent = absent.filter(date__gt=date_from)
    if date_to:
        absent = absent.filter(date__lt=date_to)

    paginator = Paginator(absent, 30)  # 10 absent per page
    page_number = request.GET.get("page")   
    absent_page = paginator.get_page(page_number)
    
    
    # get the current page number with query string
    query_dict = request.GET.copy()
    if 'page' in query_dict:
        query_dict.pop('page')
    query_string = query_dict.urlencode()
    context = {
        "absent": absent_page,
        "date_from":date_from,
        "date_to":date_to,
        "query_string":query_string
    }
    return render(request,'report/search_absent.html',context)

#address
@login_required
def report_address(request):
    role = request.user.role
    if role and role.modules.filter(name='report_address_admin').exists():
        basic_info = BasicInformation.objects.filter(member__active=True).exclude(district=None).order_by('district','member__company__battalion__sn','member__company__sn','member__member_type','member__rank')
    elif role and role.modules.filter(name='report_address_battalion').exists():
        companies = request.user.battalion.companies.all()
        basic_info = BasicInformation.objects.filter(Q(member__company__in=companies)|Q(member__p_company__in=companies),member__active=True).exclude(district=None).order_by('district', 'upazila', 'member__company__battalion__sn','member__company__sn','member__member_type','member__rank')
    elif role and role.modules.filter(name='report_address_company').exists():
        company=request.user.company
        basic_info = BasicInformation.objects.filter(Q(member__company=company)|Q(member__p_company=company),member__active=True).exclude(district=None).order_by('district', 'upazila', 'member__company__battalion__sn','member__company__sn','member__member_type','member__rank')
        district_id = request.GET.get('district')
    else:
        messages.error(request, "You don't have permission to view this page.")
        return render(request, 'others/no_permission.html')

    district_id = request.GET.get('district')
    upazila_id = request.GET.get('upazila')
    if district_id:
        district = District.objects.get(id=district_id)
        basic_info = basic_info.filter(district=district)
    if upazila_id:
        upazila = Upazila.objects.get(id=upazila_id)
        basic_info = basic_info.filter(upazila=upazila)
        
    paginator = Paginator(basic_info, 30)  # 10 basic_info per page
    page_number = request.GET.get("page")   
    basic_info_page = paginator.get_page(page_number)
    
    # get the current page number with query string
    query_dict = request.GET.copy()
    if 'page' in query_dict:
        query_dict.pop('page')
    query_string = query_dict.urlencode()
    context = {
        "basic_info": basic_info_page,
        "district_id":district_id,
        "upazila_id":upazila_id,
        "districts":District.objects.all(),
        "upazilas":Upazila.objects.all(),
        "query_string":query_string
    }
    return render(request,'report/search_address.html',context)

#height
def height_to_inches(height_str):
    """Converts height like 5'8'' into inches (e.g., 68)."""
    match = re.match(r"^(\d+)'\s*(\d+)?['\"]{0,2}$", height_str.strip())
    if match:
        feet = int(match.group(1))
        inches = int(match.group(2) or 0)
        return feet * 12 + inches
    return None

@login_required
def report_height(request):
    role = request.user.role
    if role and role.modules.filter(name='report_height_admin').exists():
        basic_info = BasicInformation.objects.filter(member__active=True).exclude(height=None).order_by('height','member__company__battalion__sn','member__company__sn','member__member_type','member__rank')
    elif role and role.modules.filter(name='report_height_battalion').exists():
        companies = request.user.battalion.companies.all()
        basic_info = BasicInformation.objects.filter(Q(member__company__in=companies)|Q(member__p_company__in=companies),member__active=True).exclude(height=None).order_by('height', 'member__company__battalion__sn','member__company__sn','member__member_type','member__rank')
    elif role and role.modules.filter(name='report_height_company').exists():
        company=request.user.company
        basic_info = BasicInformation.objects.filter(Q(member__company=company)|Q(member__p_company=company),member__active=True).exclude(height=None).order_by('height', 'member__company__battalion__sn','member__company__sn','member__member_type','member__rank')
    else:
        messages.error(request, "You don't have permission to view this page.")
        return render(request, 'others/no_permission.html')

    height_gt = request.GET.get('height_gt', '')
    height_lt = request.GET.get('height_lt', '')
    height_eq = request.GET.get('height_eq', '')

    gt_inch = height_to_inches(height_gt)
    lt_inch = height_to_inches(height_lt)
    eq_inch = height_to_inches(height_eq)

    filtered = []
    for m in basic_info:
        h_inch = height_to_inches(m.height)
        if h_inch is None:
            continue
        if gt_inch and h_inch <= gt_inch:
            continue
        if lt_inch and h_inch >= lt_inch:
            continue
        if eq_inch and h_inch != eq_inch:
            continue
        filtered.append(m)
    
    paginator = Paginator(filtered, 30)  # 10 absent per page
    page_number = request.GET.get("page")   
    filtered = paginator.get_page(page_number)
        
        
    # get the current page number with query string
    query_dict = request.GET.copy()
    if 'page' in query_dict:
        query_dict.pop('page')
    query_string = query_dict.urlencode()
    context = {
        "basic_info": filtered,
        "height_gt":height_gt,
        "height_eq":height_eq,
        "height_lt":height_lt,
        "query_string":query_string
    }
    return render(request,'report/search_height.html',context)
#join date
@login_required
def report_join_date(request):
    role = request.user.role
    if role and role.modules.filter(name='report_join_date_admin').exists():
        members = Member.objects.filter(active=True).order_by('-created_at','company__battalion__sn','company__sn','member_type','rank')  
    elif role and role.modules.filter(name='report_join_date_battalion').exists():
        companies = request.user.battalion.companies.all()
        members = Member.objects.filter(Q(company__in=companies)|Q(p_company__in=companies),active=True).order_by('-created_at', 'company__battalion__sn','company__sn','member_type','rank')   
    elif role and role.modules.filter(name='report_join_date_company').exists():
        company=request.user.company
        members = Member.objects.filter(Q(company=company)|Q(p_company=company),active=True).order_by('-created_at', 'company__battalion__sn','company__sn','member_type','rank')    
    else:
        messages.error(request, "You don't have permission to view this page.")
        return render(request, 'others/no_permission.html')
   
    date_from = request.GET.get('date_from')
    date_to = request.GET.get('date_to')
    if date_from:
        members = members.filter(created_at__gte=date_from)
    if date_to:
        members = members.filter(created_at__lte=date_to)
        
    paginator = Paginator(members, 30)  # 10 members per page
    page_number = request.GET.get("page")   
    members_page = paginator.get_page(page_number)
    
    # get the current page number with query string
    query_dict = request.GET.copy()
    if 'page' in query_dict:
        query_dict.pop('page')
    query_string = query_dict.urlencode()
    context = {
        "members": members_page,
        "date_from":date_from,
        "date_to":date_to,
        "query_string":query_string
    }
    return render(request,'report/search_join_date.html',context)

#retirement date
@login_required
def report_retirement_date(request):
    role = request.user.role
    if role and role.modules.filter(name='report_retirement_date_admin').exists():
        service_info = ServiceInformation.objects.filter().exclude(retirement=None).order_by('-retirement','member__company__battalion__sn','member__company__sn','member__member_type','member__rank') 
    elif role and role.modules.filter(name='report_retirement_date_battalion').exists():
        companies = request.user.battalion.companies.all()
        service_info = ServiceInformation.objects.filter(Q(member__company__in=companies)|Q(member__p_company__in=companies)).exclude(retirement=None).order_by('-retirement', 'member__company__battalion__sn','member__company__sn','member__member_type','member__rank')    
    elif role and role.modules.filter(name='report_retirement_date_company').exists():
        company=request.user.company
        service_info = ServiceInformation.objects.filter(Q(member__company=company)|Q(member__p_company=company)).exclude(retirement=None).order_by('-retirement', 'member__company__battalion__sn','member__company__sn','member__member_type','member__rank')    
    else:
        messages.error(request, "You don't have permission to view this page.")
        return render(request, 'others/no_permission.html')   
    
    
    date_from = request.GET.get('date_from')
    date_to = request.GET.get('date_to')
    if date_from:
        service_info = service_info.filter(retirement__gte=date_from)
    if date_to:
        service_info = service_info.filter(retirement__lte=date_to)
        
    paginator = Paginator(service_info, 30)  # 10 service_info per page
    page_number = request.GET.get("page")   
    service_info_page = paginator.get_page(page_number)
    
    # get the current page number with query string
    query_dict = request.GET.copy()
    if 'page' in query_dict:
        query_dict.pop('page')
    query_string = query_dict.urlencode()
    context = {
        "service_info": service_info_page,
        "date_from":date_from,
        "date_to":date_to,
        "query_string":query_string
    }
    return render(request,'report/search_retirement_date.html',context)







#TODO:report pdf
#blood
@login_required
def report_blood_pdf(request):
    role = request.user.role
    if role and role.modules.filter(name='report_blood_admin').exists():
        basic_info = BasicInformation.objects.filter(member__active=True).exclude(blood=None).order_by('blood','member__company__battalion__sn','member__company__sn','member__member_type','member__rank')
    elif role and role.modules.filter(name='report_blood_battalion').exists():
        companies = request.user.battalion.companies.all()
        basic_info = BasicInformation.objects.filter(Q(member__company__in=companies)|Q(member__p_company__in=companies),member__active=True).exclude(blood=None).order_by('blood', 'member__company__battalion__sn','member__company__sn','member__member_type','member__rank')
    elif role and role.modules.filter(name='report_blood_company').exists():
        company=request.user.company
        basic_info = BasicInformation.objects.filter(Q(member__company=company)|Q(member__p_company=company),member__active=True).exclude(blood=None).order_by('blood', 'member__company__battalion__sn','member__company__sn','member__member_type','member__rank')
    else:
        messages.error(request, "You don't have permission to view this page.")
        return render(request, 'others/no_permission.html')
    
    search_query = request.GET.get("search", "")  # Get search query
    if search_query:
        # Use Q objects for OR logic
        basic_info = basic_info.filter(blood=search_query)
    context = {
        "basic_info": basic_info,
        "name" : f"Blood"
    }
    # Load the HTML template and render it with context data
    template = get_template('report/bloodPDF.html')
    html = template.render(context)

    # Create a response with PDF content type
    response = HttpResponse(content_type='application/pdf')
    response['Content-Disposition'] = f'inline; filename="blood.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

#age
@login_required
def report_age_pdf(request):
    today = date.today()
    role = request.user.role
    if role and role.modules.filter(name='report_age_admin').exists():
        basic_info = BasicInformation.objects.filter(member__active=True,date_of_birth__isnull=False).order_by('-date_of_birth','member__company__battalion__sn','member__company__sn','member__member_type','member__rank')
    elif role and role.modules.filter(name='report_age_battalion').exists():
        companies = request.user.battalion.companies.all()
        basic_info = BasicInformation.objects.filter(Q(member__company__in=companies) | Q(member__p_company__in=companies),member__active=True,date_of_birth__isnull=False
    ).order_by('-date_of_birth', 'member__company__battalion__sn','member__company__sn','member__member_type','member__rank')
    elif role and role.modules.filter(name='report_age_company').exists():
        company=request.user.company
        basic_info = BasicInformation.objects.filter(Q(member__company=company) | Q(member__p_company=company),member__active=True,date_of_birth__isnull=False).order_by('-date_of_birth', 'member__company__battalion__sn','member__company__sn','member__member_type','member__rank') 
    else:
        messages.error(request, "You don't have permission to view this page.")
        return render(request, 'others/no_permission.html')
    
    
    age_gt = request.GET.get('age_gt')
    age_lt = request.GET.get('age_lt')
    age_eq = request.GET.get('age_eq')
    # Convert age to date comparisons
    def is_valid_age(value):
        return value not in [None, '', 'None']
    if is_valid_age(age_gt):
        max_dob = date(today.year - int(age_gt), today.month, today.day)
        basic_info = basic_info.filter(date_of_birth__lt=max_dob)  # Older than age_gt

    if is_valid_age(age_lt):
        min_dob = date(today.year - int(age_lt), today.month, today.day)
        basic_info = basic_info.filter(date_of_birth__gt=min_dob)  # Younger than age_lt

    if is_valid_age(age_eq):
        dob_start = date(today.year - int(age_eq), today.month, today.day)
        dob_end = date(today.year - int(age_eq) - 1, today.month, today.day)
        basic_info = basic_info.filter(date_of_birth__lte=dob_start, date_of_birth__gt=dob_end)
    context = {
        "basic_info": basic_info,
        "age_gt":age_gt,
        "age_eq":age_eq,
        "age_lt":age_lt,
        "name" : f"Age",
    }
    # Load the HTML template and render it with context data
    template = get_template('report/agePDF.html')
    html = template.render(context)

    # Create a response with PDF content type
    response = HttpResponse(content_type='application/pdf')
    response['Content-Disposition'] = f'inline; filename="age.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

#med_cat
@login_required
def report_med_cat_pdf(request):
    role = request.user.role
    if role and role.modules.filter(name='report_med_cat_admin').exists():
        service_info = ServiceInformation.objects.filter(member__active=True).exclude(med_cat=None).order_by('med_cat','member__company__battalion__sn','member__company__sn','member__member_type','member__rank')
    elif role and role.modules.filter(name='report_med_cat_battalion').exists():
        companies = request.user.battalion.companies.all()  
        service_info = ServiceInformation.objects.filter(Q(member__company__in=companies)|Q(member__p_company__in=companies),member__active=True).exclude(med_cat=None).order_by('med_cat', 'member__company__battalion__sn','member__company__sn','member__member_type','member__rank')
    elif role and role.modules.filter(name='report_med_cat_company').exists():
        company=request.user.company
        service_info = ServiceInformation.objects.filter(Q(member__company=company)|Q(member__p_company=company),member__active=True).exclude(med_cat=None).order_by('med_cat', 'member__company__battalion__sn','member__company__sn','member__member_type','member__rank')
    else:
        messages.error(request, "You don't have permission to view this page.")
        return render(request, 'others/no_permission.html')


    search_query = request.GET.get("search", "")  # Get search query
    if search_query:
        # Use Q objects for OR logic
        service_info = service_info.filter(
            Q(med_cat__icontains=search_query)
        )
    context = {
        "service_info": service_info,
        "med_cats":ServiceInformation.MED_CAT_LIST,
        "search_query": search_query,  # Pass search query to template
        "name" : f"Med Cat"
        
    }
    # Load the HTML template and render it with context data
    template = get_template('report/med_catPDF.html')
    html = template.render(context)

    # Create a response with PDF content type
    response = HttpResponse(content_type='application/pdf')
    response['Content-Disposition'] = f'inline; filename="med_cat.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

#absent
@login_required
def report_absent_pdf(request):
    role = request.user.role
    if role and role.modules.filter(name='report_absent_admin').exists():
        absent = AttendanceMember.objects.filter(status=False).order_by('-date','member__company__battalion__sn','member__company__sn','member__member_type','member__rank')
    elif role and role.modules.filter(name='report_absent_battalion').exists():
        companies = request.user.battalion.companies.all()
        absent = AttendanceMember.objects.filter(member__company__in=companies,status=False).order_by('-date', 'member__company__battalion__sn','member__company__sn','member__member_type','member__rank')
    elif role and role.modules.filter(name='report_absent_company').exists():
        company=request.user.company
        absent = AttendanceMember.objects.filter(member__company=company,status=False).order_by('-date', 'member__company__battalion__sn','member__company__sn','member__member_type','member__rank')
    else:
        messages.error(request, "You don't have permission to view this page.")
        return render(request, 'others/no_permission.html')


    date_from = request.GET.get('date_from')
    date_to = request.GET.get('date_to')

    def is_valid_date(value):
        return value not in [None, '', 'None']
    if is_valid_date(date_from):
        absent = absent.filter(created_at__gt=date_from)
    if is_valid_date(date_to):
        absent = absent.filter(created_at__lt=date_to)

        
    context = {
        "absent": absent,
        "date_from":date_from,
        "date_to":date_to,
        "name" : f"Absent",
    }
    # Load the HTML template and render it with context data
    template = get_template('report/absentPDF.html')
    html = template.render(context)

    # Create a response with PDF content type
    response = HttpResponse(content_type='application/pdf')
    response['Content-Disposition'] = f'inline; filename="blood.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

#absent
@login_required
def report_address_pdf(request):
    role = request.user.role
    if role and role.modules.filter(name='report_address_admin').exists():
        basic_info = BasicInformation.objects.filter(member__active=True).exclude(district=None).order_by('district','member__company__battalion__sn','member__company__sn','member__member_type','member__rank')
    elif role and role.modules.filter(name='report_address_battalion').exists():
        companies = request.user.battalion.companies.all()
        basic_info = BasicInformation.objects.filter(Q(member__company__in=companies)|Q(member__p_company__in=companies),member__active=True).exclude(district=None).order_by('district', 'upazila', 'member__company__battalion__sn','member__company__sn','member__member_type','member__rank')
    elif role and role.modules.filter(name='report_address_company').exists():
        company=request.user.company
        basic_info = BasicInformation.objects.filter(Q(member__company=company)|Q(member__p_company=company),member__active=True).exclude(district=None).order_by('district', 'upazila', 'member__company__battalion__sn','member__company__sn','member__member_type','member__rank')
        district_id = request.GET.get('district')
    else:
        messages.error(request, "You don't have permission to view this page.")
        return render(request, 'others/no_permission.html')


    district_id = request.GET.get('district')
    upazila_id = request.GET.get('upazila')
    def is_valid_address(value):
        return value not in [None, '', 'None']
    if is_valid_address(district_id):
        district = District.objects.get(id=district_id)
        basic_info = basic_info.filter(district=district)
    if is_valid_address(upazila_id):
        upazila = Upazila.objects.get(id=upazila_id)
        basic_info = basic_info.filter(upazila=upazila)

    context = {
        "basic_info": basic_info,
        "district_id":district_id,
        "upazila_id":upazila_id,
        "name" : f"Address",
        
    }
    # Load the HTML template and render it with context data
    template = get_template('report/addressPDF.html')
    html = template.render(context)

    # Create a response with PDF content type
    response = HttpResponse(content_type='application/pdf')
    response['Content-Disposition'] = f'inline; filename="address.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

#height
@login_required
def report_height_pdf(request):
    role = request.user.role
    if role and role.modules.filter(name='report_height_admin').exists():
        basic_info = BasicInformation.objects.filter(member__active=True).exclude(height=None).order_by('height','member__company__battalion__sn','member__company__sn','member__member_type','member__rank')
    elif role and role.modules.filter(name='report_height_battalion').exists():
        companies = request.user.battalion.companies.all()
        basic_info = BasicInformation.objects.filter(Q(member__company__in=companies)|Q(member__p_company__in=companies),member__active=True).exclude(height=None).order_by('height', 'member__company__battalion__sn','member__company__sn','member__member_type','member__rank')
    elif role and role.modules.filter(name='report_height_company').exists():
        company=request.user.company
        basic_info = BasicInformation.objects.filter(Q(member__company=company)|Q(member__p_company=company),member__active=True).exclude(height=None).order_by('height', 'member__company__battalion__sn','member__company__sn','member__member_type','member__rank')
    else:
        messages.error(request, "You don't have permission to view this page.")
        return render(request, 'others/no_permission.html')


    height_gt = request.GET.get('height_gt', '')
    height_lt = request.GET.get('height_lt', '')
    height_eq = request.GET.get('height_eq', '')

    gt_inch = height_to_inches(height_gt)
    lt_inch = height_to_inches(height_lt)
    eq_inch = height_to_inches(height_eq)

    filtered = []
    for m in basic_info:
        h_inch = height_to_inches(m.height)
        if h_inch is None:
            continue
        if gt_inch and h_inch <= gt_inch:
            continue
        if lt_inch and h_inch >= lt_inch:
            continue
        if eq_inch and h_inch != eq_inch:
            continue
        filtered.append(m)
    
        
    context = {
        "basic_info": filtered,
        "height_gt":height_gt,
        "height_eq":height_eq,
        "height_lt":height_lt,
        "name" : f"Height",
        
    }
    # Load the HTML template and render it with context data
    template = get_template('report/heightPDF.html')
    html = template.render(context)

    # Create a response with PDF content type
    response = HttpResponse(content_type='application/pdf')
    response['Content-Disposition'] = f'inline; filename="height.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


#join date
@login_required
def report_join_date_pdf(request):
    role = request.user.role
    if role and role.modules.filter(name='report_join_date_admin').exists():
        members = Member.objects.filter(active=True).order_by('-created_at','company__battalion__sn','company__sn','member_type','rank')  
    elif role and role.modules.filter(name='report_join_date_battalion').exists():
        companies = request.user.battalion.companies.all()
        members = Member.objects.filter(Q(company__in=companies)|Q(p_company__in=companies),active=True).order_by('-created_at', 'company__battalion__sn','company__sn','member_type','rank')   
    elif role and role.modules.filter(name='report_join_date_company').exists():
        company=request.user.company
        members = Member.objects.filter(Q(company=company)|Q(p_company=company),active=True).order_by('-created_at', 'company__battalion__sn','company__sn','member_type','rank')    
    else:
        messages.error(request, "You don't have permission to view this page.")
        return render(request, 'others/no_permission.html')
   
    
    date_from = request.GET.get('date_from')
    date_to = request.GET.get('date_to')
    def is_valid_date(value):
        return value not in [None, '', 'None']
    if is_valid_date(date_from):
        members = members.filter(created_at__gt=date_from)
    if is_valid_date(date_to):
        members = members.filter(created_at__lt=date_to)
        
    context = {
        "members": members,
        "date_from":date_from,
        "date_to":date_to,
        "name" : f"Join Date",
    }
    # Load the HTML template and render it with context data
    template = get_template('report/join_datePDF.html')
    html = template.render(context)

    # Create a response with PDF content type
    response = HttpResponse(content_type='application/pdf')
    response['Content-Disposition'] = f'inline; filename="join_date.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

#retirement date
@login_required
def report_retirement_date_pdf(request):
    role = request.user.role
    if role and role.modules.filter(name='report_retirement_date_admin').exists():
        service_info = ServiceInformation.objects.filter().exclude(retirement=None).order_by('-retirement','member__company__battalion__sn','member__company__sn','member__member_type','member__rank') 
    elif role and role.modules.filter(name='report_retirement_date_battalion').exists():
        companies = request.user.battalion.companies.all()
        service_info = ServiceInformation.objects.filter(Q(member__company__in=companies)|Q(member__p_company__in=companies)).exclude(retirement=None).order_by('-retirement', 'member__company__battalion__sn','member__company__sn','member__member_type','member__rank')    
    elif role and role.modules.filter(name='report_retirement_date_company').exists():
        company=request.user.company
        service_info = ServiceInformation.objects.filter(Q(member__company=company)|Q(member__p_company=company)).exclude(retirement=None).order_by('-retirement', 'member__company__battalion__sn','member__company__sn','member__member_type','member__rank')    
    else:
        messages.error(request, "You don't have permission to view this page.")
        return render(request, 'others/no_permission.html')   
    
     
    date_from = request.GET.get('date_from')
    date_to = request.GET.get('date_to')
    def is_valid_date(value):
        return value not in [None, '', 'None']
    if is_valid_date(date_from):
        service_info = service_info.filter(retirement__gte=date_from)
    if is_valid_date(date_to):
        service_info = service_info.filter(retirement__lte=date_to)
        
    context = {
        "service_info": service_info,
        "date_from":date_from,
        "date_to":date_to,
        "name" : f"Retirement Date",
    }
    # Load the HTML template and render it with context data
    template = get_template('report/retirement_datePDF.html')
    html = template.render(context)

    # Create a response with PDF content type
    response = HttpResponse(content_type='application/pdf')
    response['Content-Disposition'] = f'inline; filename="retirement_date.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