package com.sdtool.common.api;

import com.sdtool.common.entity.site.ERPTokenUser;
import com.sdtool.common.entity.system.DictData;
import com.sdtool.common.entity.system.DictType;
import com.sweetfish.service.RetResult;
import com.sweetfish.source.PageFlipper;
import org.rex.RMap;

import java.util.List;
import java.util.Map;

public interface DictService extends ScriptService {

    //region 字典数据

    /**
     * 获取字典分类列表
     * 从数据库中获取
     *
     * @param searchData  查询条件
     * @param pageFlipper 分页
     * @return 字典分类列表
     */
    @SuppressWarnings("rawtypes")
    RetResult<List<DictType>> getDictTypeList(RMap searchData, PageFlipper pageFlipper, String dataSourceId, long supplierCode);

    /**
     * 通过字典分类id获取字典分类信息
     *
     * @param id 字典分类id
     * @return 字典分类信息
     */
    DictType getDictTypeInfoById(long id, String dataSourceId, long supplierCode);

    /**
     * 通过字典分类dictType获取字典分类信息
     *
     * @param dictType 分类dictType
     * @return 字典分类信息
     */
    DictType getDictTypeInfoByText(String dictType, String dataSourceId, long supplierCode);

    /**
     * 获取字典类型的名称
     *
     * @param id 字典类型id
     * @return 字典类型的名称
     */
    @SuppressWarnings("unused")
    String getDictTypeName(long id, String dataSourceId, long supplierCode);

    /**
     * 增加字典分类
     *
     * @param dictType    字典分类
     * @param currentUser 操作人
     * @return 操作信息
     */
    RetResult<DictType> addDictType(DictType dictType, ERPTokenUser currentUser, String dataSourceId, long supplierCode);

    /**
     * 修改字典分类
     *
     * @param dictType    字典分类
     * @param currentUser 操作人
     * @return 操作信息
     */
    RetResult<DictType> updateDictType(DictType dictType, ERPTokenUser currentUser, String dataSourceId, long supplierCode);

    /**
     * 启用、禁用字典分类
     *
     * @param dictType    字典分类
     * @param currentUser 操作人
     * @return 操作信息
     */
    RetResult<DictType> voidDictType(DictType dictType, ERPTokenUser currentUser, String dataSourceId, long supplierCode);

    /**
     * 获取字典数据列表
     *
     * @param searchData  查询条件
     * @param pageFlipper 分页
     * @return 字典数据列表
     */
    @SuppressWarnings("rawtypes")
    RetResult<List<DictData>> getDictDataList(RMap searchData, PageFlipper pageFlipper, String dataSourceId, long supplierCode);

    /**
     * 获取字典数据信息
     *
     * @param idType 字典分类id
     * @param id     数据id
     * @return 字典数据信息
     */
    DictData getDictDataInfo(long idType, long id, String dataSourceId, long supplierCode);

    @SuppressWarnings("unused")
    DictData getDictDataInfoV2(String dictTypeText, long id, String dataSourceId, long supplierCode);

    /**
     * 增加字典数据
     *
     * @param dictData    字典
     * @param currentUser 操作人
     * @return 操作信息
     */
    RetResult<DictData> addDictData(DictData dictData, ERPTokenUser currentUser, String dataSourceId, long supplierCode);

    /**
     * 修改字典数据
     *
     * @param dictData    字典
     * @param currentUser 操作人
     * @return 操作信息
     */
    RetResult<DictData> updateDictData(DictData dictData, ERPTokenUser currentUser, String dataSourceId, long supplierCode);

    /**
     * 启用禁用字典数据
     *
     * @param dictData    字典
     * @param currentUser 操作人
     * @return 操作信息
     */
    RetResult<DictData> voidDictData(DictData dictData, ERPTokenUser currentUser, String dataSourceId, long supplierCode);

    /**
     * 客户端选择字典类型
     * 从redis中获取字典类型
     *
     * @return 字典类型
     */
    RetResult<List<DictType>> selectDictTypeList(String dataSourceId, long supplierCode);

    /**
     * 客户端选择字典数据
     * 先从redis中获取对应的字段类型，然后获取对应的字段数据
     * 不分页获取，如果需要分页可以使用getDictTypeInfoByText后使用getDictDataList获取
     *
     * @param dictTypeText 字典类型
     * @return 字典数据
     */
    RetResult<List<DictData>> selectDictDataList(String dictTypeText, String dataSourceId, long supplierCode);

    /**
     * 客户端批量选择字典数据
     *
     * @param dictTypeTextMulti 字段类型
     * @param dataSourceId      分库
     * @param supplierCode      分表
     * @return 字典数据
     */
    RetResult<Map<String, List<DictData>>> selectDictDataListMulti(String dictTypeTextMulti, String dataSourceId, long supplierCode);

    //endregion
}
