"""Shared CV library views for platform admin and subscribed employers."""
from django.contrib import messages
from django.http import FileResponse, Http404
from django.shortcuts import redirect

from companies.models import Company
from seekers.cv_library import (
    filter_cv_records,
    records_for_download,
    zip_download_response,
)
from seekers.models import SeekerCategory, SeekerCVRecord
from subscriptions.usage import (
    can_company_access_cv_library,
    can_company_bulk_download_cvs,
    company_usage_summary,
    record_bulk_cv_downloads,
)


def _get_company_for_user(user):
    return Company.objects.filter(owner=user, is_active=True).first()


def cv_library_context(request, *, admin_mode=False):
    q = request.GET.get('q', '').strip()
    category_slug = request.GET.get('category', '').strip()
    current_only = request.GET.get('versions') != 'all'

    queryset = filter_cv_records(
        q=q,
        category_slug=category_slug,
        current_only=current_only,
    )
    categories = SeekerCategory.objects.filter(is_active=True).order_by('sort_order', 'name')
    total_cvs = SeekerCVRecord.objects.filter(is_current=True).count()

    context = {
        'q': q,
        'category_slug': category_slug,
        'current_only': current_only,
        'categories': categories,
        'total_cvs': total_cvs,
        'admin_mode': admin_mode,
    }

    if not admin_mode:
        company = _get_company_for_user(request.user)
        allowed, message = can_company_access_cv_library(company, request.user)
        context['can_access'] = allowed
        context['access_message'] = message
        context['usage'] = company_usage_summary(company) if company else None
        context['company'] = company
        if not allowed:
            context['records_queryset'] = SeekerCVRecord.objects.none()
            return context

    context['records_queryset'] = queryset
    return context


def handle_cv_download(request, *, admin_mode=False):
    record_ids = request.POST.getlist('record_ids')
    limit = request.POST.get('limit', '').strip()
    q = request.POST.get('q', '').strip()
    category_slug = request.POST.get('category', '').strip()
    current_only = request.POST.get('current_only', '1') != '0'

    base_qs = filter_cv_records(q=q, category_slug=category_slug, current_only=current_only)
    records = records_for_download(record_ids, limit=limit or None, queryset=base_qs)

    if not records:
        messages.error(request, 'No CV files were found for your selection.')
        return None

    if not admin_mode:
        company = _get_company_for_user(request.user)
        allowed, message = can_company_bulk_download_cvs(company, request.user, len(records))
        if not allowed:
            messages.error(request, message)
            return None

    response, count = zip_download_response(records)
    if not response:
        messages.error(request, 'Could not build the download archive. Files may be missing.')
        return None

    if admin_mode:
        messages.success(request, f'Downloaded {count} CV(s) as a zip archive.')
    else:
        company = _get_company_for_user(request.user)
        profiles = [record.seeker_profile for record in records]
        record_bulk_cv_downloads(company, profiles, request.user)
        messages.success(request, f'Downloaded {count} CV(s) as a zip archive.')

    return response


def handle_single_cv_download(request, pk, *, admin_mode=False):
    record = SeekerCVRecord.objects.select_related('seeker_profile').filter(pk=pk).first()
    if not record or not record.file_exists:
        raise Http404

    if not admin_mode:
        company = _get_company_for_user(request.user)
        allowed, message = can_company_bulk_download_cvs(company, request.user, 1)
        if not allowed:
            messages.error(request, message)
            return redirect('employers:cv_library')

        from subscriptions.usage import record_cv_download
        record_cv_download(company, record.seeker_profile, request.user)

    filename = record.original_filename or f'cv_{record.pk}.pdf'
    return FileResponse(record.cv_file.open('rb'), as_attachment=True, filename=filename)
