"""Correções em massa após port Flask → Django."""
from __future__ import annotations

import re
from pathlib import Path

ROOT = Path(__file__).resolve().parent.parent

ENDPOINT_MAP = {
    "reviews.detail": "reviews:detail",
    "reviews.index": "reviews:index",
    "reviews.settings": "reviews:settings",
    "planning.protocol": "planning:protocol",
    "planning.quality": "planning:quality",
    "planning.extraction": "planning:extraction",
    "planning.index": "planning:index",
    "conducting.import_studies": "conducting:import_studies",
    "conducting.selection": "conducting:selection",
    "conducting.quality_assessment": "conducting:quality_assessment",
    "conducting.data_extraction": "conducting:data_extraction",
    "conducting.analysis": "conducting:analysis",
    "conducting.index": "conducting:index",
    "reporting.synthesis": "reporting:synthesis",
    "reporting.index": "reporting:index",
    "main.home": "core:home",
}


def fix_py(path: Path) -> None:
    text = path.read_text(encoding="utf-8")
    text = text.replace("request.args", "request.GET")
    text = text.replace("messages.danger(", "messages.error(")
    text = text.replace("main:home", "core:home")
    text = text.replace("from reviews.models import User\n", "")
    text = text.replace(
        "from rsl.services.permissions import author_required, main_author_required\n", ""
    )
    text = re.sub(r"@login_required\n@login_required\n", "@login_required\n", text)
    if "url_for(" in text:
        for flask_ep, django_ep in ENDPOINT_MAP.items():
            text = text.replace(f'url_for("{flask_ep}"', f'_django_url("{django_ep}"')
            text = text.replace(f"url_for('{flask_ep}'", f"_django_url('{django_ep}'")
    path.write_text(text, encoding="utf-8")


def fix_review_flow():
    path = ROOT / "rsl" / "services" / "review_flow.py"
    text = path.read_text(encoding="utf-8")
    text = text.replace("from flask import url_for\n", "")
    text = text.replace("from app.services.workflow import", "from rsl.services.workflow import")
    helper = '''
from django.urls import reverse

_ENDPOINT_MAP = {
    "reviews.detail": "reviews:detail",
    "planning.protocol": "planning:protocol",
    "planning.quality": "planning:quality",
    "planning.extraction": "planning:extraction",
    "conducting.import_studies": "conducting:import_studies",
    "conducting.selection": "conducting:selection",
    "conducting.quality_assessment": "conducting:quality_assessment",
    "conducting.data_extraction": "conducting:data_extraction",
    "conducting.analysis": "conducting:analysis",
    "reporting.synthesis": "reporting:synthesis",
    "reporting.index": "reporting:index",
}


def _step_url(review_id: int, step: FlowStepDef) -> str:
    name = _ENDPOINT_MAP.get(step.endpoint, step.endpoint.replace(".", ":"))
    url = reverse(name, kwargs={"review_id": review_id})
    if step.anchor:
        url += f"#{step.anchor}"
    return url
'''
    text = re.sub(
        r"def _step_url\(review_id: int, step: FlowStepDef\) -> str:.*?return url_for\(step\.endpoint, \*\*kwargs\)",
        helper.strip().split("def _step_url")[1] if False else "",
        text,
        flags=re.DOTALL,
    )
    # Simpler replace
    old = '''def _step_url(review_id: int, step: FlowStepDef) -> str:
    kwargs: dict = {"review_id": review_id}
    if step.anchor:
        kwargs["_anchor"] = step.anchor
    return url_for(step.endpoint, **kwargs)'''
    new = '''def _step_url(review_id: int, step: FlowStepDef) -> str:
    from django.urls import reverse
    _map = {
        "reviews.detail": "reviews:detail",
        "planning.protocol": "planning:protocol",
        "planning.quality": "planning:quality",
        "planning.extraction": "planning:extraction",
        "conducting.import_studies": "conducting:import_studies",
        "conducting.selection": "conducting:selection",
        "conducting.quality_assessment": "conducting:quality_assessment",
        "conducting.data_extraction": "conducting:data_extraction",
        "conducting.analysis": "conducting:analysis",
        "reporting.synthesis": "reporting:synthesis",
        "reporting.index": "reporting:index",
    }
    name = _map.get(step.endpoint, step.endpoint.replace(".", ":"))
    url = reverse(name, kwargs={"review_id": review_id})
    if step.anchor:
        url += f"#{step.anchor}"
    return url'''
    if old in text:
        text = text.replace(old, new)
    path.write_text(text, encoding="utf-8")


