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



#TODO: Leave
@login_required
def read_main_leave(request):
    role = request.user.role
    if role and role.modules.filter(name='read_main_leave_admin').exists():
        main_leave = MainLeave.objects.filter().order_by('-created_at', '-id') 
        members = Member.objects.filter(active=True).order_by('army_no')
    elif role and role.modules.filter(name='read_main_leave_battalion').exists():
        companies = request.user.battalion.companies.all()
        main_leave = MainLeave.objects.filter(member__company__in=companies).order_by('-created_at', '-id') 
        members = Member.objects.filter(company__in=companies, active=True).order_by('army_no')
    elif role and role.modules.filter(name='read_main_leave_company').exists():
        company = request.user.company
        main_leave = MainLeave.objects.filter(member__company=company).order_by('-created_at', '-id') 
        members = Member.objects.filter(company=company, active=True).order_by('army_no')
    else:
        return render(request, 'others/no_permission.html')
    
    


    search_query = request.GET.get("search", "")
    battalion_query = request.GET.get("battalion_query")
    if battalion_query:
        battalion = Battalion.objects.get(id=battalion_query)
        main_leave = main_leave.filter(member__company__battalion=battalion)

    company_query = request.GET.get("company_query")
    if company_query:
        company = Company.objects.get(id=company_query)
        main_leave = main_leave.filter(member__company=company)
    leave_type_query = request.GET.get("leave_type","")
    if leave_type_query:
        main_leave = main_leave.filter(leave_type=leave_type_query)
    order_query = request.GET.get("order","")
    if order_query == "today":
        main_leave = main_leave.filter(end_date__gt=get_custom_today())
    if search_query:
    # Use Q objects for OR logic
        main_leave = main_leave.filter(
            Q(member__army_no__icontains=search_query) |
            Q(member__mobile_no__icontains=search_query) |
            Q(member__name__icontains=search_query) |
            Q(member__rank__name__icontains=search_query)
        ) 
    # pagination for main_leave
    paginator = Paginator(main_leave, 50)  # 50 records per page
    page_number = request.GET.get('page')
    main_leave = paginator.get_page(page_number)
    leave_types = [key for key, label in MainLeave.CHOICE_LIST]
    leave_types = LeaveType.objects.filter(name__in=leave_types)
    reasons = LeaveReason.objects.all()
    
    
    query_dict = request.GET.copy()
    if 'page' in query_dict:
        query_dict.pop('page')
    query_string = query_dict.urlencode()
    context = {
        "main_leave":main_leave,
        "members":members,
        "types":leave_types,
        "reasons":reasons,
        "search_query": search_query,  # Pass search query to template
        "order_query": order_query,
        "leave_type_query": leave_type_query,
        "battalion_query": int(battalion_query) if battalion_query else '',
        "company_query": int(company_query) if company_query else '',
        "battalions": Battalion.objects.all(),
        "companies": Company.objects.all(),
        "query_string": query_string,
    }
    return render(request,'absent_details/main_leave_table.html',context)

