from flask import Blueprint, current_app, flash, redirect, render_template, request, session, url_for
from flask_login import login_required, login_user, logout_user

from app.database_profiles import (
    DATABASE_PROFILES,
    PROFILE_IMPORT,
    PROFILE_PROD,
    activate_profile,
    profile_label,
    profile_path,
    set_session_profile,
)
from app.models import User, db

bp = Blueprint("auth", __name__)


def _valid_profile(key: str) -> str:
    return key if key in DATABASE_PROFILES else PROFILE_PROD


def _import_db_available() -> bool:
    return profile_path(PROFILE_IMPORT).is_file()


@bp.route("/login", methods=["GET", "POST"])
def login():
    selected_profile = session.get("db_profile", PROFILE_PROD)

    if request.method == "POST":
        profile = _valid_profile(request.form.get("db_profile", PROFILE_PROD))
        selected_profile = profile

        if profile == PROFILE_IMPORT and not _import_db_available():
            flash("La base d'import (import-test.db) n'existe pas.", "warning")
            return render_template(
                "auth/login.html",
                profile_prod=PROFILE_PROD,
                profile_import=PROFILE_IMPORT,
                import_db_available=False,
                selected_profile=PROFILE_PROD,
                username=request.form.get("username", "").strip(),
            )

        set_session_profile(profile)
        activate_profile(current_app, db, profile)

        username = request.form.get("username", "").strip()
        password = request.form.get("password", "")
        user = User.query.filter_by(username=username).first()

        if not user:
            flash(
                f"Ce compte n'existe pas dans la base « {profile_label(profile)} ».",
                "danger",
            )
        elif not user.is_active:
            flash("Ce compte est désactivé.", "danger")
        elif not user.check_password(password):
            flash("Mot de passe incorrect.", "danger")
        else:
            login_user(user)
            flash(
                f"Connexion réussie — base « {profile_label(profile)} ».",
                "success",
            )
            next_page = request.args.get("next")
            if next_page:
                return redirect(next_page)
            return redirect(url_for("main.select_copropriete"))

        return render_template(
            "auth/login.html",
            profile_prod=PROFILE_PROD,
            profile_import=PROFILE_IMPORT,
            import_db_available=_import_db_available(),
            selected_profile=selected_profile,
            username=username,
        )

    return render_template(
        "auth/login.html",
        profile_prod=PROFILE_PROD,
        profile_import=PROFILE_IMPORT,
        import_db_available=_import_db_available(),
        selected_profile=selected_profile,
        username="",
    )


@bp.route("/logout")
@login_required
def logout():
    logout_user()
    session.pop("db_profile", None)
    session.pop("copropriete_id", None)
    flash("Vous êtes déconnecté.", "info")
    return redirect(url_for("auth.login"))
