from django.contrib import admin

from ats.admin import ApplicationEventInline, ApplicationNoteInline, InterviewInline

from .admin_forms import JobAdminForm
from .models import Job, JobAlertLog, JobApplication, JobAttachment, JobCategory, SavedJob


class JobAttachmentInline(admin.TabularInline):
    model = JobAttachment
    extra = 0
    readonly_fields = ('uploaded_at',)


@admin.register(JobCategory)
class JobCategoryAdmin(admin.ModelAdmin):
    list_display = ('number', 'name', 'slug', 'sort_order', 'is_active')
    list_filter = ('is_active',)
    ordering = ('number', 'sort_order', 'name')
    prepopulated_fields = {'slug': ('name',)}


@admin.register(Job)
class JobAdmin(admin.ModelAdmin):
    form = JobAdminForm
    list_display = (
        'title',
        'company_name',
        'location',
        'job_type',
        'is_active',
        'is_featured',
        'created_at',
    )
    list_filter = ('is_active', 'job_type', 'experience_level', 'category', 'badge')
    search_fields = ('title', 'company_name', 'location', 'description')
    prepopulated_fields = {'slug': ('title',)}
    readonly_fields = ('views_count', 'created_at', 'updated_at')
    inlines = (JobAttachmentInline,)
    fieldsets = (
        ('Listing', {
            'fields': (
                'title',
                'slug',
                'company_name',
                'company_slug',
                'company_initials',
                'company_logo',
                'company_logo_gradient',
                'company_industry',
                'category',
                'job_type',
                'location_scope',
                'location_country',
                'location_region',
                'location_city',
                'location_regions_multi',
                'location_city_text',
                'location_regions',
                'location',
            ),
        }),
        ('Details', {
            'fields': (
                'experience_level',
                'experience_required',
                'positions_total',
                'positions_filled',
                'salary_min',
                'salary_max',
                'description',
                'responsibilities',
                'requirements',
                'benefits',
                'application_method',
                'application_methods',
                'application_candidate_fields',
                'application_documents',
                'screening_questions_enabled',
                'screening_questions',
                'how_to_apply',
                'deadline',
            ),
        }),
        ('Status', {
            'fields': (
                'posted_by',
                'is_active',
                'is_featured',
                'badge',
                'views_count',
                'created_at',
                'updated_at',
            ),
        }),
    )


@admin.register(JobAttachment)
class JobAttachmentAdmin(admin.ModelAdmin):
    list_display = ('job', 'kind', 'title', 'uploaded_at')
    list_filter = ('kind',)
    search_fields = ('job__title', 'title')
    raw_id_fields = ('job',)


@admin.register(JobApplication)
class JobApplicationAdmin(admin.ModelAdmin):
    list_display = (
        'applicant',
        'job',
        'status',
        'match_score',
        'rating',
        'created_at',
    )
    list_filter = ('status', 'created_at', 'job__company_name')
    search_fields = (
        'job__title',
        'job__company_name',
        'applicant__email',
        'applicant__username',
        'applicant__first_name',
        'applicant__last_name',
    )
    raw_id_fields = ('job', 'applicant')
    readonly_fields = (
        'match_score',
        'cv_parsed_at',
        'created_at',
        'updated_at',
    )
    inlines = (ApplicationNoteInline, InterviewInline, ApplicationEventInline)
    date_hierarchy = 'created_at'
    ordering = ('-created_at',)
    fieldsets = (
        ('Application', {
            'fields': ('job', 'applicant', 'status', 'rating', 'match_score'),
        }),
        ('Candidate materials', {
            'fields': (
                'cover_letter',
                'cv_file',
                'portfolio_file',
                'qualification_file',
                'other_document',
                'linkedin_url',
                'screening_answers',
            ),
        }),
        ('CV parsing', {
            'classes': ('collapse',),
            'fields': ('cv_parsed_text', 'cv_extracted_skills', 'cv_parsed_at'),
        }),
        ('Timestamps', {
            'classes': ('collapse',),
            'fields': ('created_at', 'updated_at'),
        }),
    )


@admin.register(SavedJob)
class SavedJobAdmin(admin.ModelAdmin):
    list_display = ('user', 'job', 'created_at')
    search_fields = ('user__email', 'job__title')
    raw_id_fields = ('user', 'job')


@admin.register(JobAlertLog)
class JobAlertLogAdmin(admin.ModelAdmin):
    list_display = ('job', 'recipient', 'match_score', 'sent_at')
    list_filter = ('sent_at',)
    search_fields = ('job__title', 'recipient__email')
    readonly_fields = ('sent_at',)
    raw_id_fields = ('job', 'recipient')