@login_required
def read_main_leave_pdf(request):
    role = request.user.role
    if role and role.modules.filter(name='read_main_leave_admin').exists():
        main_leave = MainLeave.objects.filter().order_by('-created_at', '-id') 
    elif role and role.modules.filter(name='read_main_leave_battalion').exists():
        companies = request.user.battalion.companies.all()
        main_leave = MainLeave.objects.filter(member__company__in=companies).order_by('-created_at', '-id') 
    elif role and role.modules.filter(name='read_main_leave_company').exists():
        company = request.user.company
        main_leave = MainLeave.objects.filter(member__company=company).order_by('-created_at', '-id') 
    else:
        return render(request, 'others/no_permission.html')
    
    search_query = request.GET.get("search", "")
    battalion_query = request.GET.get("battalion_query")
    if battalion_query:
        battalion = Battalion.objects.get(id=battalion_query)
        main_leave = main_leave.filter(member__company__battalion=battalion)

    company_query = request.GET.get("company_query")
    if company_query:
        company = Company.objects.get(id=company_query)
        main_leave = main_leave.filter(member__company=company)
    leave_type_query = request.GET.get("leave_type","")
    if leave_type_query:
        main_leave = main_leave.filter(leave_type=leave_type_query)
    order_query = request.GET.get("order","")
    if order_query == "today":
        main_leave = main_leave.filter(end_date__gt=get_custom_today())
    if search_query:
    # Use Q objects for OR logic
        main_leave = main_leave.filter(
            Q(member__army_no__icontains=search_query) |
            Q(member__mobile_no__icontains=search_query) |
            Q(member__name__icontains=search_query) |
            Q(member__rank__name__icontains=search_query)
        ) 
    context = {
        "main_leave":main_leave,
        "name":"Leave"
    }
    # Load the HTML template and render it with context data
    template = get_template('absent_details/read_main_leave_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="Leave.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


@login_required
def create_main_leave(request):
    if request.method == 'POST':
        army_no = request.POST.get('army_no')
        Leave_type_id = request.POST.get('type')
        start_date = request.POST.get('start_date')
        end_date = request.POST.get('end_date')
        reason_id = request.POST.get('reason')
        reason_des_id = request.POST.get('reason_des')
        # Check if all fields are provided
        if not all([army_no,Leave_type_id,start_date,end_date]):
            messages.error(request, "All fields are required")
            return redirect('read_main_leave')
        # Check if the member exists
        
        role = request.user.role
        if role and role.modules.filter(name='create_main_leave_admin').exists():
            if not Member.objects.filter(army_no=army_no).exists():
                messages.error(request, "Member does not exist")
                return redirect('read_main_leave')
        elif role and role.modules.filter(name='create_main_leave_battalion').exists():
            companies = request.user.battalion.companies.all()
            if not Member.objects.filter(army_no=army_no, company__in=companies).exists():
                messages.error(request, "Member does not exist")
                return redirect('read_main_leave')
        elif role and role.modules.filter(name='create_main_leave_company').exists():
            company = request.user.company
            if not Member.objects.filter(army_no=army_no, company=company).exists():
                messages.error(request, "Member does not exist")
                return redirect('read_main_leave')
        else:
            return render(request, 'others/no_permission.html')
        
        

        member = Member.objects.get(army_no=army_no)
        # Convert the start and end date strings into datetime objects
        start_date_obj = datetime.strptime(start_date, "%Y-%m-%d").date()
        end_date_obj = datetime.strptime(end_date, "%Y-%m-%d").date()

        # Calculate the number of days (including the start date)
        days = (end_date_obj - start_date_obj).days + 1
        #check any leave exists in the date range for the member
        existing_leaves = Leave.objects.filter(
            member=member,
            date__range=(start_date_obj, end_date_obj)
        )
        if existing_leaves.exists():
            messages.error(request, "Leave already exists for the member in the date range")
            return redirect('read_main_leave')
        leave_type = LeaveType.objects.get(id=Leave_type_id)
        reason = LeaveReason.objects.get(id=reason_id) if reason_id else None
        reason_des = LeaveReasonDes.objects.get(id=reason_des_id) if reason_des_id else None
        try:
            main_leave, created = MainLeave.objects.get_or_create(member=member,leave_type=leave_type,start_date=start_date,end_date=end_date)
            main_leave.days = days
            main_leave.reason = reason
            main_leave.reason_des = reason_des
            main_leave.save()
          
            current_date = start_date_obj
            try:
                while current_date <= end_date_obj:
                    leave, created = Leave.objects.get_or_create(
                        member=member,
                        date=current_date,
                        leave_type=leave_type,
                        start_date=start_date,
                        end_date=end_date,
                        days=days,
                        reason=reason,
                        reason_des=reason_des,
                        apply_by="admin",
                    )
                    current_date += timedelta(days=1)  # Move to the next date
            except Exception as e:
                messages.error(request, "An error occurred to create leave") 
                print(e)
                return redirect('read_main_leave')
            
            messages.success(request, f"✅ {member.name} has been added to Leave")
            return redirect('read_main_leave')
        except Exception as e:
            messages.error(request, "An error occurred")
            print(e)
            return redirect('read_main_leave')
    return render(request,'absent_details/main_leave_table.html')

@login_required
def update_main_leave(request,id):
    if request.method == 'POST':
        main_leave = MainLeave.objects.get(id=id)
        
        # Check if the member exists
        member = main_leave.member
        role = request.user.role
        if role and role.modules.filter(name='update_main_leave_admin').exists():
            if not Member.objects.filter(id=member.id).exists():
                messages.error(request, "Member does not exist")
                return redirect('read_main_leave')
        elif role and role.modules.filter(name='update_main_leave_battalion').exists():
            companies = request.user.battalion.companies.all()
            if not Member.objects.filter(id=member.id, company__in=companies).exists():
                messages.error(request, "Member does not exist")
                return redirect('read_main_leave')
        elif role and role.modules.filter(name='update_main_leave_company').exists():
            company = request.user.company
            if not Member.objects.filter(id=member.id, company=company).exists():
                messages.error(request, "Member does not exist")
                return redirect('read_main_leave')
        else:
            return render(request, 'others/no_permission.html')
        
        
        end_date = request.POST.get('end_date')
        if not end_date:
            messages.error(request, "All fields are required")
            return redirect('read_main_leave')
        start_date = main_leave.start_date
        # Convert the start and end date strings into datetime objects
        start_date_obj = start_date
        end_date_obj = datetime.strptime(end_date, "%Y-%m-%d").date()
        days = (end_date_obj - start_date_obj).days + 1
        leave_type = main_leave.leave_type
        start_date = main_leave.start_date
        reason = main_leave.reason
        # First, delete leaves beyond the new end_date
        Leave.objects.filter(
            member=member,
            date__gt=end_date_obj,
            leave_type=leave_type,
            start_date=start_date
        ).delete()
        main_leave.end_date = end_date
        main_leave.days = days
        main_leave.save()
        
        current_date = start_date_obj
        try:
            while current_date <= end_date_obj:
                leave, created = Leave.objects.get_or_create(
                    member=member,
                    date=current_date,
                    leave_type=leave_type,
                    start_date=start_date,
                )
                leave.end_date = end_date
                leave.days = days
                leave.save()
                if created:
                    leave.end_date=end_date
                    leave.days=days
                    leave.reason=reason
                    leave.apply_by=request.user.name
                    leave.save()
                current_date += timedelta(days=1)  # Move to the next date
        except Exception as e:
            messages.error(request, "An error occurred to create leave") 
            return redirect('read_main_leave')
            
        
        messages.success(request, f"✅ {member.name} has been updated to Leave")
        return redirect('read_main_leave')




#TODO: Course/Cdr/Trg
@login_required
def read_course_cdr_trg(request):
    role = request.user.role
    if role and role.modules.filter(name='read_course_cdr_trg_admin').exists():
        courseCdrTrg = Course_Cdr_Trg.objects.all().order_by('-created_at', '-id') 
        members = Member.objects.filter(active=True).order_by('army_no')
    elif role and role.modules.filter(name='read_course_cdr_trg_battalion').exists():
        companies = request.user.battalion.companies.all()
        courseCdrTrg = Course_Cdr_Trg.objects.filter(member__company__in=companies).order_by('-created_at', '-id') 
        members = Member.objects.filter(company__in=companies, active=True).order_by('army_no')
    elif role and role.modules.filter(name='read_course_cdr_trg_company').exists():
        company = request.user.company
        courseCdrTrg = Course_Cdr_Trg.objects.filter(member__company=company).order_by('-created_at', '-id') 
        members = Member.objects.filter(company=company, active=True).order_by('army_no')
    else:
        return render(request, 'others/no_permission.html')




    search_query = request.GET.get("search", "")  # Get search query
    order_query = request.GET.get("order","")
    leave_type_query = request.GET.get("leave_type","")
    if order_query:
        courseCdrTrg = courseCdrTrg.filter(end_date__gt=get_custom_today())
    if leave_type_query:
        courseCdrTrg = courseCdrTrg.filter(leave_type=leave_type_query)
    if search_query:
        # Use Q objects for OR logic
        courseCdrTrg = courseCdrTrg.filter(
            Q(member__army_no__icontains=search_query) |
            Q(member__mobile_no__icontains=search_query) |
            Q(member__name__icontains=search_query) |
            Q(member__rank__name__icontains=search_query)
        )
    # pagination for courseCdrTrg
    paginator = Paginator(courseCdrTrg, 50)  # 50 records per page
    page_number = request.GET.get('page')
    courseCdrTrg = paginator.get_page(page_number)
    courseCdrTrg_types = [key for key, label in Course_Cdr_Trg.CHOICE_LIST]
    leave_types = LeaveType.objects.filter(name__in=courseCdrTrg_types)
    # course name and institution
    course_names = CourseName.objects.all()
    course_institutions = CourseInstitution.objects.all()
    
    # 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 = {
        "courseCdrTrg":courseCdrTrg,
        "members":members,
        "types":leave_types,
        "search_query": search_query,
        "order_query":order_query,
        "leave_type_query":leave_type_query,
        "course_names":course_names,
        "course_institutions":course_institutions,
        "results":RESULT_LIST,
        "query_string":query_string
    }
    return render(request,'absent_details/CourseCdrTrg_table.html',context)
