from django.contrib import messages
from django.shortcuts import redirect, render
from django.views.decorators.http import require_http_methods, require_POST

from portal.decorators import superuser_required
from portal.forms import EnvSettingsForm, PortalSettingForm
from portal.models import PortalSetting
from portal import services


@superuser_required
def dashboard(request):
    env = services.read_env_file()
    return render(
        request,
        "portal/dashboard.html",
        {
            "db_summary": services.database_summary(),
            "table_counts": services.table_counts(),
            "env": {k: env.get(k, "") for k in services.ENV_KEYS},
            "env_masked": {
                "SECRET_KEY": services.mask_secret(env.get("SECRET_KEY", "")),
                "DATABASE_URL": services.mask_secret(env.get("DATABASE_URL", ""), 8),
            },
            "portal_settings": PortalSetting.objects.all(),
        },
    )


@superuser_required
@require_http_methods(["GET", "POST"])
def migrations(request):
    output = ""
    if request.method == "POST":
        action = request.POST.get("action", "migrate")
        try:
            if action == "makemigrations":
                output = services.run_makemigrations()
                messages.success(request, "makemigrations executado.")
            else:
                output = services.run_migrations()
                messages.success(request, "migrate executado com sucesso.")
        except Exception as exc:
            messages.error(request, f"Erro ao executar: {exc}")
            output = str(exc)
    return render(request, "portal/migrations.html", {"output": output})


@superuser_required
@require_http_methods(["GET", "POST"])
def settings_view(request):
    env = services.read_env_file()
    initial = {
        "DEBUG": "1" if env.get("DEBUG", "1") in ("1", "true", "True") else "0",
        "SKIP_DEMO_SEED": "1"
        if env.get("SKIP_DEMO_SEED", "").lower() in ("1", "true", "yes")
        else "0",
        "ALLOWED_HOSTS": env.get("ALLOWED_HOSTS", ""),
        "SECRET_KEY": env.get("SECRET_KEY", ""),
        "DATABASE_URL": env.get("DATABASE_URL", ""),
    }

    if request.method == "POST":
        form_type = request.POST.get("form_type", "env")
        if form_type == "env":
            form = EnvSettingsForm(request.POST)
            if form.is_valid():
                data = form.cleaned_data
                updates = {
                    "DEBUG": data["DEBUG"] or "0",
                    "SKIP_DEMO_SEED": data["SKIP_DEMO_SEED"] or "0",
                    "ALLOWED_HOSTS": data["ALLOWED_HOSTS"] or "",
                }
                if data.get("SECRET_KEY"):
                    updates["SECRET_KEY"] = data["SECRET_KEY"]
                if data.get("DATABASE_URL"):
                    updates["DATABASE_URL"] = data["DATABASE_URL"]
                services.write_env_file(updates)
                messages.success(
                    request,
                    "Arquivo .env atualizado. Reinicie o servidor para aplicar alterações.",
                )
                return redirect("portal:settings")
        elif form_type == "portal":
            pk = request.POST.get("setting_id")
            if pk:
                setting = PortalSetting.objects.filter(pk=pk).first()
                form_p = PortalSettingForm(request.POST, instance=setting)
            else:
                form_p = PortalSettingForm(request.POST)
            if form_p.is_valid():
                form_p.save()
                messages.success(request, "Configuração do portal salva.")
                return redirect("portal:settings")
        elif form_type == "delete_setting":
            PortalSetting.objects.filter(pk=request.POST.get("setting_id")).delete()
            messages.success(request, "Configuração removida.")
            return redirect("portal:settings")

    form = EnvSettingsForm(initial=initial)
    setting_form = PortalSettingForm()
    return render(
        request,
        "portal/settings.html",
        {
            "form": form,
            "setting_form": setting_form,
            "portal_settings": PortalSetting.objects.all(),
        },
    )


@superuser_required
@require_POST
def import_sqlite(request):
    from io import StringIO

    from django.core.management import call_command

    sqlite_path = request.POST.get("sqlite_path", "").strip()
    force = request.POST.get("force") == "1"
    buf = StringIO()
    try:
        from pathlib import Path

        kwargs = {"force": force, "stdout": buf}
        if sqlite_path:
            kwargs["sqlite"] = Path(sqlite_path)
        call_command("import_legacy_sqlite", **kwargs)
        messages.success(request, "Importação do SQLite concluída.")
    except Exception as exc:
        messages.error(request, f"Falha na importação: {exc}")
    request.session["portal_last_output"] = buf.getvalue()
    return redirect("portal:dashboard")
