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

from app.extensions import db
from app.models.tag import TagCategory
from app.services.permissions import require
from app.services.activity_logger import log_action
from app.services import tag_service
from app.services.task_queries import VIP_TAG_NAME

bp = Blueprint("tag_admin", __name__, url_prefix="/tags")


@bp.route("/")
@login_required
@require("tag_admin")
def index():
    groups = tag_service.all_tags_grouped()
    return render_template("tag_admin/index.html", groups=groups, vip_tag_name=VIP_TAG_NAME)


@bp.route("/categories", methods=["POST"])
@login_required
@require("tag_admin")
def add_category():
    name = request.form.get("name", "").strip()
    if name:
        if tag_service.category_name_exists(name):
            flash(f"دسته‌ای با نام «{name}» از قبل وجود دارد", "error")
            return redirect(url_for("tag_admin.index"))
        tag_service.add_category(name)
        log_action(current_user, "create", "tag_category", details={"name": name})
        flash(f"دسته «{name}» اضافه شد", "success")
    return redirect(url_for("tag_admin.index"))


@bp.route("/categories/<int:category_id>/rename", methods=["POST"])
@login_required
@require("tag_admin")
def rename_category(category_id):
    name = request.form.get("name", "").strip()
    if name:
        if tag_service.category_name_exists(name, exclude_id=category_id):
            flash(f"دسته‌ای با نام «{name}» از قبل وجود دارد", "error")
            return redirect(url_for("tag_admin.index"))
        tag_service.rename_category(category_id, name)
        log_action(current_user, "update", "tag_category", category_id, {"name": name})
    return redirect(url_for("tag_admin.index"))


@bp.route("/categories/<int:category_id>/delete", methods=["POST"])
@login_required
@require("tag_admin")
def delete_category(category_id):
    tag_service.delete_category(category_id)
    log_action(current_user, "delete", "tag_category", category_id)
    flash("دسته حذف شد", "success")
    return redirect(url_for("tag_admin.index"))


@bp.route("/categories/<int:category_id>/tags", methods=["POST"])
@login_required
@require("tag_admin")
def add_tag(category_id):
    db.session.get(TagCategory, category_id) or abort(404)
    name = request.form.get("name", "").strip()
    if name:
        if tag_service.tag_name_exists(category_id, name):
            flash(f"آیتم «{name}» در این دسته از قبل وجود دارد", "error")
            return redirect(url_for("tag_admin.index"))
        tag_service.add_tag(category_id, name)
        log_action(current_user, "create", "tag", details={"name": name})
    return redirect(url_for("tag_admin.index"))


@bp.route("/<int:tag_id>/delete", methods=["POST"])
@login_required
@require("tag_admin")
def delete_tag(tag_id):
    tag_service.delete_tag(tag_id)
    log_action(current_user, "delete", "tag", tag_id)
    flash("آیتم حذف شد", "success")
    return redirect(url_for("tag_admin.index"))