@login_required
def read_course_cdr_trg_pdf(request):
    role = request.user.role
    if role and role.modules.filter(name='read_course_cdr_trg_admin').exists():
        courseCdrTrg = Course_Cdr_Trg.objects.all().order_by('-created_at', '-id') 
    elif role and role.modules.filter(name='read_course_cdr_trg_battalion').exists():
        companies = request.user.battalion.companies.all()
        courseCdrTrg = Course_Cdr_Trg.objects.filter(member__company__in=companies).order_by('-created_at', '-id') 
    elif role and role.modules.filter(name='read_course_cdr_trg_company').exists():
        company = request.user.company
        courseCdrTrg = Course_Cdr_Trg.objects.filter(member__company=company).order_by('-created_at', '-id') 
    else:
        return render(request, 'others/no_permission.html')

    search_query = request.GET.get("search", "")  # Get search query
    order_query = request.GET.get("order","")
    leave_type_query = request.GET.get("leave_type","")
    if order_query:
        courseCdrTrg = courseCdrTrg.filter(end_date__gt=get_custom_today())
    if leave_type_query:
        courseCdrTrg = courseCdrTrg.filter(leave_type=leave_type_query)
    if search_query:
        # Use Q objects for OR logic
        courseCdrTrg = courseCdrTrg.filter(
            Q(member__army_no__icontains=search_query) |
            Q(member__mobile_no__icontains=search_query) |
            Q(member__name__icontains=search_query) |
            Q(member__rank__name__icontains=search_query)
        )
    context = {
        "courseCdrTrg":courseCdrTrg,
        "name":"Course/Cdr/Trg"
    }
    # Load the HTML template and render it with context data
    template = get_template('absent_details/read_course_cdr_trg_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="Course_Cdr_Trg.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

@login_required
def create_course_cdr_trg(request):
    if request.method == 'POST':
        army_no = request.POST.get('army_no')
        Leave_type_id = request.POST.get('type')
        start_date = request.POST.get('start_date')
        end_date = request.POST.get('end_date')
        course_name_id = request.POST.get('course_name')
        course_institution_id = request.POST.get('course_institution')
        # Check if all fields are provided
        if not all([army_no,Leave_type_id,start_date,end_date]):
            messages.error(request, "All fields are required")
            return redirect('read_course_cdr_trg')
        # Check if the member exists
        role = request.user.role
        if role and role.modules.filter(name='create_course_cdr_trg_admin').exists():
            if not Member.objects.filter(army_no=army_no).exists():
                messages.error(request, "Member does not exist")
                return redirect('read_course_cdr_trg')
        elif role and role.modules.filter(name='create_course_cdr_trg_battalion').exists():
            companies = request.user.battalion.companies.all()
            if not Member.objects.filter(army_no=army_no, company__in=companies).exists():
                messages.error(request, "Member does not exist")
                return redirect('read_course_cdr_trg')
        elif role and role.modules.filter(name='create_course_cdr_trg_company').exists():
            company = request.user.company
            if not Member.objects.filter(army_no=army_no, company=company).exists():
                messages.error(request, "Member does not exist")
                return redirect('read_course_cdr_trg')
        else:
            return render(request, 'others/no_permission.html')
        
        
        member = Member.objects.get(army_no=army_no)
        # Convert the start and end date strings into datetime objects
        start_date_obj = datetime.strptime(start_date, "%Y-%m-%d").date()
        end_date_obj = datetime.strptime(end_date, "%Y-%m-%d").date()

        # Calculate the number of days (including the start date)
        days = (end_date_obj - start_date_obj).days + 1
        #check any leave exists in the date range for the member
        existing_leaves = Leave.objects.filter(
            member=member,
            date__range=(start_date_obj, end_date_obj)
        )
        if existing_leaves.exists():
            messages.error(request, "Leave already exists for the member in the date range")
            return redirect('read_course_cdr_trg')
        leave_type = LeaveType.objects.get(id=Leave_type_id)
        course_name = CourseName.objects.get(id=course_name_id) if course_name_id else None
        course_institution = CourseInstitution.objects.get(id=course_institution_id) if course_institution_id else None
        try:
            courseCdrTrg, created = Course_Cdr_Trg.objects.get_or_create(member=member,leave_type=leave_type,start_date=start_date,end_date=end_date)
            courseCdrTrg.days = days
            courseCdrTrg.course_name = course_name
            courseCdrTrg.institution = course_institution
            courseCdrTrg.save()
            # Create a MovementOrder entry
            movement_order, created = MovementOrder.objects.get_or_create(member=member, movement_type=leave_type.name, start_date=start_date, end_date=end_date)
            movement_order.show_movement_type = leave_type.showName
            movement_order.days = days
            movement_order.save()
            
            
            current_date = start_date_obj
            try:
                while current_date <= end_date_obj:
                    leave, created = Leave.objects.get_or_create(
                        member=member,
                        date=current_date,
                        leave_type=leave_type,
                        start_date=start_date,
                        end_date=end_date,
                        days=days,
                        apply_by=role.name,
                    )
                    current_date += timedelta(days=1)  # Move to the next date
            except Exception as e:
                messages.error(request, "An error occurred to create leave") 
                print(e)
                return redirect('read_course_cdr_trg')
            
            messages.success(request, f"✅ {member.name} has been added to Course/Cdr/Trg")
            return redirect('read_course_cdr_trg')
        except Exception as e:
            messages.error(request, "An error occurred")
            print(e)
            return redirect('read_course_cdr_trg')
    return render(request,'absent_details/CourseCdrTrg_table.html')

@login_required
def update_course_cdr_trg(request,id):
    if request.method == 'POST':
        courseCdrTrg = Course_Cdr_Trg.objects.get(id=id)
        member = courseCdrTrg.member
        
        # Check if the member exists
        role = request.user.role
        if role and role.modules.filter(name='update_course_cdr_trg_admin').exists():
            if not Member.objects.filter(id=member.id).exists():
                messages.error(request, "Member does not exist")
                return redirect('read_course_cdr_trg')
        elif role and role.modules.filter(name='update_course_cdr_trg_battalion').exists():
            companies = request.user.battalion.companies.all()
            if not Member.objects.filter(id=member.id, company__in=companies).exists():
                messages.error(request, "Member does not exist")
                return redirect('read_course_cdr_trg')
        elif role and role.modules.filter(name='update_course_cdr_trg_company').exists():
            company = request.user.company
            if not Member.objects.filter(id=member.id, company=company).exists():
                messages.error(request, "Member does not exist")
                return redirect('read_course_cdr_trg')
        else:
            return render(request, 'others/no_permission.html')
        
        
        # Get the end date from the request
        end_date = request.POST.get('end_date')
        result = request.POST.get('result')
        marks = request.POST.get('marks')
        if not end_date:
            messages.error(request, "All fields are required")
            return redirect('read_course_cdr_trg')
        start_date = courseCdrTrg.start_date
        # Convert the start and end date strings into datetime objects
        start_date_obj = start_date
        end_date_obj = datetime.strptime(end_date, "%Y-%m-%d").date()
        days = (end_date_obj - start_date_obj).days + 1
        leave_type = courseCdrTrg.leave_type
        start_date = courseCdrTrg.start_date
        # First, delete leaves beyond the new end_date
        Leave.objects.filter(
            member=member,
            date__gt=end_date_obj,
            leave_type=leave_type,
            start_date=start_date
        ).delete()
        #movement order
        movement_order = MovementOrder.objects.filter(member=member, movement_type=leave_type.name, start_date=start_date).first()
        if movement_order:
            movement_order.end_date = end_date
            movement_order.days = days
            movement_order.save()
        #courseCdrTrg
        courseCdrTrg.end_date = end_date
        courseCdrTrg.days = days
        if result:
            courseCdrTrg.result = result
        if marks:
            courseCdrTrg.marks = marks
        courseCdrTrg.save()


        current_date = start_date_obj
        try:
            while current_date <= end_date_obj:
                leave, created = Leave.objects.get_or_create(
                    member=member,
                    date=current_date,
                    leave_type=leave_type,
                    start_date=start_date,
                )
                leave.end_date = end_date
                leave.days = days
                leave.save()
                if created:
                    leave.end_date=end_date
                    leave.days=days
                    leave.apply_by=request.user.role.name
                    leave.save()
                current_date += timedelta(days=1)  # Move to the next date
        except Exception as e:
            messages.error(request, "An error occurred to create leave") 
            return redirect('read_course_cdr_trg')
            
        
        messages.success(request, f"✅ {member.name} has been updated to Course/Cdr/Trg")
        return redirect('read_course_cdr_trg')
        






#TODO: Out of Unit Employee
@login_required
def read_out_of_unit_emp(request, props=None):
    role = request.user.role
    if role and role.modules.filter(name='read_out_of_unit_emp_admin').exists():
        out_of_unit_emp = OutOfUnitEmp.objects.all().order_by('-created_at', '-id')
        members = Member.objects.filter(active=True).order_by('army_no')
    elif role and role.modules.filter(name='read_out_of_unit_emp_battalion').exists():
        companies = request.user.battalion.companies.all()
        out_of_unit_emp = OutOfUnitEmp.objects.filter(Q(member__company__in=companies)|Q(member__p_company__in=companies)).exclude(member__t_company__in=companies).order_by('-created_at', '-id')
        members = Member.objects.filter(active=True, company__in=companies).exclude(t_company__in=companies).order_by('army_no')
    elif role and role.modules.filter(name='read_out_of_unit_emp_company').exists():
        company = request.user.company
        out_of_unit_emp = OutOfUnitEmp.objects.filter(Q(member__company=company)|Q(member__p_company=company)).exclude(member__t_company=company).order_by('-created_at', '-id')
        members = Member.objects.filter(company=company,active=True).exclude(t_company=company).order_by('army_no')   
    else:
        return render(request, 'others/no_permission.html')

    if props == None :
        pass
    elif props == 'all':
        out_of_unit_emp = out_of_unit_emp.filter(status=True)
    else:
        out_of_unit_emp = out_of_unit_emp.filter(type_name=props, status=True)
        
    search_query = request.GET.get("search", "")  # Get search query
    status_query = request.GET.get("status", "")
    if status_query:
        out_of_unit_emp = out_of_unit_emp.filter(status=status_query)
    if search_query:
        # Use Q objects for OR logic
        out_of_unit_emp = out_of_unit_emp.filter(
            Q(member__army_no__icontains=search_query) |
            Q(member__mobile_no__icontains=search_query) |
            Q(member__name__icontains=search_query) |
            Q(member__rank__name__icontains=search_query) |
            Q(status__icontains=search_query)
        ) 
    # pagination for courseCdrTrg
    paginator = Paginator(out_of_unit_emp, 50)  # 50 records per page
    page_number = request.GET.get('page')
    out_of_unit_emp = 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 = {
        "out_of_unit_emp":out_of_unit_emp,
        "types":OutOfUnitEmp.CHOICE_LIST,
        "search_query": search_query,  # Pass search query to template
        "members":members,
        "status_query": status_query,
        "query_string":query_string,
        "props":props
    }
    return render(request,'absent_details/out_of_unit_emp_table.html',context)
@login_required
def read_out_of_unit_emp_pdf(request, props=None):
    role = request.user.role
    if role and role.modules.filter(name='read_out_of_unit_emp_admin').exists():
        out_of_unit_emp = OutOfUnitEmp.objects.all().order_by('-created_at', '-id')
    elif role and role.modules.filter(name='read_out_of_unit_emp_battalion').exists():
        companies = request.user.battalion.companies.all()
        out_of_unit_emp = OutOfUnitEmp.objects.filter(Q(member__company__in=companies)|Q(member__p_company__in=companies)).exclude(member__t_company__in=companies).order_by('-created_at', '-id')
    elif role and role.modules.filter(name='read_out_of_unit_emp_company').exists():
        company = request.user.company
        out_of_unit_emp = OutOfUnitEmp.objects.filter(Q(member__company=company)|Q(member__p_company=company)).exclude(member__t_company=company).order_by('-created_at', '-id')
    else:
        return render(request, 'others/no_permission.html')

    if props == None or props == 'None' :
        pass
    elif props == 'all':
        out_of_unit_emp = out_of_unit_emp.filter(status=True)
    else:
        out_of_unit_emp = out_of_unit_emp.filter(type_name=props, status=True)
        
    search_query = request.GET.get("search", "")  # Get search query
    status_query = request.GET.get("status", "")
    if status_query:
        out_of_unit_emp = out_of_unit_emp.filter(status=status_query)
    if search_query:
        # Use Q objects for OR logic
        out_of_unit_emp = out_of_unit_emp.filter(
            Q(member__army_no__icontains=search_query) |
            Q(member__mobile_no__icontains=search_query) |
            Q(member__name__icontains=search_query) |
            Q(member__rank__name__icontains=search_query) |
            Q(status__icontains=search_query)
        ) 
    context = {
        "out_of_unit_emp":out_of_unit_emp,
        "name":"Out of Unit Employee",
    }
    # Load the HTML template and render it with context data
    template = get_template('absent_details/read_out_of_unit_emp_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="Out_of_unit_emp.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


@login_required
def create_out_of_unit_emp(request):
    today = get_custom_today()
    if request.method == 'POST':
        army_no = request.POST.get('army_no')
        type_name = request.POST.get('type')
        unit = request.POST.get('unit')
        start_date = today
        reason = request.POST.get('reason')
        # Check if all fields are provided
        if not all([army_no,type_name,unit]):
            messages.error(request, "All fields are required")
            return redirect('read_out_of_unit_emp')
        
        
        # Check if the member exists
        role = request.user.role
        if role and role.modules.filter(name='create_out_of_unit_emp_admin').exists():
            if not Member.objects.filter(army_no=army_no).exists():
                messages.error(request, "Member does not exist")
                return redirect('read_out_of_unit_emp')
        elif role and role.modules.filter(name='create_out_of_unit_emp_battalion').exists():
            companies = request.user.battalion.companies.all()
            if not Member.objects.filter(army_no=army_no, company__in=companies).exists():
                messages.error(request, "Member does not exist")
                return redirect('read_out_of_unit_emp')
        elif role and role.modules.filter(name='create_out_of_unit_emp_company').exists():
            company = request.user.company
            if not Member.objects.filter(army_no=army_no, company=company).exists():
                messages.error(request, "Member does not exist")
                return redirect('read_out_of_unit_emp')
        else:
            return render(request, 'others/no_permission.html')
        
        
        member = Member.objects.get(army_no=army_no)
        #check member exits in out of unit employee
        if OutOfUnitEmp.objects.filter(member=member,status=True).exists():
            messages.error(request, "Member already exists in out of unit employee")
            return redirect('read_out_of_unit_emp')
        try:
            out_of_unit_emp = OutOfUnitEmp.objects.create(member=member,type_name=type_name,start_date=start_date)
            out_of_unit_emp.unit = unit
            out_of_unit_emp.reason = reason
            out_of_unit_emp.status = True
            out_of_unit_emp.save()
            # Create a MovementOrder entry
            movement_order = MovementOrder.objects.create(member=member, movement_type=type_name, start_date=start_date)
            movement_order.show_movement_type = out_of_unit_emp.get_type_name_display()
            movement_order.status = 'out'
            movement_order.unit = unit
            movement_order.reason = reason
            movement_order.save()
            messages.success(request, f"✅ {member.name} has been added to out of unit employee")
            return redirect('read_out_of_unit_emp')
        except Exception as e:
            messages.error(request, "An error occurred")
            print(e)
            return redirect('read_out_of_unit_emp')
        
@login_required
def remove_out_of_unit_emp(request,id):
    out_of_unit_emp = OutOfUnitEmp.objects.get(id=id)
    # Check if the member exists
    member = out_of_unit_emp.member
    role = request.user.role
    if role and role.modules.filter(name='remove_out_of_unit_emp_admin').exists():
        if not Member.objects.filter(id=member.id).exists():
            messages.error(request, "Member does not exist")
            return redirect('read_out_of_unit_emp')
    elif role and role.modules.filter(name='remove_out_of_unit_emp_battalion').exists():
        companies = request.user.battalion.companies.all()
        if not Member.objects.filter(id=member.id, company__in=companies).exists():
            messages.error(request, "Member does not exist")
            return redirect('read_out_of_unit_emp')
    elif role and role.modules.filter(name='remove_out_of_unit_emp_company').exists():
        company = request.user.company
        if not Member.objects.filter(id=member.id, company=company).exists():
            messages.error(request, "Member does not exist")
            return redirect('read_out_of_unit_emp')
    else:
        return render(request, 'others/no_permission.html')
    
    
    
    
    if request.method == 'POST':
        try:
            reason = request.POST.get('reason')
            out_of_unit_emp.end_date = get_custom_today()
            out_of_unit_emp.status = False
            out_of_unit_emp.save()
            # create movement order
            movement_order = MovementOrder.objects.create(member=member,start_date=out_of_unit_emp.start_date,end_date=get_custom_today(),reason=reason,status="in",movement_type=out_of_unit_emp.type_name, show_movement_type=out_of_unit_emp.get_type_name_display())
            messages.success(request, f"✅ {member.name} has been removed from out of unit employee")
            search_term = request.GET.get('search', '')
            status = request.GET.get('status', 'True')  # or any default
            url = reverse('read_out_of_unit_emp')  # get the base URL from the name
            query_string = f"?status={status}&search={search_term}"
            return redirect(f"{url}{query_string}")

        except Exception as e:
            messages.error(request, "An error occurred")
            print(e)
            return redirect('read_out_of_unit_emp')
        
 #TODO: UnauthAbsent       
@login_required
def read_unauth_absent(request):
    role = request.user.role
    if role and role.modules.filter(name='read_unauth_absent_admin').exists():
        unauth_absent = UnauthAbsent.objects.all().order_by('-created_at', '-id')
        members = Member.objects.filter(active=True).order_by('army_no')
    elif role and role.modules.filter(name='read_unauth_absent_battalion').exists():
        companies = request.user.battalion.companies.all()
        unauth_absent = UnauthAbsent.objects.filter(member__company__in=companies).order_by('-created_at', '-id')
        members = Member.objects.filter(active=True, company__in=companies).order_by('army_no')
    elif role and role.modules.filter(name='read_unauth_absent_company').exists():
        company = request.user.company
        unauth_absent = UnauthAbsent.objects.filter(member__company=company).order_by('-created_at', '-id')
        members = Member.objects.filter(active=True, company=company).order_by('army_no')
    else:
        return render(request, 'others/no_permission.html')


    search_query = request.GET.get("search", "")  # Get search query
    status_query = request.GET.get("status", "")
    if status_query:
        unauth_absent = unauth_absent.filter(status=status_query)
    if search_query:
        # Use Q objects for OR logic
        unauth_absent = unauth_absent.filter(
            Q(member__army_no__icontains=search_query) |
            Q(member__mobile_no__icontains=search_query) |
            Q(status__icontains=search_query) |
            Q(member__name__icontains=search_query) |
            Q(member__rank__name__icontains=search_query) 
        )
    # pagination for courseCdrTrg
    paginator = Paginator(unauth_absent, 50)  # 50 records per page
    page_number = request.GET.get('page')
    unauth_absent = paginator.get_page(page_number)
    unauth_absent_types = [key for key, label in UnauthAbsent.CHOICE_LIST]
    leave_types = LeaveType.objects.filter(name__in=unauth_absent_types)
    reasons = LeaveReason.objects.all().order_by('text')
    
    
    # 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 = {
        "unauth_absent":unauth_absent,
        "types":leave_types,
        "search_query": search_query,  # Pass search query to template
        "members":members,
        "status_query":status_query,
        "reasons":reasons,
        "query_string":query_string
    }
    return render(request,'absent_details/unauth_absent_table.html',context)
      
@login_required
def read_unauth_absent_pdf(request):
    role = request.user.role
    if role and role.modules.filter(name='read_unauth_absent_admin').exists():
        unauth_absent = UnauthAbsent.objects.all().order_by('-created_at', '-id')
    elif role and role.modules.filter(name='read_unauth_absent_battalion').exists():
        companies = request.user.battalion.companies.all()
        unauth_absent = UnauthAbsent.objects.filter(member__company__in=companies).order_by('-created_at', '-id')
    elif role and role.modules.filter(name='read_unauth_absent_company').exists():
        company = request.user.company
        unauth_absent = UnauthAbsent.objects.filter(member__company=company).order_by('-created_at', '-id')
    else:
        return render(request, 'others/no_permission.html')


    search_query = request.GET.get("search", "")  # Get search query
    status_query = request.GET.get("status", "")
    if status_query:
        unauth_absent = unauth_absent.filter(status=status_query)
    if search_query:
        # Use Q objects for OR logic
        unauth_absent = unauth_absent.filter(
            Q(member__army_no__icontains=search_query) |
            Q(member__mobile_no__icontains=search_query) |
            Q(status__icontains=search_query) |
            Q(member__name__icontains=search_query) |
            Q(member__rank__name__icontains=search_query) 
        )
    context = {
        "unauth_absent":unauth_absent,
        "name":"Unauth Absent",
    }
    # Load the HTML template and render it with context data
    template = get_template('absent_details/read_unauth_absent_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="Unauth_Absent.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
      
@login_required
def create_unauth_absent(request):
    today = get_custom_today()
    if request.method == 'POST':
        army_no = request.POST.get('army_no')
        Leave_type_id = request.POST.get('type')
        start_date = today
        reason_id = request.POST.get('reason')
        # Check if all fields are provided
        if not all([army_no,Leave_type_id]):
            messages.error(request, "All fields are required")
            return redirect('read_unauth_absent')
        
        
        # Check if the member exists
        role = request.user.role
        if role and role.modules.filter(name='create_unauth_absent_admin').exists():
            if not Member.objects.filter(army_no=army_no).exists():
                messages.error(request, "Member does not exist")
                return redirect('read_unauth_absent')
        elif role and role.modules.filter(name='create_unauth_absent_battalion').exists():
            companies = request.user.battalion.companies.all()
            if not Member.objects.filter(army_no=army_no, company__in=companies).exists():
                messages.error(request, "Member does not exist")
                return redirect('read_unauth_absent')
        elif role and role.modules.filter(name='create_unauth_absent_company').exists():
            company = request.user.company
            if not Member.objects.filter(army_no=army_no, company=company).exists():
                messages.error(request, "Member does not exist")
                return redirect('read_unauth_absent')
        else:
            return render(request, 'others/no_permission.html')
        
        
        leave_type = LeaveType.objects.get(id=Leave_type_id)
        member = Member.objects.get(army_no=army_no)
        #check member exits in out of unit employee
        if UnauthAbsent.objects.filter(member=member,status=True).exists():
            messages.error(request, "Member already exists in Unauth Absent")
            return redirect('read_unauth_absent')
        reason = LeaveReason.objects.get(id=reason_id) if reason_id else None
        try:
            unauth_absent = UnauthAbsent.objects.create(member=member,leave_type=leave_type,start_date=start_date)
            unauth_absent.reason = reason
            unauth_absent.status = True
            unauth_absent.save()
            # Create a MovementOrder entry
            movement_order = MovementOrder.objects.create(member=member, movement_type=leave_type.name, start_date=start_date)
            movement_order.show_movement_type = leave_type.showName
            movement_order.status = 'out'
            movement_order.reason = reason.text if reason else None
            movement_order.save()
            messages.success(request, f"✅ {member.name} has been added to Unauth Absent")
            return redirect('read_unauth_absent')
        except Exception as e:
            messages.error(request, "An error occurred")
            print(e)
            return redirect('read_unauth_absent')  
           
@login_required
def remove_unauth_absent(request,id):
    unauth_absent = UnauthAbsent.objects.get(id=id)
    member = unauth_absent.member
    # Check if the member exists
    role = request.user.role
    if role and role.modules.filter(name='remove_unauth_absent_admin').exists():
        if not Member.objects.filter(id=member.id).exists():
            messages.error(request, "Member does not exist")
            return redirect('read_unauth_absent')
    elif role and role.modules.filter(name='remove_unauth_absent_battalion').exists():
        companies = request.user.battalion.companies.all()
        if not Member.objects.filter(id=member.id, company__in=companies).exists():
            messages.error(request, "Member does not exist")
            return redirect('read_unauth_absent')
    elif role and role.modules.filter(name='remove_unauth_absent_company').exists():
        company = request.user.company
        if not Member.objects.filter(id=member.id, company=company).exists():
            messages.error(request, "Member does not exist")
            return redirect('read_unauth_absent')
    else:
        return render(request, 'others/no_permission.html')

    if request.method == 'POST':
        try:
            reason = request.POST.get('reason')
            unauth_absent.status = False
            unauth_absent.end_date = get_custom_today()
            unauth_absent.save()
            # create movement order
            movement_order = MovementOrder.objects.create(member=member,start_date=unauth_absent.start_date,end_date=get_custom_today(),reason=reason,status="in",movement_type=unauth_absent.leave_type.name, show_movement_type=unauth_absent.leave_type.showName)
            messages.success(request, f"✅ {member.name} has been removed from Unauth Absent")
            search_term = request.GET.get('search', '')
            status = request.GET.get('status', 'True')  # or any default
            url = reverse('read_unauth_absent')  # get the base URL from the name
            query_string = f"?status={status}&search={search_term}"
            return redirect(f"{url}{query_string}")

        except Exception as e:
            messages.error(request, "An error occurred")
            print(e)
            return redirect('read_unauth_absent')    


#TODO: Other Reason
@login_required
def read_other_reason(request):
    role = request.user.role
    if role and role.modules.filter(name='read_other_reason_admin').exists():
        other_reason = OtherReason.objects.all().order_by('-created_at', '-id')
        members = Member.objects.filter(active=True).order_by('id')
    elif role and role.modules.filter(name='read_other_reason_battalion').exists():
        companies = request.user.battalion.companies.all()
        other_reason = OtherReason.objects.filter(member__company__in=companies).order_by('-created_at', '-id')
        members = Member.objects.filter(active=True, company__in=companies).order_by('id')
    elif role and role.modules.filter(name='read_other_reason_company').exists():
        company = request.user.company
        other_reason = OtherReason.objects.filter(member__company=company).order_by('-created_at', '-id')
        members = Member.objects.filter(active=True, company=company).order_by('id')
    else:
        return render(request, 'others/no_permission.html')


    search_query = request.GET.get("search", "")  # Get search query
    status_query = request.GET.get('status', 'True')
    if status_query:
        other_reason = other_reason.filter(status=status_query)
    if search_query:
        # Use Q objects for OR logic
        other_reason = other_reason.filter(
            Q(member__army_no__icontains=search_query) |
            Q(member__mobile_no__icontains=search_query) |
            Q(status__icontains=search_query) |
            Q(member__name__icontains=search_query) |
            Q(member__rank__name__icontains=search_query) 
        ) 
    # pagination for courseCdrTrg
    paginator = Paginator(other_reason, 50)  # 50 records per page
    page_number = request.GET.get('page')
    other_reason = paginator.get_page(page_number)
    other_reason_types = [key for key, label in OtherReason.CHOICE_LIST]
    leave_types = LeaveType.objects.filter(name__in=other_reason_types)
    reasons = LeaveReason.objects.all()
    
    # 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 = {
        "other_reason":other_reason,
        "types":leave_types,
        "search_query": search_query,  # Pass search query to template
        "status_query": status_query,
        "members":members,
        "reasons":reasons,
        "query_string":query_string

    }
    return render(request,'absent_details/other_reason_table.html',context)
@login_required
def read_other_reason_pdf(request):
    role = request.user.role
    if role and role.modules.filter(name='read_other_reason_admin').exists():
        other_reason = OtherReason.objects.all().order_by('-created_at', '-id')
    elif role and role.modules.filter(name='read_other_reason_battalion').exists():
        companies = request.user.battalion.companies.all()
        other_reason = OtherReason.objects.filter(member__company__in=companies).order_by('-created_at', '-id')
    elif role and role.modules.filter(name='read_other_reason_company').exists():
        company = request.user.company
        other_reason = OtherReason.objects.filter(member__company=company).order_by('-created_at', '-id')
    else:
        return render(request, 'others/no_permission.html')


    search_query = request.GET.get("search", "")  # Get search query
    status_query = request.GET.get('status', 'True')
    if status_query:
        other_reason = other_reason.filter(status=status_query)
    if search_query:
        # Use Q objects for OR logic
        other_reason = other_reason.filter(
            Q(member__army_no__icontains=search_query) |
            Q(member__mobile_no__icontains=search_query) |
            Q(status__icontains=search_query) |
            Q(member__name__icontains=search_query) |
            Q(member__rank__name__icontains=search_query) 
        ) 
    context = {
        "other_reason":other_reason,
        "name":"Other Reason"
    }
    # Load the HTML template and render it with context data
    template = get_template('absent_details/read_other_reason_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="Other_reason.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

@login_required
def create_other_reason(request):
    today = get_custom_today()
    if request.method == 'POST':
        army_no = request.POST.get('army_no')
        Leave_type_id = request.POST.get('type')
        start_date = today
        reason_id = request.POST.get('reason')
        # Check if all fields are provided
        if not all([army_no,Leave_type_id]):
            messages.error(request, "All fields are required")
            return redirect('read_other_reason')
        
        
        # Check if the member exists
        role = request.user.role
        if role and role.modules.filter(name='create_other_reason_admin').exists():
            if not Member.objects.filter(army_no=army_no).exists():
                messages.error(request, "Member does not exist")
                return redirect('read_other_reason')
        elif role and role.modules.filter(name='create_other_reason_battalion').exists():
            companies = request.user.battalion.companies.all()
            if not Member.objects.filter(army_no=army_no, company__in=companies).exists():
                messages.error(request, "Member does not exist")
                return redirect('read_other_reason')
        elif role and role.modules.filter(name='create_other_reason_company').exists():
            company = request.user.company
            if not Member.objects.filter(army_no=army_no, company=company).exists():
                messages.error(request, "Member does not exist")
                return redirect('read_other_reason')
        else:
            return render(request, 'others/no_permission.html')
        
        
        leave_type = LeaveType.objects.get(id=Leave_type_id)
        member = Member.objects.get(army_no=army_no)
        #check member exits in out of unit employee
        if OtherReason.objects.filter(member=member,status=True).exists():
            messages.error(request, "Member already exists in Other Reason")
            return redirect('read_other_reason')
        reason = LeaveReason.objects.get(id=reason_id) if reason_id else None
        try:
            other_reason = OtherReason.objects.create(member=member,leave_type=leave_type,start_date=start_date)
            other_reason.reason = reason
            other_reason.status = True
            other_reason.save()
            # Create a MovementOrder entry
            movement_order = MovementOrder.objects.create(member=member, movement_type=leave_type.name, start_date=start_date)
            movement_order.show_movement_type = leave_type.showName
            movement_order.status = 'out'
            movement_order.reason = reason.text if reason else None
            movement_order.save()
            messages.success(request, f"✅ {member.name} has been added to Other Reason")
            return redirect('read_other_reason')
        except Exception as e:
            messages.error(request, "An error occurred")
            print(e)
            return redirect('read_other_reason')   
        
@login_required
def remove_other_reason(request,id):
    other_reason = OtherReason.objects.get(id=id)
    member = other_reason.member
    
    # Check if the member exists
    role = request.user.role
    if role and role.modules.filter(name='remove_other_reason_admin').exists():
        if not Member.objects.filter(id=member.id).exists():
            messages.error(request, "Member does not exist")
            return redirect('read_other_reason')
    elif role and role.modules.filter(name='remove_other_reason_battalion').exists():
        companies = request.user.battalion.companies.all()
        if not Member.objects.filter(id=member.id, company__in=companies).exists():
            messages.error(request, "Member does not exist")
            return redirect('read_other_reason')
    elif role and role.modules.filter(name='remove_other_reason_company').exists():
        company = request.user.company
        if not Member.objects.filter(id=member.id, company=company).exists():
            messages.error(request, "Member does not exist")
            return redirect('read_other_reason')
    else:
        return render(request, 'others/no_permission.html')
    
    
    
    
    if request.method == 'POST':
        try:
            reason = request.POST.get('reason')
            other_reason.status = False
            other_reason.end_date = get_custom_today()
            other_reason.save()
            # create movement order
            movement_order = MovementOrder.objects.create(member=member,start_date=other_reason.start_date,end_date=get_custom_today(),reason=reason,status="in",movement_type=other_reason.leave_type.name, show_movement_type=other_reason.leave_type.showName)
            messages.success(request, f"✅ {member.name} has been removed from Other Reason")
            search_term = request.GET.get('search', '')
            status = request.GET.get('status', 'True')  # or any default
            url = reverse('read_other_reason')  # get the base URL from the name
            query_string = f"?status={status}&search={search_term}"
            return redirect(f"{url}{query_string}")

        except Exception as e:
            messages.error(request, "An error occurred")
            print(e)
            return redirect('read_other_reason')























#TODO: Ops Depl
@login_required
def read_ops_depl(request, props=None):
    role = request.user.role
    if role and role.modules.filter(name='read_ops_depl_admin').exists():
        ops_depl = OpsDepl.objects.all().order_by('-created_at', '-id')
        members = Member.objects.filter(active=True).order_by('army_no')
    elif role and role.modules.filter(name='read_ops_depl_battalion').exists():
        companies = request.user.battalion.companies.all()
        ops_depl = OpsDepl.objects.filter(member__company__in=companies).order_by('-created_at', '-id')
        members = Member.objects.filter(active=True, company__in=companies).order_by('army_no')
    elif role and role.modules.filter(name='read_ops_depl_company').exists():
        company = request.user.company
        ops_depl = OpsDepl.objects.filter(member__company=company).order_by('-created_at', '-id')
        members = Member.objects.filter(active=True, company=company).order_by('army_no')
    else:
        return render(request, 'others/no_permission.html')
    if props == None :
        pass
    elif props == 'all':
        ops_depl = ops_depl.filter(status=True)
    else:
        ops_depl = ops_depl.filter(member__member_type__name=props,status=True)
        
    search_query = request.GET.get("search", "")  # Get search query
    status_query = request.GET.get("status", "")
    if status_query:
        ops_depl = ops_depl.filter(status=status_query)
    if search_query:
        # Use Q objects for OR logic
        ops_depl = ops_depl.filter(
            Q(member__army_no__icontains=search_query) |
            Q(member__mobile_no__icontains=search_query) |
            Q(member__name__icontains=search_query) |
            Q(member__rank__name__icontains=search_query) |
            Q(status__icontains=search_query)  
        )
    # pagination for courseCdrTrg
    paginator = Paginator(ops_depl, 50)  # 50 records per page
    page_number = request.GET.get('page')
    ops_depl = paginator.get_page(page_number)
    locations = OpsDeplLocation.objects.all()
    
    
    # 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 = {
        "ops_depl":ops_depl,
        "search_query": search_query,  # Pass search query to template
        "status_query": status_query,
        "members":members,
        "locations":locations,
        "query_string":query_string,
        "props":props

    }
    return render(request,'absent_details/ops_depl_table.html',context)

@login_required
def read_ops_depl_pdf(request, props=None):
    role = request.user.role
    if role and role.modules.filter(name='read_ops_depl_admin').exists():
        ops_depl = OpsDepl.objects.all().order_by('-created_at', '-id')
    elif role and role.modules.filter(name='read_ops_depl_battalion').exists():
        companies = request.user.battalion.companies.all()
        ops_depl = OpsDepl.objects.filter(member__company__in=companies).order_by('-created_at', '-id')
    elif role and role.modules.filter(name='read_ops_depl_company').exists():
        company = request.user.company
        ops_depl = OpsDepl.objects.filter(member__company=company).order_by('-created_at', '-id')
    else:
        return render(request, 'others/no_permission.html')
    if props == None or props == 'None':
        pass
    elif props == 'all':
        ops_depl = ops_depl.filter(status=True)
    else:
        ops_depl = ops_depl.filter(member__member_type__name=props,status=True)
        
    search_query = request.GET.get("search", "")  # Get search query
    status_query = request.GET.get("status", "")
    if status_query:
        ops_depl = ops_depl.filter(status=status_query)
    if search_query:
        # Use Q objects for OR logic
        ops_depl = ops_depl.filter(
            Q(member__army_no__icontains=search_query) |
            Q(member__mobile_no__icontains=search_query) |
            Q(member__name__icontains=search_query) |
            Q(member__rank__name__icontains=search_query) |
            Q(status__icontains=search_query)  
        )
    context = {
        "ops_depl":ops_depl,
        "name":"Ops Depl"
    }
    # Load the HTML template and render it with context data
    template = get_template('absent_details/read_ops_depl_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="Ops_Depl.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

@login_required
def create_ops_depl(request):
    today = get_custom_today()
    if request.method == 'POST':
        army_no = request.POST.get('army_no')
        location_id = request.POST.get('location')
        start_date = today

        # Check if all fields are provided
        if not all([army_no]):
            messages.error(request, "All fields are required")
            return redirect('read_ops_depl')
        
        
        # Check if the member exists
        role = request.user.role
        if role and role.modules.filter(name='read_ops_depl_admin').exists():
            if not Member.objects.filter(army_no=army_no).exists():
                messages.error(request, "Member does not exist")
                return redirect('read_ops_depl')
        elif role and role.modules.filter(name='read_ops_depl_battalion').exists():
            companies = request.user.battalion.companies.all()
            if not Member.objects.filter(army_no=army_no, company__in=companies).exists():
                messages.error(request, "Member does not exist")
                return redirect('read_ops_depl')
        elif role and role.modules.filter(name='read_ops_depl_company').exists():
            company = request.user.company
            if not Member.objects.filter(army_no=army_no, company=company).exists():
                messages.error(request, "Member does not exist")
                return redirect('read_ops_depl')
        else:
            return render(request, 'others/no_permission.html')
        
        
        member = Member.objects.get(army_no=army_no)
        #check member exits in out of unit employee
        if OpsDepl.objects.filter(member=member,member__ops_depl=True).exists():
            messages.error(request, "Member already exists in Ops Depl")
            return redirect('read_ops_depl')
        location = OpsDeplLocation.objects.get(id=location_id) if location_id else None
        try:
            ops_depl = OpsDepl.objects.create(member=member,start_date=start_date)
            ops_depl.location = location
            ops_depl.member.ops_depl = True
            ops_depl.member.save()
            ops_depl.status = True
            ops_depl.save()
            messages.success(request, f"✅ {member.name} has been added to Ops Depl")
            return redirect('read_ops_depl')
        except Exception as e:
            messages.error(request, "An error occurred")
            print(e)
            return redirect('read_ops_depl')   
        
    return render(request,'absent_details/ops_depl_table.html')


@login_required
def remove_ops_depl(request,id):
    ops_depl = OpsDepl.objects.get(id=id)
    member = ops_depl.member
    
    # Check if the member exists
    role = request.user.role
    if role and role.modules.filter(name='remove_ops_depl_admin').exists():
        if not Member.objects.filter(id=member.id).exists():
            messages.error(request, "Member does not exist")
            return redirect('read_ops_depl')
    elif role and role.modules.filter(name='remove_ops_depl_battalion').exists():
        companies = request.user.battalion.companies.all()
        if not Member.objects.filter(id=member.id, company__in=companies).exists():
            messages.error(request, "Member does not exist")
            return redirect('read_ops_depl')
    elif role and role.modules.filter(name='remove_ops_depl_company').exists():
        company = request.user.company
        if not Member.objects.filter(id=member.id, company=company).exists():
            messages.error(request, "Member does not exist")
            return redirect('read_ops_depl')
    else:
        return render(request, 'others/no_permission.html')
    
    
    if request.method == 'POST':
        try:
            member.ops_depl = False
            member.save()
            ops_depl.end_date = get_custom_today()
            ops_depl.status = False
            ops_depl.save()
            messages.success(request, f"✅ {member.name} has been removed from Ops Depl")
            search_term = request.GET.get('search', '')
            status = request.GET.get('status', 'True')  # or any default
            url = reverse('read_ops_depl')  # get the base URL from the name
            query_string = f"?status={status}&search={search_term}"
            return redirect(f"{url}{query_string}")

        except Exception as e:
            messages.error(request, "An error occurred")
            print(e)
            return redirect('read_ops_depl_admin')
    return render(request,'absent_details/ops_depl_table.html')