def fix_workflow():
    path = ROOT / "rsl" / "services" / "workflow.py"
    text = path.read_text(encoding="utf-8")
    text = text.replace("from app.models import", "from reviews.models import")
    text = text.replace("Article.query.filter_by", "Article.objects.filter")
    text = text.replace("or review.questions\n", "or review.questions.exists()\n")
    text = text.replace("or review.selection_criteria\n", "or review.selection_criteria.exists()\n")
    old = '''def steps_for_template(steps, review_id: int):
    from flask import url_for

    return [
        {
            "key": s.key,
            "label": s.label,
            "done": s.done,
            "detail": s.detail,
            "blocked": s.blocked,
            "block_reason": s.block_reason,
            "url": (
                url_for(
                    s.url_endpoint,
                    review_id=review_id,
                    **({"_anchor": s.url_anchor} if s.url_anchor else {}),
                )
                if s.url_endpoint
                else None
            ),
        }
        for s in steps
    ]'''
    new = '''def steps_for_template(steps, review_id: int):
    from django.urls import reverse

    _map = {
        "planning.protocol": "planning:protocol",
        "planning.quality": "planning:quality",
        "planning.extraction": "planning:extraction",
        "conducting.import_studies": "conducting:import_studies",
        "conducting.selection": "conducting:selection",
        "conducting.quality_assessment": "conducting:quality_assessment",
        "conducting.data_extraction": "conducting:data_extraction",
        "conducting.analysis": "conducting:analysis",
        "reporting.synthesis": "reporting:synthesis",
        "reporting.index": "reporting:index",
        "reviews.detail": "reviews:detail",
    }
    out = []
    for s in steps:
        url = None
        if s.url_endpoint:
            name = _map.get(s.url_endpoint, s.url_endpoint.replace(".", ":"))
            url = reverse(name, kwargs={"review_id": review_id})
            if s.url_anchor:
                url += f"#{s.url_anchor}"
        out.append({
            "key": s.key,
            "label": s.label,
            "done": s.done,
            "detail": s.detail,
            "blocked": s.blocked,
            "block_reason": s.block_reason,
            "url": url,
        })
    return out'''
    text = text.replace(old, new)
    path.write_text(text, encoding="utf-8")


def fix_base_template():
    path = ROOT / "templates" / "lte" / "base.html"
    text = path.read_text(encoding="utf-8")
    if "{% load static %}" not in text:
        text = "{% load static %}\n{% load rsl_i18n %}\n" + text
    text = re.sub(
        r"\{\% url 'adminlte:static', filename='([^']+)'\s*\%\}",
        r"{% static 'adminlte/\1' %}",
        text,
    )
    text = re.sub(
        r"\{\% url 'static', filename='([^']+)'\s*\%\}",
        r"{% static '\1' %}",
        text,
    )
    text = text.replace("{{ _('", "{% _ '")
    text = text.replace("') }}", "' %}")
    path.write_text(text, encoding="utf-8")


def main():
    for path in ROOT.rglob("*.py"):
        if "scripts" in path.parts or "migrations" in path.parts:
            continue
        if path.suffix == ".py":
            fix_py(path)
    fix_review_flow()
    fix_workflow()
    if (ROOT / "rsl" / "services" / "permissions.py").exists():
        (ROOT / "rsl" / "services" / "permissions.py").unlink()
    fix_base_template()
    print("Fixes applied.")


if __name__ == "__main__":
    main()
