from django.shortcuts import redirect, render
from datetime import datetime, timedelta
from django.db.models import Sum, Count, Q, F
from django.contrib import messages
from itertools import groupby
from django.core.paginator import Paginator
from account.models import *
from .custom_today import get_custom_today
from django.contrib.auth import get_user_model
from .utils.decorators import role_required
from dateutil.relativedelta import relativedelta
User = get_user_model()

#TODO: CC
def dashboard_cc_company(request):
    company = request.user.company
    # Count unread (pending) and read (approved/rejected) leaves
    total_count = ApplyLeave.objects.filter(member__company=company).exclude(csm_status='pending').count() 
    unread_count = ApplyLeave.objects.filter(member__company=company, company_commander_status='pending').exclude(csm_status='pending').count()
    read_count = ApplyLeave.objects.filter(member__company=company).exclude(company_commander_status='pending').count()

    context = {
        'total':total_count,
        'unread':unread_count,
        'read':read_count
    }
    return render(request, 'dashboard/_cc.html',context)

@role_required('cc_company')
def leave_check_cc_company(request):
    company = request.user.company
     # Count unread (pending) and read (approved/rejected) leaves
    unread_count = ApplyLeave.objects.filter(member__company=company, company_commander_status='pending').exclude(csm_status='pending').count()
    read_count = ApplyLeave.objects.filter(member__company=company).exclude(company_commander_status='pending').count()
    
    
    applyLeaves = ApplyLeave.objects.filter(member__company=company,company_commander_status='pending').exclude(csm_status='pending').order_by('-created_at')
    leavesHistory = ApplyLeave.objects.filter(member__company=company).exclude(company_commander_status='pending').order_by('-updated_at')
    #pagination for LeaveHistory
    paginator = Paginator(leavesHistory, 30)
    page_number = request.GET.get('page')
    leavesHistory = paginator.get_page(page_number)
    context = {
        'applyLeaves':applyLeaves,
        'leavesHistory':leavesHistory,
        'unread':unread_count,
        'read':read_count
    }
    return render(request, 'company/check_leave_cc.html', context)

@role_required('cc_company')
def leave_approve_cc_company(request,id):
    apply_leave = ApplyLeave.objects.get(id=id)
    apply_leave.company_commander_status = 'approved'
    apply_leave.status = 'approved'
    apply_leave.save()
    current_date = apply_leave.start_date
    #create mainLeave
    try:
        main_leave, created = MainLeave.objects.get_or_create(member=apply_leave.member,leave_type=apply_leave.leave_type,start_date=apply_leave.start_date,end_date=apply_leave.end_date)
        main_leave.days = apply_leave.days
        main_leave.reason = apply_leave.reason
        main_leave.reason_des = apply_leave.reason_des
        main_leave.save()
    except Exception as e:
        messages.error(request, "An error occurred") 
        return redirect('leave_check_cc_company')
    try:
        while current_date <= apply_leave.end_date:
            leave, created = Leave.objects.get_or_create(
                member=apply_leave.member,
                date=current_date,
                leave_type=apply_leave.leave_type,
                start_date=apply_leave.start_date,
                end_date=apply_leave.end_date,
                days=apply_leave.days,
                reason=apply_leave.reason,
                reason_des=apply_leave.reason_des,
                apply_by=apply_leave.apply_by
            )
            current_date += timedelta(days=1)  # Move to the next date
    except Exception as e:
        messages.error(request, "An error occurred") 
        return redirect('leave_check_cc_company')
    return redirect('leave_check_cc_company')


@role_required('cc_company')
def leave_reject_cc_company(request,id):
    apply_leave = ApplyLeave.objects.get(id=id)
    apply_leave.company_commander_status = 'rejected'
    apply_leave.status = 'rejected'
    apply_leave.save()
    return redirect('leave_check_cc_company')