from flask import (
    Blueprint,
    render_template,
    request,
    redirect,
    url_for,
    flash,
    session
)

from werkzeug.security import (
    check_password_hash,
    generate_password_hash
)

from extensions import db, login_manager
from models import User


auth_bp = Blueprint(
    "auth",
    __name__
)


@login_manager.user_loader
def load_user(user_id):

    return User.query.get(
        int(user_id)
    )


# =========================================================
# LOGIN
# =========================================================

@auth_bp.route(
    "/login",
    methods=["GET", "POST"]
)
def login():

    if request.method == "POST":

        username = request.form.get(
            "username",
            ""
        ).strip()

        password = request.form.get(
            "password",
            ""
        )

        if not username or not password:

            flash(
                "Please enter your username and password.",
                "error"
            )

            return redirect(
                url_for("auth.login")
            )

        user = User.query.filter_by(
            username=username
        ).first()

        if not user:

            flash(
                "Invalid username or password.",
                "error"
            )

            return redirect(
                url_for("auth.login")
            )

        if not user.is_active:

            flash(
                "This account is inactive.",
                "error"
            )

            return redirect(
                url_for("auth.login")
            )

        if not check_password_hash(
            user.password_hash,
            password
        ):

            flash(
                "Invalid username or password.",
                "error"
            )

            return redirect(
                url_for("auth.login")
            )

        # -------------------------------------------------
        # START FRESH SESSION
        # -------------------------------------------------

        session.clear()

        session.permanent = True

        session["user_id"] = user.id
        session["username"] = user.username
        session["role"] = user.role

        return redirect(
            url_for(
                "dashboard.admin_dashboard"
            )
        )

    return render_template(
        "login.html"
    )


# =========================================================
# LOGOUT
# =========================================================

@auth_bp.route(
    "/logout"
)
def logout():

    session.clear()

    flash(
        "You have been logged out.",
        "success"
    )

    return redirect(
        url_for("auth.login")
    )


# =========================================================
# CREATE USER
# =========================================================

@auth_bp.route(
    "/create-user",
    methods=["GET", "POST"]
)
def create_user():

    if "user_id" not in session:

        return redirect(
            url_for("auth.login")
        )

    if session.get("role") != "owner":

        flash(
            "You do not have permission to create users.",
            "error"
        )

        return redirect(
            url_for(
                "dashboard.admin_dashboard"
            )
        )

    if request.method == "POST":

        username = request.form.get(
            "username",
            ""
        ).strip()

        password = request.form.get(
            "password",
            ""
        )

        role = request.form.get(
            "role",
            "admin"
        ).strip()

        if not username or not password:

            flash(
                "Username and password are required.",
                "error"
            )

            return redirect(
                url_for("auth.create_user")
            )

        if role not in [
            "owner",
            "admin"
        ]:

            flash(
                "Invalid user role.",
                "error"
            )

            return redirect(
                url_for("auth.create_user")
            )

        existing_user = User.query.filter_by(
            username=username
        ).first()

        if existing_user:

            flash(
                "That username already exists.",
                "error"
            )

            return redirect(
                url_for("auth.create_user")
            )

        new_user = User(
            username=username,
            password_hash=generate_password_hash(
                password
            ),
            role=role,
            is_active=True
        )

        try:

            db.session.add(
                new_user
            )

            db.session.commit()

        except Exception:

            db.session.rollback()

            flash(
                "Unable to create the user. Please try again.",
                "error"
            )

            return redirect(
                url_for("auth.create_user")
            )

        flash(
            "User created successfully.",
            "success"
        )

        return redirect(
            url_for(
                "dashboard.admin_dashboard"
            )
        )

    return render_template(
        "create_user.html"
    )