"""
Gera views Django a partir dos routes.py do Flask (conversão mecânica).
Uso: python scripts/port_views.py
"""
from __future__ import annotations

import re
from pathlib import Path

ROOT = Path(__file__).resolve().parent.parent
FLASK = Path(r"c:\Repositorios\sysRevisao\app\blueprints")

VIEW_MAP = {
    "main/routes.py": ("core", "views_main.py"),
    "auth/routes.py": ("accounts", "views_auth.py"),
    "auth/profile.py": ("accounts", "views_profile.py"),
    "reviews/routes.py": ("reviews", "views_reviews.py"),
    "planning/routes.py": ("reviews", "views_planning.py"),
    "conducting/routes.py": ("reviews", "views_conducting.py"),
    "reporting/routes.py": ("reviews", "views_reporting.py"),
    "invites/routes.py": ("invites", "views.py"),
    "public/routes.py": ("core", "views_public.py"),
    "slug_routes.py": ("core", "views_slug.py"),
}

HEADER = '''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
'''


def convert(content: str) -> str:
    content = re.sub(r"@\w+_bp\.route\([^\n]+\n", "", content)
    content = re.sub(r"from app\.blueprints\.\w+ import \w+_bp\n", "", content)
    content = re.sub(r"from app\.blueprints\.auth import auth_bp\n", "", content)
    content = re.sub(r"from flask import [^\n]+\n", "", content)
    content = re.sub(r"from flask_login import [^\n]+\n", "", content)
    content = re.sub(r"from app\.extensions import db\n", "", content)
    content = re.sub(r"from app\.models import \(([^)]+)\)", r"from reviews.models import (\1)", content)
    content = re.sub(r"from app\.models import (.+)", r"from reviews.models import \1", content)
    content = re.sub(r"from app\.services\.(\w+) import (.+)", r"from rsl.services.\1 import \2", content)
    content = re.sub(r"from app\.blueprints\.auth\.forms import (.+)", r"from accounts.forms import \1", content)

    content = re.sub(r"def (\w+)\(review\):", r"def \1(request, review):", content)
    content = re.sub(r"def (\w+)\(\):", r"def \1(request):", content)

    content = re.sub(r"@login_required\n", "@login_required\n", content)
    content = re.sub(
        r"@author_required\n",
        "@login_required\n@author_required\n",
        content,
    )
    content = re.sub(
        r"@main_author_required\n",
        "@login_required\n@main_author_required\n",
        content,
    )

    content = re.sub(r"render_template\(", "render(request, ", content)
    content = re.sub(r"db\.session\.add\(([^)]+)\)", r"\1.save()", content)
    content = re.sub(r"db\.session\.delete\(([^)]+)\)", r"\1.delete()", content)
    content = re.sub(r"db\.session\.commit\(\)", "", content)
    content = re.sub(r"db\.session\.flush\(\)", "", content)
    content = re.sub(r"(\w+)\.query\.filter_by\(", r"\1.objects.filter(", content)
    content = re.sub(r"(\w+)\.query\.filter\(", r"\1.objects.filter(", content)
    content = re.sub(r"(\w+)\.query\.get_or_404\(", r"get_object_or_404(\1, ", content)
    content = re.sub(r"(\w+)\.query\.all\(\)", r"\1.objects.all()", content)
    content = re.sub(r"(\w+)\.query\.count\(\)", r"\1.objects.count()", content)
    content = re.sub(r"(\w+)\.query\.order_by\(", r"\1.objects.order_by(", content)
    content = re.sub(r"(\w+)\.query\.first\(\)", r"\1.objects.first()", content)

    content = re.sub(
        r'flash\("([^"]+)",\s*"(\w+)"\)',
        lambda m: f'messages.{m.group(2)}(request, "{m.group(1)}")'
        if m.group(2) in ("success", "warning", "danger", "info", "error")
        else f'messages.info(request, "{m.group(1)}")',
        content,
    )
    content = re.sub(
        r"flash\(f?('|\")([^'\"]+)('|\"),\s*'(\w+)'\)",
        r'messages.\4(request, f"\2")',
        content,
    )

  # url_for replacements - simplified
    def url_repl(m):
        ep = m.group(1)
        args = m.group(2) or ""
        name = ep.replace(".", ":")
        if "review_id=review.id" in args:
            kwargs = ', kwargs={"review_id": review.id}'
        elif "review_id=" in args:
            kwargs = ", kwargs={" + args.strip(", ") + "}"
        else:
            kwargs = ""
        anchor = ""
        if "_anchor=" in args:
            anchor = args.split("_anchor=")[-1].strip('") ')
            return f'reverse("{name}", kwargs={{"review_id": review.id}}) + "#{anchor}"'
        return f'reverse("{name}"{kwargs})'

    content = re.sub(
        r"redirect\(url_for\(['\"]([^'\"]+)['\"]([^)]*)\)\)",
        lambda m: f"redirect({url_repl(m)})",
        content,
    )
    content = re.sub(
        r"url_for\(['\"]([^'\"]+)['\"]([^)]*)\)",
        lambda m: url_repl(m),
        content,
    )

    content = re.sub(r"current_user", "request.user", content)
    content = re.sub(r"login_user\(([^)]+)\)", r"# login \1", content)
    content = re.sub(r"logout_user\(\)", r"# logout", content)
    content = re.sub(r"send_file\(", "FileResponse(", content)
    content = re.sub(r"jsonify\(", "JsonResponse(", content)

    if "form.validate_on_submit()" in content:
        content = content.replace(
            "form.validate_on_submit()",
            "request.method == 'POST' and form.is_valid()",
        )

    return content


def main():
    for rel, (app, out_name) in VIEW_MAP.items():
        src = FLASK / rel
        if not src.exists():
            continue
        raw = src.read_text(encoding="utf-8")
        body = convert(raw)
        out_dir = ROOT / app
        if app == "reviews":
            out_dir = ROOT / "reviews"
        out_path = out_dir / out_name
        out_path.write_text(HEADER + "\n" + body, encoding="utf-8")
        print(f"Wrote {out_path}")


if __name__ == "__main__":
    main()
