from flask import Blueprint, render_template, redirect, url_for, flash, abort
from flask_login import login_required, current_user

from app.extensions import db
from app.models.user import User, Permission
from app.services.permissions import require
from app.services.activity_logger import log_action
from app.blueprints.accounts.forms import AccountForm
from config import PAGE_PERMISSIONS

bp = Blueprint("accounts", __name__, url_prefix="/accounts")

ALL_PAGE_KEYS = [key for key, _ in PAGE_PERMISSIONS]


@bp.route("/")
@login_required
@require("accounts")
def index():
    users = User.query.order_by(User.id).all()
    return render_template("accounts/index.html", users=users)


@bp.route("/new", methods=["GET", "POST"])
@login_required
@require("accounts")
def new():
    form = AccountForm()
    if form.validate_on_submit():
        if User.query.filter_by(username=form.username.data.strip()).first():
            flash("این نام کاربری قبلاً استفاده شده است", "error")
        elif not form.password.data:
            flash("رمز عبور برای کاربر جدید الزامی است", "error")
        else:
            user = User(
                username=form.username.data.strip(),
                full_name=form.full_name.data.strip(),
                role=form.role.data,
                is_active_flag=form.is_active.data,
            )
            user.set_password(form.password.data)
            db.session.add(user)
            db.session.flush()
            perm_keys = ALL_PAGE_KEYS if user.role == "admin" else form.permissions.data
            for key in perm_keys:
                db.session.add(Permission(user_id=user.id, page_key=key))
            db.session.commit()
            log_action(current_user, "create", "user", user.id, {"username": user.username})
            flash("حساب کاربری ذخیره شد", "success")
            return redirect(url_for("accounts.index"))
    return render_template("accounts/form.html", form=form, user=None)


@bp.route("/<int:user_id>/edit", methods=["GET", "POST"])
@login_required
@require("accounts")
def edit(user_id):
    user = db.session.get(User, user_id) or abort(404)
    is_self = user.id == current_user.id
    form = AccountForm(obj=user)
    if form.validate_on_submit():
        user.full_name = form.full_name.data.strip()
        if not is_self:
            user.role = form.role.data
            user.is_active_flag = form.is_active.data
        if form.password.data:
            user.set_password(form.password.data)
        perm_keys = ALL_PAGE_KEYS if user.role == "admin" else form.permissions.data
        Permission.query.filter_by(user_id=user.id).delete()
        for key in perm_keys:
            db.session.add(Permission(user_id=user.id, page_key=key))
        db.session.commit()
        log_action(current_user, "update", "user", user.id, {"username": user.username})
        flash("حساب کاربری ذخیره شد", "success")
        return redirect(url_for("accounts.index"))

    if not form.is_submitted():
        form.permissions.data = ALL_PAGE_KEYS if user.role == "admin" else list(user.permission_keys())
    return render_template("accounts/form.html", form=form, user=user, is_self=is_self)


@bp.route("/<int:user_id>/deactivate", methods=["POST"])
@login_required
@require("accounts")
def deactivate(user_id):
    user = db.session.get(User, user_id) or abort(404)
    if user.id == current_user.id:
        flash("نمی‌توانید حساب خودتان را غیرفعال کنید", "error")
        return redirect(url_for("accounts.index"))
    user.is_active_flag = False
    db.session.commit()
    log_action(current_user, "delete", "user", user.id, {"username": user.username})
    flash(f"حساب «{user.full_name}» غیرفعال شد", "success")
    return redirect(url_for("accounts.index"))
