from django.shortcuts import render, get_object_or_404, redirect
from django.views import View
from django.contrib.auth.decorators import login_required
from django.utils.decorators import method_decorator
from django.contrib import messages
from django.core.paginator import Paginator
from django.db.models import Q
from .models import Employee, Department, Designation
from codesofy_lib.custom_config import get_global_master_details, set_menu_items, set_user_profile
from datetime import datetime

menu_item = "employee"

def get_local_master_details():
    return get_global_master_details()


# ==========================================
# PUBLIC VIEWS (Website)
# ==========================================

class TeamView(View):
    def get(self, request):
        context = get_local_master_details()
        employees = Employee.objects.filter(is_active=True, display_on_website=True)
        
        context['employees'] = employees
        context['departments'] = Department.objects.all()
        return render(request, 'team_list.html', context)


class EmployeePublicView(View):
    def get(self, request, employee_id):
        context = get_local_master_details()
        employee = get_object_or_404(Employee, id=employee_id, is_active=True, display_on_website=True)
        context['employee'] = employee
        return render(request, 'team_detail.html', context)


# ==========================================
# ADMIN VIEWS (Dashboard)
# ==========================================

@method_decorator(login_required, name='dispatch')
class EmployeeAdminView(View):
    def get(self, request):
        context = get_local_master_details()
        context = set_menu_items(menu_item, 'employee_list', context)
        context['employees'] = Employee.objects.all().order_by('first_name')
        
        user_profile = set_user_profile(request, context)
        context['logged_user_profile'] = user_profile
        context['dt_string'] = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
        
        return render(request, 'employee_list.html', context)


@method_decorator(login_required, name='dispatch')
class EmployeeCreateView(View):
    def get(self, request):
        context = get_local_master_details()
        context = set_menu_items(menu_item, 'employee_create', context)
        context['departments'] = Department.objects.all()
        context['designations'] = Designation.objects.all()
        
        user_profile = set_user_profile(request, context)
        context['logged_user_profile'] = user_profile
        context['dt_string'] = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
        
        return render(request, 'employee_form.html', context)
    
    def post(self, request):
        # Generate employee ID
        employee_id = f"EMP-{datetime.now().strftime('%Y%m%d')}-{Employee.objects.count() + 1:04d}"
        
        employee = Employee.objects.create(
            first_name=request.POST.get('first_name'),
            last_name=request.POST.get('last_name'),
            email=request.POST.get('email'),
            phone=request.POST.get('phone'),
            gender=request.POST.get('gender'),
            date_of_birth=request.POST.get('date_of_birth'),
            address=request.POST.get('address'),
            department_id=request.POST.get('department') or None,
            designation_id=request.POST.get('designation') or None,
            employee_id=employee_id,
            employment_type=request.POST.get('employment_type'),
            joining_date=request.POST.get('joining_date'),
            bio=request.POST.get('bio', ''),
            skills=request.POST.get('skills', ''),
            linkedin=request.POST.get('linkedin', ''),
            github=request.POST.get('github', ''),
            twitter=request.POST.get('twitter', ''),
            is_active=request.POST.get('is_active') == 'on',
            display_on_website=request.POST.get('display_on_website') == 'on',
            profile_picture=request.FILES.get('profile_picture'),
        )
        
        messages.success(request, f"Employee '{employee.full_name()}' created successfully!")
        return redirect('employee_admin')


