package com.engine.salary.service.auth;

import com.engine.salary.entity.auth.dto.AuthTreeDTO;
import com.engine.salary.entity.auth.dto.TaxEmpOptAuth;
import com.engine.salary.entity.auth.param.AuthTreeQueryParam;
import com.engine.salary.entity.auth.vo.Permission;
import com.engine.salary.enums.auth.AuthFilterTypeEnum;

import java.util.List;

/**
 * 权限控制单元
 * <p>Copyright: Copyright (c) 2024</p>
 * <p>Company: 泛微软件</p>
 *
 * @author qiantao
 * @version 1.0
 **/
public interface AuthService {

    /**
     * 单一对象权限识别
     *
     * @param t          对象实体
     * @param filterType 数据过滤方式，默认采用“数据&功能权限”方式过滤
     * @param clazz      反射类，需加@Auth注解定义权限项
     * @param <T>        对象泛型
     * @return 是否有权限
     */
    <T> boolean auth(T t, AuthFilterTypeEnum filterType, Class<T> clazz);

    /**
     * 对象权限识别
     *
     * @param list       对象集合
     * @param filterType <></>数据过滤方式，默认采用“数据&功能权限”方式过滤
     * @param clazz      反射类，需加@Auth注解定义权限项
     * @param <T>        对象泛型
     * @return 有权限的对象集合
     */
    <T> List<T> auth(List<T> list, AuthFilterTypeEnum filterType, Class<T> clazz);

    /**
     * 对象权限识别
     *
     * @param list       对象集合
     * @param filterType 数据过滤方式，默认采用“数据&功能权限”方式过滤
     * @param clazz      反射类，需加@Auth注解定义权限项
     * @param page       页面标识，用于获取权限项
     * @param <T>        对象泛型
     * @return 有权限的对象集合
     */
    <T> List<T> auth(List<T> list, AuthFilterTypeEnum filterType, Class<T> clazz, String page);

    /**
     * 单页权限识别
     *
     * @param page 页面标识，用于获取权限项
     * @return 权限树
     */
    Permission permission(String page);

    /**
     * 权限树
     *
     * @param param 查询参数
     * @return 权限树
     */
    AuthTreeDTO tree(AuthTreeQueryParam param);

    List<TaxEmpOptAuth> getTaxEmpOptAuth(String page);
}
