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 Job, JobCategory, JobApplication
from codesofy_lib.custom_config import get_global_master_details, set_menu_items, set_user_profile
from datetime import datetime

menu_item = "career"

def get_local_master_details():
    return get_global_master_details()


# ==========================================
# PUBLIC VIEWS
# ==========================================

class CareerListView(View):
    def get(self, request):
        context = get_local_master_details()
        jobs = Job.objects.filter(status='published')
        
        search = request.GET.get('search', '')
        if search:
            jobs = jobs.filter(
                Q(title__icontains=search) | 
                Q(location__icontains=search) |
                Q(description__icontains=search)
            )
        
        paginator = Paginator(jobs, 10)
        page = request.GET.get('page', 1)
        jobs = paginator.get_page(page)
        
        context['jobs'] = jobs
        context['categories'] = JobCategory.objects.all()
        context['search'] = search
        return render(request, 'career_list.html', context)


class CareerDetailView(View):
    def get(self, request, slug):
        context = get_local_master_details()
        job = get_object_or_404(Job, slug=slug, status='published')
        context['job'] = job
        return render(request, 'job_detail.html', context)


class JobApplyView(View):
    def get(self, request, slug):
        context = get_local_master_details()
        job = get_object_or_404(Job, slug=slug, status='published')
        context['job'] = job
        return render(request, 'job_apply.html', context)
    
    def post(self, request, slug):
        job = get_object_or_404(Job, slug=slug, status='published')
        resume = request.FILES.get('resume')
        
        if not resume:
            messages.error(request, "Please upload your resume.")
            return redirect('job_apply', slug=slug)
        
        if JobApplication.objects.filter(job=job, email=request.POST.get('email')).exists():
            messages.warning(request, "You have already applied for this position.")
            return redirect('job_detail', slug=slug)
        
        JobApplication.objects.create(
            job=job,
            first_name=request.POST.get('first_name'),
            last_name=request.POST.get('last_name'),
            email=request.POST.get('email'),
            phone=request.POST.get('phone'),
            address=request.POST.get('address', ''),
            cover_letter=request.POST.get('cover_letter'),
            resume=resume,
            portfolio=request.POST.get('portfolio', ''),
            linkedin=request.POST.get('linkedin', ''),
        )
        
        messages.success(request, f"Application submitted for {job.title}!")
        return redirect('career_list')


# ==========================================
# ADMIN VIEWS
# ==========================================

@method_decorator(login_required, name='dispatch')
class JobAdminView(View):
    def get(self, request):
        context = get_local_master_details()
        context = set_menu_items(menu_item, 'job_list', context)
        context['jobs'] = Job.objects.all().order_by('-created_at')
        
        # Fix for header
        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, 'job_list.html', context)


@method_decorator(login_required, name='dispatch')
class JobCreateView(View):
    def get(self, request):
        context = get_local_master_details()
        context = set_menu_items(menu_item, 'job_create', context)
        context['categories'] = JobCategory.objects.all()
        
        # Fix for header
        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, 'job_form.html', context)
    
    def post(self, request):
        title = request.POST.get('title')
        slug = request.POST.get('slug') or title.lower().replace(' ', '-')
        
        if Job.objects.filter(slug=slug).exists():
            messages.error(request, "A job with this slug already exists.")
            return redirect('job_create')
        
        Job.objects.create(
            title=title,
            slug=slug,
            category_id=request.POST.get('category') or None,
            job_type=request.POST.get('job_type'),
            location=request.POST.get('location'),
            experience=request.POST.get('experience', ''),
            salary=request.POST.get('salary', ''),
            description=request.POST.get('description'),
            requirements=request.POST.get('requirements'),
            responsibilities=request.POST.get('responsibilities', ''),
            benefits=request.POST.get('benefits', ''),
            status=request.POST.get('status'),
            closing_date=request.POST.get('closing_date') or None,
            created_by=request.user
        )
        
        messages.success(request, f"Job '{title}' created successfully!")
        return redirect('job_admin')


@method_decorator(login_required, name='dispatch')
class JobEditView(View):
    def get(self, request, job_id):
        context = get_local_master_details()
        context = set_menu_items(menu_item, 'job_edit', context)
        context['job'] = get_object_or_404(Job, id=job_id)
        context['categories'] = JobCategory.objects.all()
        
        # Fix for header
        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, 'job_form.html', context)
    
    def post(self, request, job_id):
        job = get_object_or_404(Job, id=job_id)
        slug = request.POST.get('slug') or request.POST.get('title').lower().replace(' ', '-')
        
        if Job.objects.filter(slug=slug).exclude(id=job_id).exists():
            messages.error(request, "A job with this slug already exists.")
            return redirect('job_edit', job_id=job_id)
        
        job.title = request.POST.get('title')
        job.slug = slug
        job.category_id = request.POST.get('category') or None
        job.job_type = request.POST.get('job_type')
        job.location = request.POST.get('location')
        job.experience = request.POST.get('experience', '')
        job.salary = request.POST.get('salary', '')
        job.description = request.POST.get('description')
        job.requirements = request.POST.get('requirements')
        job.responsibilities = request.POST.get('responsibilities', '')
        job.benefits = request.POST.get('benefits', '')
        job.status = request.POST.get('status')
        job.closing_date = request.POST.get('closing_date') or None
        job.save()
        
        messages.success(request, f"Job '{job.title}' updated successfully!")
        return redirect('job_admin')


@method_decorator(login_required, name='dispatch')
class JobDeleteView(View):
    def post(self, request, job_id):
        job = get_object_or_404(Job, id=job_id)
        job.delete()
        messages.success(request, "Job deleted successfully!")
        return redirect('job_admin')


@method_decorator(login_required, name='dispatch')
class ApplicationsView(View):
    def get(self, request):
        context = get_local_master_details()
        context = set_menu_items(menu_item, 'applications', context)
        context['applications'] = JobApplication.objects.all().order_by('-applied_at')
        
        # Fix for header
        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, 'applications.html', context)


@method_decorator(login_required, name='dispatch')
class ApplicationDetailView(View):
    def get(self, request, application_id):
        context = get_local_master_details()
        context = set_menu_items(menu_item, 'applications', context)
        context['application'] = get_object_or_404(JobApplication, id=application_id)
        
        # Fix for header
        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, 'application_detail.html', context)
    
    def post(self, request, application_id):
        application = get_object_or_404(JobApplication, id=application_id)
        application.status = request.POST.get('status')
        application.notes = request.POST.get('notes', '')
        application.save()
        messages.success(request, "Application status updated!")
        return redirect('application_detail', application_id=application_id)