from django.contrib import messages
from django.contrib.auth.decorators import login_required
from django.http import FileResponse, Http404, HttpResponseForbidden, JsonResponse
from django.shortcuts import get_object_or_404, redirect, render
from django.urls import reverse

from accounts.models import User
from reviews.models import (
    Article,
    DataExtraction,
    DataExtractionField,
    DataExtractionLookup,
    Hypothesis,
    Invite,
    Keyword,
    QualityAnswer,
    QualityAssessment,
    QualityQuestion,
    Question,
    Review,
    SearchSession,
    SelectionCriteria,
    Source,
)
from rsl.decorators import author_required, main_author_required, phase_required


from reviews.models import Article
from rsl.services.export_bundle import export_complete_review_bundle
from rsl.services.export_upe import export_upe_thesis_zip
from rsl.services.export_latex import export_synthesis_latex
from rsl.services.exports import (
    export_extraction_xlsx,
    export_protocol_docx,
    export_synthesis_docx,
    export_synthesis_xlsx,
    export_thesis_reminders_docx,
)
from rsl.decorators import author_required
from rsl.services.export_presentation import (
    export_synthesis_presentation_html,
    presentation_download_name,
)
from rsl.services.synthesis import (
    build_synthesis_package,
    load_synthesis_for_review,
    save_synthesis_draft,
)


@login_required
@author_required
def index(request, review):
    return render(request, "reporting/index.html", {"review": review})


@login_required
@author_required
def export_protocol(request, review):
    output = export_protocol_docx(review)
    return FileResponse(
        output,
        as_attachment=True,
        filename=f"{review.slug}-protocol.docx",
    )


@login_required
@author_required
def export_extraction(request, review):
    output = export_extraction_xlsx(review)
    return FileResponse(
        output,
        as_attachment=True,
        filename=f"{review.slug}-data-extraction.xlsx",
    )


def _thesis_reminder_query(review, filter_mode: str):
    q = Article.objects.filter(review_id=review.id, status="A").order_by("title")
    if filter_mode == "highlighted":
        return q.filter(thesis_highlight=True)
    if filter_mode == "with_notes":
        return q.filter(
            (Article.thesis_highlight == True)  # noqa: E712
            | (Article.thesis_reminder != "")
            | (Article.thesis_tags != "")
        )
    return q


@login_required
@author_required
def thesis_reminders(request, review):
    filter_mode = request.GET.get("filter", "highlighted")
    if filter_mode not in ("highlighted", "with_notes", "all"):
        filter_mode = "highlighted"
    articles = _thesis_reminder_query(review, filter_mode).all()
    highlighted_count = Article.objects.filter(
        review_id=review.id, status="A", thesis_highlight=True
    ).count()
    return render(
        request,
        "reporting/thesis_reminders.html",
        {
            "review": review,
            "articles": articles,
            "filter_mode": filter_mode,
            "highlighted_count": highlighted_count,
        },
    )


@login_required
@author_required
def thesis_reminders_print(request, review):
    filter_mode = request.GET.get("filter", "highlighted")
    if filter_mode not in ("highlighted", "with_notes", "all"):
        filter_mode = "highlighted"
    include_bibliographic = request.GET.get("bib", "1") == "1"
    include_tags = request.GET.get("tags", "1") == "1"
    include_reminder = request.GET.get("reminder", "1") == "1"
    articles = _thesis_reminder_query(review, filter_mode).all()
    return render(
        request,
        "reporting/thesis_reminders_print.html",
        {
            "review": review,
            "articles": articles,
            "include_bibliographic": include_bibliographic,
            "include_tags": include_tags,
            "include_reminder": include_reminder,
        },
    )


@login_required
@author_required
def export_thesis_reminders(request, review):
    filter_mode = request.GET.get("filter", "highlighted")
    if filter_mode not in ("highlighted", "with_notes", "all"):
        filter_mode = "highlighted"
    include_bibliographic = request.GET.get("bib", "1") == "1"
    include_tags = request.GET.get("tags", "1") == "1"
    include_reminder = request.GET.get("reminder", "1") == "1"
    output = export_thesis_reminders_docx(
        review,
        filter_mode=filter_mode,
        include_bibliographic=include_bibliographic,
        include_tags=include_tags,
        include_reminder=include_reminder,
    )
    return FileResponse(
        output,
        as_attachment=True,
        filename=f"{review.slug}-lembretes-tese.docx",
    )


