"""Atualizacao do painel pelo servico de licencas do desenvolvedor."""
from __future__ import annotations

from flask import Blueprint, flash, redirect, render_template, session, url_for

from .. import audit, updater
from ..auth import login_required
from ..config import get_config

bp = Blueprint("update", __name__, url_prefix="/atualizacoes")


@bp.get("/")
@login_required
def index():
    return render_template(
        "update.html",
        info=None,
        result=session.pop("update_result", None),
        cfg=get_config(),
    )


@bp.post("/verificar")
@login_required
def check():
    info = updater.check()
    audit.log(
        "verificacao_atualizacao",
        f"local={info['local_version']} remoto={info.get('remote_version')} "
        f"disponivel={info['update_available']}",
    )
    if info.get("error"):
        flash(info["error"], "error")
    return render_template("update.html", info=info, result=None, cfg=get_config())


@bp.post("/aplicar")
@login_required
def apply():
    audit.log("atualizacao_iniciada", "Atualizar Agora acionado no painel")
    result = updater.apply_update()
    audit.log(
        "atualizacao_concluida" if result["success"] else "atualizacao_falhou",
        "; ".join(f"{s['step']}={'ok' if s['ok'] else 'erro'}" for s in result["steps"]),
    )
    session["update_result"] = result
    flash(
        "Atualização aplicada. O serviço foi reiniciado." if result["success"]
        else "A atualização falhou. Veja os detalhes abaixo; o banco foi preservado.",
        "success" if result["success"] else "error",
    )
    return redirect(url_for("update.index"))
