# -*- coding: utf-8 -*-
"""中台：管理员管理——仅超级管理员(super)可录入/删除管理员。
录入可选类型：超级管理员 / 普通管理员。删除保护：不能删自己、系统至少保留一个 super。
删除前解除该账号作为操作者/审核者的外键引用（置 NULL），保留审计日志。
"""
from flask import render_template, request, redirect, url_for, flash, abort
from flask_login import login_required, current_user

from app.models import Staff, OperationLog, LikeSubmission
from app.extensions import db
from app.admin import bp
from app.services import log_action


def _super_only():
    if not current_user.is_authenticated or current_user.role != "super":
        abort(403)


@bp.route("/admins")
@login_required
def admin_list():
    _super_only()
    q = request.args.get("q", "").strip()
    query = Staff.query.filter(Staff.role.in_(("super", "admin")))
    if q:
        query = query.filter(Staff.name.contains(q) | Staff.phone.contains(q))
    admins = query.order_by(Staff.id.asc()).all()
    return render_template("admin/admin_list.html", admins=admins, q=q, active="admins")


@bp.route("/admins/new", methods=["POST"])
@login_required
def admin_new():
    _super_only()
    name = request.form.get("name", "").strip()
    phone = request.form.get("phone", "").strip()
    pwd = request.form.get("password", "").strip()
    role = request.form.get("role", "admin").strip()
    if role not in ("super", "admin"):
        role = "admin"
    if not name or not phone or not pwd:
        flash("姓名、手机号、密码均必填", "danger")
    elif Staff.query.filter(Staff.phone == phone, Staff.role.in_(("super", "admin"))).first():
        flash("该手机号已被其他管理员占用", "danger")
    else:
        s = Staff(name=name, phone=phone, role=role, status="active")
        s.set_password(pwd)
        db.session.add(s)
        db.session.commit()
        is_super = (role == "super")
        log_action("admin_create", target_type="staff", target_id=s.id,
                   summary="新增%s：%s %s" % ("超级管理员" if is_super else "管理员", name, phone))
        flash("已新增%s %s" % ("超级管理员" if is_super else "管理员", name), "success")
    return redirect(url_for("admin.admin_list"))


@bp.route("/admins/<int:id>/delete", methods=["POST"])
@login_required
def admin_delete(id):
    _super_only()
    s = Staff.query.get_or_404(id)
    if s.role not in ("super", "admin"):
        flash("仅可删除管理员账号", "danger")
    elif s.id == current_user.id:
        flash("不能删除当前登录的自己", "danger")
    elif s.role == "super" and Staff.query.filter_by(role="super").count() <= 1:
        flash("系统至少需保留一个超级管理员，不能删除", "danger")
    else:
        # 解除该账号作为操作者/审核者的历史外键引用（置 NULL，保留审计日志），再物理删除
        db.session.query(OperationLog).filter_by(admin_id=s.id).update(
            {OperationLog.admin_id: None}, synchronize_session=False)
        db.session.query(LikeSubmission).filter_by(reviewer_id=s.id).update(
            {LikeSubmission.reviewer_id: None}, synchronize_session=False)
        db.session.delete(s)
        log_action("admin_delete", target_type="staff", target_id=id,
                   summary="删除管理员：%s %s" % (s.name, s.phone), commit=False)
        db.session.commit()
        flash("已删除管理员 %s" % s.name, "success")
    return redirect(url_for("admin.admin_list"))