@method_decorator(login_required, name='dispatch')
class EmployeeEditView(View):
    def get(self, request, employee_id):
        context = get_local_master_details()
        context = set_menu_items(menu_item, 'employee_edit', context)
        context['employee'] = get_object_or_404(Employee, id=employee_id)
        context['departments'] = Department.objects.all()
        context['designations'] = Designation.objects.all()
        
        user_profile = set_user_profile(request, context)
        context['logged_user_profile'] = user_profile
        context['dt_string'] = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
        
        return render(request, 'employee_form.html', context)
    
    def post(self, request, employee_id):
        employee = get_object_or_404(Employee, id=employee_id)
        
        employee.first_name = request.POST.get('first_name')
        employee.last_name = request.POST.get('last_name')
        employee.email = request.POST.get('email')
        employee.phone = request.POST.get('phone')
        employee.gender = request.POST.get('gender')
        employee.date_of_birth = request.POST.get('date_of_birth')
        employee.address = request.POST.get('address')
        employee.department_id = request.POST.get('department') or None
        employee.designation_id = request.POST.get('designation') or None
        employee.employment_type = request.POST.get('employment_type')
        employee.joining_date = request.POST.get('joining_date')
        employee.bio = request.POST.get('bio', '')
        employee.skills = request.POST.get('skills', '')
        employee.linkedin = request.POST.get('linkedin', '')
        employee.github = request.POST.get('github', '')
        employee.twitter = request.POST.get('twitter', '')
        employee.is_active = request.POST.get('is_active') == 'on'
        employee.display_on_website = request.POST.get('display_on_website') == 'on'
        
        if request.FILES.get('profile_picture'):
            employee.profile_picture = request.FILES.get('profile_picture')
        
        employee.save()
        
        messages.success(request, f"Employee '{employee.full_name()}' updated successfully!")
        return redirect('employee_admin')


@method_decorator(login_required, name='dispatch')
class EmployeeDeleteView(View):
    def post(self, request, employee_id):
        employee = get_object_or_404(Employee, id=employee_id)
        employee.delete()
        messages.success(request, "Employee deleted successfully!")
        return redirect('employee_admin')


@method_decorator(login_required, name='dispatch')
class DepartmentAdminView(View):
    def get(self, request):
        context = get_local_master_details()
        context = set_menu_items(menu_item, 'departments', context)
        context['departments'] = Department.objects.all().order_by('name')
        
        user_profile = set_user_profile(request, context)
        context['logged_user_profile'] = user_profile
        context['dt_string'] = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
        
        return render(request, 'departments.html', context)
    
    def post(self, request):
        name = request.POST.get('name')
        slug = request.POST.get('slug') or name.lower().replace(' ', '-')
        description = request.POST.get('description', '')
        
        if Department.objects.filter(slug=slug).exists():
            messages.error(request, "Department with this slug already exists.")
            return redirect('departments')
        
        Department.objects.create(name=name, slug=slug, description=description)
        messages.success(request, f"Department '{name}' created successfully!")
        return redirect('departments')


@method_decorator(login_required, name='dispatch')
class DepartmentDeleteView(View):
    def post(self, request, department_id):
        department = get_object_or_404(Department, id=department_id)
        department.delete()
        messages.success(request, "Department deleted successfully!")
        return redirect('departments')


@method_decorator(login_required, name='dispatch')
class DesignationAdminView(View):
    def get(self, request):
        context = get_local_master_details()
        context = set_menu_items(menu_item, 'designations', context)
        context['designations'] = Designation.objects.all().order_by('name')
        
        user_profile = set_user_profile(request, context)
        context['logged_user_profile'] = user_profile
        context['dt_string'] = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
        
        return render(request, 'designations.html', context)
    
    def post(self, request):
        name = request.POST.get('name')
        slug = request.POST.get('slug') or name.lower().replace(' ', '-')
        
        if Designation.objects.filter(slug=slug).exists():
            messages.error(request, "Designation with this slug already exists.")
            return redirect('designations')
        
        Designation.objects.create(name=name, slug=slug)
        messages.success(request, f"Designation '{name}' created successfully!")
        return redirect('designations')


@method_decorator(login_required, name='dispatch')
class DesignationDeleteView(View):
    def post(self, request, designation_id):
        designation = get_object_or_404(Designation, id=designation_id)
        designation.delete()
        messages.success(request, "Designation deleted successfully!")
        return redirect('designations')