_SECTION_KEYS = (
    "resumo_executivo",
    "conformidade_prisma",
    "introducao",
    "metodos",
    "resultados_selecao",
    "caracterizacao",
    "sintese_tematica",
    "lacunas_literatura",
    "discussao",
    "lacunas_rsl",
    "qualidade_metodologica_rsl",
    "conclusao",
)


@login_required
@author_required
def synthesis(request, review):
    if request.method == "POST":
        action = request.POST.get("action", "save")
        if action == "regenerate":
            package = build_synthesis_package(review)
            save_synthesis_draft(review, package)
            messages.success(request, "Síntese regenerada com dados atualizados.")
        else:
            package = load_synthesis_for_review(review)
            for key in _SECTION_KEYS:
                field = f"section_{key}"
                if field in request.POST:
                    package["sections"][key] = request.POST.get(field, "")
            save_synthesis_draft(review, package)
            messages.success(request, "Rascunho do texto salvo.")
        return redirect(reverse("reporting:synthesis", kwargs={"review_id": review.id}))

    package = load_synthesis_for_review(review)
    section_labels = [
        ("resumo_executivo", "Resumo executivo"),
        ("conformidade_prisma", "Conformidade PRISMA 2020"),
        ("introducao", "Introdução"),
        ("metodos", "Metodologia"),
        ("resultados_selecao", "Resultados da seleção"),
        ("caracterizacao", "Caracterização"),
        ("sintese_tematica", "Síntese temática"),
        ("lacunas_literatura", "Lacunas da literatura"),
        ("discussao", "Discussão"),
        ("lacunas_rsl", "Limitações da revisão"),
        ("qualidade_metodologica_rsl", "Qualidade metodológica da RSL"),
        ("conclusao", "Conclusão"),
    ]
    return render(
        request,
        "reporting/synthesis.html",
        {"review": review, "package": package, "section_labels": section_labels},
    )


@login_required
@author_required
def synthesis_presentation(request, review):
    package = load_synthesis_for_review(review)
    output = export_synthesis_presentation_html(review, package)
    return FileResponse(
        output,
        content_type="text/html; charset=utf-8",
        filename=presentation_download_name(review),
        as_attachment=False,
    )


@login_required
@author_required
def export_synthesis_presentation_route(request, review):
    package = load_synthesis_for_review(review)
    output = export_synthesis_presentation_html(review, package)
    return FileResponse(
        output,
        as_attachment=True,
        filename=presentation_download_name(review),
        content_type="text/html; charset=utf-8",
    )


@login_required
@author_required
def export_synthesis_docx_route(request, review):
    package = load_synthesis_for_review(review)
    output = export_synthesis_docx(review, package)
    return FileResponse(
        output,
        as_attachment=True,
        filename=f"{review.slug}-sintese-rsl.docx",
    )


@login_required
@author_required
def export_synthesis_xlsx_route(request, review):
    package = load_synthesis_for_review(review)
    output = export_synthesis_xlsx(review, package)
    return FileResponse(
        output,
        as_attachment=True,
        filename=f"{review.slug}-sintese-tabelas.xlsx",
    )


@login_required
@author_required
def export_synthesis_latex_route(request, review):
    package = load_synthesis_for_review(review)
    output = export_synthesis_latex(review, package, style="article")
    return FileResponse(
        output,
        as_attachment=True,
        filename=f"{review.slug}-sintese-rsl.tex",
        content_type="application/x-tex",
    )


@login_required
@author_required
def export_synthesis_latex_abnt_route(request, review):
    package = load_synthesis_for_review(review)
    output = export_synthesis_latex(review, package, style="abntex2")
    return FileResponse(
        output,
        as_attachment=True,
        filename=f"{review.slug}-sintese-rsl-abntex2.tex",
        content_type="application/x-tex",
    )


@login_required
@author_required
def export_rsl_complete_route(request, review):
    package = load_synthesis_for_review(review)
    output = export_complete_review_bundle(review, package)
    return FileResponse(
        output,
        as_attachment=True,
        filename=f"{review.slug}-rsl-completo.zip",
        content_type="application/zip",
    )


@login_required
@author_required
def export_upe_thesis_route(request, review):
    package = load_synthesis_for_review(review)
    output = export_upe_thesis_zip(review, package)
    return FileResponse(
        output,
        as_attachment=True,
        filename=f"{review.slug}-tese-upe-rsl.zip",
        content_type="application/zip",
    )
