from django.shortcuts import render, redirect
from django.contrib.auth.decorators import login_required
from django.contrib.auth import logout
from django.contrib import messages
from django.utils import timezone
from datetime import timedelta
from overtime.models import OvertimeRequest
from leave.models import LeaveRequest
from .forms import UserUpdateForm, EmployeeUpdateForm

# Create your views here.

def logout_view(request):
    logout(request)
    # messages.success(request, 'You have been successfully logged out.')
    return redirect('accounts:login')

@login_required
def dashboard(request):
    if not hasattr(request.user, 'employee'):
        messages.error(request, 'No employee profile found. Please contact HR.')
        return redirect('accounts:profile')
    
    context = {}
    employee = request.user.employee
    role = employee.role
    today = timezone.now().date()
    month_start = today.replace(day=1)
    month_end = (month_start + timedelta(days=32)).replace(day=1) - timedelta(days=1)
    
    if role == 'EMP':
        # Employee view - show all their requests, ordered by most recent first
        context['overtime_requests'] = OvertimeRequest.objects.filter(
            employee=employee
        ).order_by('-date')[:10]  # Show last 10 requests
        
        context['leave_requests'] = LeaveRequest.objects.filter(
            employee=employee
        ).order_by('-start_date')[:10]  # Show last 10 requests
    
    elif role == 'HR':
        # HR view - show pending requests awaiting HR approval
        context['pending_overtime'] = OvertimeRequest.objects.filter(
            status='PENDING'
        ).order_by('-date')[:5]
        
        context['pending_leave'] = LeaveRequest.objects.filter(
            status='PENDING'
        ).order_by('-start_date')[:5]
    
    elif role == 'REG':
        # Registrar view - show HR approved requests awaiting final approval
        context['pending_overtime'] = OvertimeRequest.objects.filter(
            status='HR_APPROVED'
        ).order_by('-date')[:5]
        
        context['pending_leave'] = LeaveRequest.objects.filter(
            status='HR_APPROVED'
        ).order_by('-start_date')[:5]
    
    elif role == 'FIN':
        # Finance view - show approved overtime requests pending payment
        context['approved_overtime'] = OvertimeRequest.objects.filter(
            status='REG_APPROVED',
            payment_status='PENDING'
        ).order_by('-date')[:5]
    
    return render(request, 'accounts/dashboard.html', context)

@login_required
def profile(request):
    if request.method == 'POST':
        user_form = UserUpdateForm(request.POST, instance=request.user)
        employee_form = None
        
        if hasattr(request.user, 'employee'):
            employee_form = EmployeeUpdateForm(
                request.POST, 
                request.FILES, 
                instance=request.user.employee
            )
        
        if user_form.is_valid() and (not employee_form or employee_form.is_valid()):
            user_form.save()
            
            if employee_form and 'profile_picture' in request.FILES:
                employee = employee_form.save(commit=False)
                employee.profile_picture = request.FILES['profile_picture']
                employee.save()
                
            messages.success(request, 'Your profile has been updated successfully.')
            return redirect('accounts:profile')
    else:
        user_form = UserUpdateForm(instance=request.user)
        employee_form = None
        
        if hasattr(request.user, 'employee'):
            employee_form = EmployeeUpdateForm(instance=request.user.employee)
    
    # Get employee data for display-only fields
    employee_data = None
    if hasattr(request.user, 'employee'):
        employee = request.user.employee
        employee_data = {
            'role': employee.get_role_display(),
            'department': employee.department or 'Not assigned',
            'basic_pay': employee.basic_pay,
            'annual_leave_days': employee.annual_leave_days,
            'accumulated_leave_days': employee.accumulated_leave_days,
            'available_leave_days': employee.get_available_leave_days(),
            'profile_picture': employee.profile_picture,
        }
    
    return render(request, 'accounts/profile.html', {
        'user_form': user_form,
        'employee_form': employee_form,
        'employee_data': employee_data,
    })
