package com.sdtool.common.api;

import com.sdtool.common.entity.base.InvokeCallParams;
import com.sdtool.common.entity.base.InvokeCallResult;
import com.sdtool.common.entity.site.ERPTokenUser;
import com.sdtool.common.entity.site.SiteContent;
import com.sdtool.common.entity.system.ConfigValue;
import com.sdtool.common.entity.system.PageTableColumn;
import com.sdtool.common.entity.system.PersonConfigValue;
import com.sweetfish.service.RetResult;
import org.rex.RMap;

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

public interface ConfigService extends ScriptService {

    //region 配置管理

    /**
     * 获取系统配置信息
     *
     * @param configKey 配置key
     * @return 配置信息
     */
    ConfigValue getRedisConfigValue(String configKey, String dataSourceId, long supplierCode);

    /**
     * 获取配置的第一个参数值long
     *
     * @param configKey    配置key
     * @param dataSourceId 分库
     * @param supplierCode 分表
     * @return long
     */
    long getLongRedisConfigValue1(String configKey, String dataSourceId, long supplierCode);

    int getIntRedisConfigValue1(String configKey, long supplierCode);

    /**
     * 获取系统配置信息
     *
     * @param configKey    配置key
     * @param dataSourceId 分库
     * @param supplierCode 分表
     * @return 配置信息
     */
    @SuppressWarnings("unused")
    List<ConfigValue> getRedisConfigValueMutil(String configKey, String dataSourceId, long supplierCode);

    /**
     * 获取系统配置信息
     *
     * @param dataSourceId 分库
     * @return 配置信息列表
     */
    List<ConfigValue> getRedisConfigValueList(String dataSourceId, long supplierCode, String[] keys);

    /**
     * 获取配置列表，从redis中直接获取，不分页
     *
     * @param searchData  查询条件
     * @param currentUser 操作人
     * @return 配置列表
     */
    @SuppressWarnings("rawtypes")
    RetResult<List<ConfigValue>> getConfigValueList(RMap searchData, ERPTokenUser currentUser, String dataSourceId, long supplierCode);

    /**
     * 增加配置项
     *
     * @param configValue 配置信息
     * @param currentUser 操作人
     * @return 操作信息
     */
    RetResult<ConfigValue> addConfigValue(ConfigValue configValue, ERPTokenUser currentUser, String dataSourceId, long supplierCode);

    /**
     * 修改配置项
     *
     * @param configValue 配置信息
     * @param currentUser 操作人
     * @return 操作信息
     */
    RetResult<ConfigValue> updateConfigValue(ConfigValue configValue, ERPTokenUser currentUser, String dataSourceId, long supplierCode);

    /**
     * 批量修改配置项，只有key和值
     *
     * @param valueList 配置项列表
     */
    void updateConfigOnlyValue(List<ConfigValue> valueList, String dataSourceId, long supplierCode);

    /**
     * 删除配置项
     *
     * @param configValue 配置信息
     * @param currentUser 操作人
     * @return 操作信息
     */
    RetResult<ConfigValue> removeConfigValue(ConfigValue configValue, ERPTokenUser currentUser, String dataSourceId, long supplierCode);

    /**
     * 获取网站相关配置信息
     *
     * @param currentUser 操作人
     * @return 网站相关配置信息列表
     */
    RetResult<Map<String, String>> getSiteInfoConfig(ERPTokenUser currentUser, String dataSourceId, long supplierCode);

    /**
     * 保存网站相关的配置
     *
     * @param valueList 网站相关配置信息列表
     * @return 操作人
     */
    RetResult<ConfigValue> saveSiteInfoConfigValue(List<ConfigValue> valueList, ERPTokenUser currentUser, String dataSourceId, long supplierCode);

    //endregion

    //region 人员配置

    /**
     * 获取个人配置信息
     * 注意判断返回空值情况
     *
     * @param idUser       用户id
     * @param configKey    配置信息
     * @param dataSourceId 分库
     * @param supplierCode 分表
     * @return 配置信息
     */
    @SuppressWarnings("unused")
    PersonConfigValue getPersonConfigValue(long idUser, String configKey, String dataSourceId, long supplierCode);

    /**
     * 保持配置信息
     *
     * @param idUser       用户id
     * @param configKey    配置主键
     * @param configValue  配置值
     * @param dataSourceId 分库
     * @param supplierCode 分表
     * @return 操作信息
     */
    @SuppressWarnings("unused")
    int savePersonConfigValue(long idUser, String configKey, String configValue, String dataSourceId, long supplierCode);

    //endregion

    //region 页面表格列

    /**
     * 保存页面列
     *
     * @param pageName        页面名称
     * @param tableColumnList 表格列列表
     * @param currentUser     操作人
     * @param dataSourceId    分库
     * @param supplierCode    分表
     * @return 操作信息
     */
    RetResult<String> savePageTableColumn(String pageName, List<PageTableColumn> tableColumnList, ERPTokenUser currentUser, String dataSourceId, long supplierCode);

    /**
     * 获取页面列
     *
     * @param pageName     页面名称
     * @param currentUser  操作人
     * @param dataSourceId 分库
     * @param supplierCode 分表
     * @return 操作信息
     */
    RetResult<List<PageTableColumn>> getPageTableColumn(String pageName, ERPTokenUser currentUser, String dataSourceId, long supplierCode);

    //endregion

    //region 常用配置获取

    int erpOrderManagerKind(long supplierCode);

    /**
     * 判断是否商城后台跑了ERP
     *
     * @param supplierCode 分表
     * @return 0否 1是 2ERP运行
     */
    int mallERP(long supplierCode);

    //endregion

    //region 网站内容缓存


    SiteContent getCacheSiteContentInfo(long idContent, long supplierCode);

    void removeCacheSiteContentInfo(long idContent, long supplierCode);

    //endregion

    RetResult<InvokeCallResult> callConfig(InvokeCallParams source, ERPTokenUser currentUser, String dataSourceId, long supplierCode);
}
