from functools import wraps

from flask import Blueprint, current_app, redirect, render_template, request, session, url_for
from werkzeug.security import check_password_hash

bp = Blueprint("auth", __name__)


def login_required(view):
    @wraps(view)
    def wrapped(*args, **kwargs):
        if not session.get("logged_in"):
            return redirect(url_for("auth.login", next=request.path))
        return view(*args, **kwargs)

    return wrapped


@bp.route("/login", methods=["GET", "POST"])
def login():
    error = None
    if request.method == "POST":
        username = request.form.get("username", "")
        password = request.form.get("password", "")
        expected_user = current_app.config["LOGIN_USERNAME"]
        expected_hash = current_app.config["LOGIN_PASSWORD_HASH"]
        if username == expected_user and expected_hash and check_password_hash(expected_hash, password):
            session.clear()
            session["logged_in"] = True
            next_url = request.args.get("next") or url_for("ledger.dashboard")
            return redirect(next_url)
        error = "Incorrect login or password."
    return render_template("login.html", error=error)


@bp.route("/logout")
def logout():
    session.clear()
    return redirect(url_for("auth.login"))
