# app/blueprints/auth/routes.py
from flask import Blueprint, render_template, request, flash, redirect, url_for, session
from flask_login import login_user, logout_user, login_required
from app.database import get_db_connection
from app.security.passwords import verify_password, hash_password, needs_rehash
from app.extensions import limiter, DBUser

auth_bp = Blueprint("auth_bp", __name__)

# ───────────────────────── Вход ──────────────────────────
@auth_bp.route("/login", methods=["GET", "POST"])
@limiter.limit("10/minute")              # brute-force guard
def login():
    if request.method == "POST":
        username = request.form["username"].strip()
        password = request.form["password"]

        # ищем пользователя
        with get_db_connection() as conn, conn.cursor() as cur:
            cur.execute("SELECT * FROM users WHERE username=%s", (username,))
            row = cur.fetchone()

        # неправильный логин / пароль
        if not row or not verify_password(row["password_hash"], password):
            flash("Неверный логін або пароль", "danger")
            return redirect(url_for(".login"))

        # при первом входе «старых» пользователей — пересчитываем хеш
        if needs_rehash(row["password_hash"]):
            new_hash = hash_password(password)
            with get_db_connection() as conn, conn.cursor() as cur:
                cur.execute("UPDATE users SET password_hash=%s WHERE id=%s",
                            (new_hash, row["id"]))
                conn.commit()

        # авторизуем через flask-login
        login_user(DBUser(row), remember=False)

        #  кладём свои поля в обычную сессию — для шаблонов / RBAC-проверок
        session["user_id"] = row["id"]
        session["role"]    = row["role"]

        flash("Вітаємо!", "success")
        return redirect(url_for("main_bp.index"))

    return render_template("login.html")


# ───────────────────────── Выход ─────────────────────────
@auth_bp.route("/logout")
@login_required
def logout():
    logout_user()          # чистим flask-login
    session.clear()        # убираем свои ключи
    flash("Ви вийшли з системи", "info")
    return redirect(url_for("main_bp.index"))
