package cn.ey.biz.module.system.service.category.v2;

import cn.ey.biz.common.pojo.PageResult;
import cn.ey.biz.module.system.api.category.dto.CategoryDataV2ReqDTO;
import cn.ey.biz.module.system.api.category.dto.CategoryDataV2RespDTO;
import cn.ey.biz.module.system.api.category.dto.DictCatalogDTO;
import cn.ey.biz.module.system.controller.admin.category.vo.*;
import cn.ey.biz.module.system.dal.dataobject.category.CategoryDataDO;

import javax.validation.Valid;
import java.util.Collection;
import java.util.List;
import java.util.Map;

/**
 * 字典分类数据 Service 接口
 */
public interface CategoryDataV2Service {

    /**
     * 创建字典分类数据
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createCategoryData(@Valid CategoryDataCreateReqVO createReqVO);

    /**
     * 更新字典分类数据
     *
     * @param updateReqVO 更新信息
     */
    void updateCategoryData(@Valid CategoryDataUpdateReqVO updateReqVO);

    /**
     * 删除字典分类数据
     *
     * @param id 编号
     */
    void deleteCategoryData(Long id);

    /**
     * 获得字典分类数据
     *
     * @param id 编号
     * @return 字典分类数据
     */
    CategoryDataDO getCategoryData(Long id);

    /**
     * 获得字典分类数据列表
     *
     * @param ids 编号
     * @return 字典分类数据列表
     */
    List<CategoryDataDO> getCategoryDataList(Collection<Long> ids);

    /**
     * 获得字典分类数据分页
     *
     * @param pageReqVO 分页查询
     * @return 字典分类数据分页
     */
    PageResult<CategoryDataRespVO> getCategoryDataPage(CategoryDataPageReqVO pageReqVO);

    /**
     * 获得字典分类数据列表, 用于 Excel 导出
     *
     * @param exportReqVO 查询条件
     * @return 字典分类数据列表
     */
    List<CategoryDataDO> getCategoryDataList(CategoryDataExportReqVO exportReqVO);

    /**
     * 根据父ID获取对应的字典数据
     **/
    List<CategoryDataRespVO> getCategoryByidData(Long pid, String acceptLanguage);

    /**
     * 获得字典数据列表
     *
     * @return 字典数据全列表
     **/
    List<CategoryDataSimpleRespVO> getCategoryDatas(String app, String acceptLanguage);

    /**
     * 获得字典数据tree列表
     *
     * @param acceptLanguage 语言
     * @param app            应用ID
     * @param statusName     状态名称
     * @return 字典数据tree列表
     **/
    Map<String, List<CategoryDataSimpleRespVO>> getCategoryDataTree(String app, String acceptLanguage, String statusName);

    /**
     * 获得字典数据列表
     *
     * @param app            应用
     * @param acceptLanguage 语言
     * @param status         状态
     * @return 字典数据全列表
     **/
    List<CategoryDataSimpleRespVO> getCategoryDatas(String app, String acceptLanguage, Integer status);

    CategoryDataRespVO getCategoryDataByid(Long id);

    void importDictCatalog(List<DictCatalogDTO> dictCatalogs);


    /**
     * 获得字典数据列表
     *
     * @param req 查询参数
     * @return 字典数据全列表
     **/
    List<CategoryDataV2RespDTO> getCategoryData(CategoryDataV2ReqDTO req);

    /**
     * 获得字典数据列表不使用缓存
     *
     * @param req 查询参数
     * @return 字典数据全列表
     **/
    List<CategoryDataV2RespDTO> getCategoryDataNonCache(CategoryDataV2ReqDTO req);

    /**
     * 获得字典数据列表包含app信息
     *
     * @param acceptLanguage 语言
     * @param app            应用ID
     * @param statusName     状态名称
     * @return 字典数据全列表
     **/
    List<CategoryDataSimpleRespVO> getCategoryDataContainsApp(String app, String acceptLanguage, String statusName);


    /**
     * 清除公共字典数据缓存
     */
    void resetCategoryDataCache();

    /**
     * 按categoryCode list 获取默认的独立数据字典集合
     *
     * @param categoryCodeList 查询的字典分类
     * @return 查询的字典分类结果集合
     */
    Map<String, List<Map<String, Object>>> listDefaultCategoryDataByCategoryCodes(List<String> categoryCodeList);

    /**
     * 按 status name, categoryCode list 获取默认的独立数据字典集合
     *
     * @param categoryCodeList 字典集合
     * @param statusName       状态名
     * @return 查询的字典分类结果集合
     */
    Map<String, List<Map<String, Object>>> listDefaultCategoryDataByCodesAndStatusName(List<String> categoryCodeList, String statusName);

    /**
     * 获取符合条件的独立数据字典集合
     *
     * @param categoryCodeReqList 查询的字典分类条件
     * @return 查询的字典分类结果集合
     */
    Map<String, List<Map<String, Object>>> listCustomCategoryDataByCategoryCodes(List<CategoryDataDynamicReqVO> categoryCodeReqList);

    /**
     * 分页获取符合条件的独立数据字典集合
     *
     * @param categoryCodePageReq 查询的字典分类条件
     * @return 查询的字典分类分页结果集合
     */
    PageResult<Map<String, Object>> pageCategoryDataByCategoryCodes(CategoryDataDynamicPageReqVO categoryCodePageReq);

    /**
     * 批量创建字典分类数据
     *
     * @param createReqVOList 创建信息
     */
    void createBatchCategoryData(List<CategoryDataCreateReqVO> createReqVOList);

    /**
     * 批量更新字典分类数据
     *
     * @param updateReqVOList 创建信息
     */
    void updateBatchCategoryData(List<CategoryDataUpdateReqVO> updateReqVOList);


}
