package tech.easyflow.admin.model;

import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;

import java.math.BigInteger;
import java.util.List;
import java.util.Map;

/**
 * 管理端系统表单所需的安全选项视图。
 */
public final class SystemFormOptionsView {

    private SystemFormOptionsView() {
    }

    /**
     * 审批流程资源范围选项。
     *
     * @param categories 按资源类型分组的分类选项
     * @param departments 部门树
     */
    public record ApprovalResourceScopeOptions(
            Map<String, List<CategoryOption>> categories,
            List<DepartmentOption> departments
    ) {
    }

    /**
     * 角色表单选项。
     *
     * @param menus 菜单树
     * @param categories 按资源类型分组的非 Bot 分类选项
     */
    public record RoleFormOptions(
            List<MenuOption> menus,
            Map<String, List<CategoryOption>> categories
    ) {
    }

    /**
     * 账号表单选项。
     *
     * @param departments 部门树
     * @param roles 可用角色
     * @param positions 可用岗位
     */
    public record AccountFormOptions(
            List<DepartmentOption> departments,
            List<RoleOption> roles,
            List<PositionOption> positions
    ) {
    }

    /**
     * 分类安全选项。
     *
     * @param id 分类 ID
     * @param categoryName 分类名称
     */
    public record CategoryOption(
            @JsonSerialize(using = ToStringSerializer.class) BigInteger id,
            String categoryName
    ) {
    }

    /**
     * 部门树安全选项。
     *
     * @param id 部门 ID
     * @param parentId 上级部门 ID
     * @param deptName 部门名称
     * @param children 下级部门
     */
    public record DepartmentOption(
            @JsonSerialize(using = ToStringSerializer.class) BigInteger id,
            @JsonSerialize(using = ToStringSerializer.class) BigInteger parentId,
            String deptName,
            List<DepartmentOption> children
    ) {
    }

    /**
     * 菜单树安全选项。
     *
     * @param id 菜单 ID
     * @param parentId 上级菜单 ID
     * @param menuTitle 菜单标题
     * @param children 下级菜单
     */
    public record MenuOption(
            @JsonSerialize(using = ToStringSerializer.class) BigInteger id,
            @JsonSerialize(using = ToStringSerializer.class) BigInteger parentId,
            String menuTitle,
            List<MenuOption> children
    ) {
    }

    /**
     * 角色安全选项。
     *
     * @param id 角色 ID
     * @param roleName 角色名称
     */
    public record RoleOption(
            @JsonSerialize(using = ToStringSerializer.class) BigInteger id,
            String roleName
    ) {
    }

    /**
     * 岗位安全选项。
     *
     * @param id 岗位 ID
     * @param positionName 岗位名称
     */
    public record PositionOption(
            @JsonSerialize(using = ToStringSerializer.class) BigInteger id,
            String positionName
    ) {
    }
}
