package com.sdtool.common.api;

import com.sdtool.common.entity.base.DataBaseMultiItemEx;
import com.sdtool.common.entity.base.InvokeCallParams;
import com.sdtool.common.entity.base.InvokeCallResult;
import com.sdtool.common.entity.base.ProcessMapItem;
import com.sdtool.common.entity.site.ERPTokenUser;
import com.sdtool.common.entity.site.ERPUploadFile;
import com.sdtool.common.entity.system.*;
import com.sweetfish.service.RetResult;
import com.sweetfish.source.PageFlipper;
import com.sweetfish.util.AutoLoad;
import org.rex.RMap;

import java.util.List;

/**
 * Created by jlutt on 2020-07-28
 * 平台基础服务
 * 菜单、角色、权限、部门、登录等
 *
 * @author jlutt
 */
@AutoLoad(false)
@SuppressWarnings("rawtypes")
public interface SystemService extends ScriptService {


    /**
     * 首页面板数据
     *
     * @param currentUser  操作用户
     * @param dataSourceId 分库
     * @param supplierCode 分表
     * @return 查询数据
     */
    @SuppressWarnings("rawtypes")
    RMap getIndexCardPanelData(ERPTokenUser currentUser, String dataSourceId, long supplierCode);


    /**
     * 保存上传的erp文件
     *
     * @param uploadFile   文件信息
     * @param currentUser  操作人
     * @param dataSourceId 分库
     * @param supplierCode 分表
     * @return 操作信息
     */
    @SuppressWarnings("unused")
    int uploadERPFile(ERPUploadFile uploadFile, ERPTokenUser currentUser, String dataSourceId, long supplierCode);

    /**
     * 文件查询
     *
     * @param searchData  查询条件
     * @param currentUser 操作人
     * @param pageFlipper 分页信息
     * @param orderBy     排序
     * @return 文件列表
     */
    RetResult<List<ERPUploadFile>> getERPFileList(RMap searchData,
                                                  ERPTokenUser currentUser,
                                                  PageFlipper pageFlipper,
                                                  String orderBy,
                                                  String dataSourceId,
                                                  long supplierCode);


    //region 消息类型

    /**
     * 获取消息类型列表
     * 从redis中获取
     *
     * @param searchData 查询条件
     * @return 消息类型
     */
    @SuppressWarnings("rawtypes")
    RetResult<List<NoticeMessage>> getNoticeMessageList(RMap searchData, String dataSourceId, long supplierCode);

    /**
     * 增加消息类型
     *
     * @param noticeMessage 消息类型
     * @param currentUser   操作人
     * @return 操作信息
     */
    RetResult<NoticeMessage> addNoticeMessage(NoticeMessage noticeMessage, ERPTokenUser currentUser, String dataSourceId, long supplierCode);

    RetResult<NoticeMessage> getNoticeMessage(long messageId, String dataSourceId, long supplierCode);

    /**
     * 修改消息类型
     *
     * @param noticeMessage 消息类型
     * @param currentUser   操作人
     * @return 操作信息
     */
    RetResult<NoticeMessage> updateNoticeMessage(NoticeMessage noticeMessage, ERPTokenUser currentUser, String dataSourceId, long supplierCode);

    /**
     * 切换消息类型状态
     *
     * @param noticeMessage 消息类型
     * @param currentUser   操作人
     * @return 操作信息
     */
    RetResult<NoticeMessage> voidNoticeMessage(NoticeMessage noticeMessage, ERPTokenUser currentUser, String dataSourceId, long supplierCode);

    /**
     * 获取消息订阅用户列表
     * 配置使用
     *
     * @param idNoticeMessage 消息类型id
     * @param dataSourceId    分库
     * @param supplierCode    分表
     * @return 订阅用户列表
     */
    List<UserNoticeMessage> getNoticeMessageUserList(long idNoticeMessage, String dataSourceId, long supplierCode);

    /**
     * 获取消息订阅用户 socket id列表
     * 发送消息使用
     *
     * @param messageCode  消息编号
     * @param dataSourceId 分库
     * @param supplierCode 分表
     * @return 订阅用户 socket id列表
     */
    List<String> getNoticeMessageUser(String messageCode, String dataSourceId, long supplierCode);

    /**
     * 指定消息类型增加订阅用户
     *
     * @param userNoticeMessage 用户订阅消息
     * @param currentUser       操作人
     * @param dataSourceId      分库
     * @param supplierCode      分表
     * @return 操作信息
     */
    RetResult<NoticeMessage> addUserNoticeMessage(UserNoticeMessage userNoticeMessage, ERPTokenUser currentUser, String dataSourceId, long supplierCode);

    /**
     * 指定消息类型删除订阅用户
     *
     * @param userNoticeMessage 用户订阅消息
     * @param dataSourceId      分库
     * @param supplierCode      分表
     * @return 操作信息
     */
    RetResult<NoticeMessage> removeUserNoticeMessage(UserNoticeMessage userNoticeMessage, ERPTokenUser currentUser, String dataSourceId, long supplierCode);

    //endregion

    //region 通知消息

    /**
     * 写入在线用户
     *
     * @param userInfo        用户信息
     * @param socketSessionId websocket传入的sessionid
     * @param dataSourceId    分库
     * @param supplierCode    分表
     */
    void writeOnlineUser(LoginUser userInfo, String socketSessionId, String dataSourceId, long supplierCode);

    /**
     * 删除在线用户
     *
     * @param userId          用户id
     * @param socketSessionId websocket传入的sessionid
     * @param dataSourceId    分库
     * @param supplierCode    分表
     */
    void deleteOnlineUser(long userId, String socketSessionId, String dataSourceId, long supplierCode);

    /**
     * 获取在线用户列表
     *
     * @return 在线用户列表
     */
    List<LoginUser> queryOnlineUser(String dataSourceId, long supplierCode);

    /**
     * 按照消息类型发送文本信息
     *
     * @param messageCode    消息类型，对应NoticeMessage.messageCode
     * @param messageContent 消息内容
     * @param supplierCode   分表
     */
    void sendERPNoticeMessage1(ERPTokenUser currentUser, String messageCode, String messageContent, String dataSourceId, long supplierCode);

    /**
     * 按照消息类型发送文本信息
     *
     * @param messageCode    消息类型，对应NoticeMessage.messageCode
     * @param messageContent 消息内容
     * @param supplierCode   分表
     */
    @SuppressWarnings("unused")
    void sendERPNoticeMessage2(String messageCode, String messageContent, String dataSourceId, long supplierCode);

    /**
     * 按照用户ids发送文本信息
     *
     * @param messageContent 消息内容
     * @param supplierCode   分表
     */
    void sendERPNoticeMessage3(ERPTokenUser currentUser, String userIds, String messageContent, String dataSourceId, long supplierCode);

    /**
     * 按照用户ids发送文本信息
     *
     * @param messageContent 消息内容
     * @param supplierCode   分表
     */
    @SuppressWarnings("unused")
    void sendERPNoticeMessage4(String userIds, String messageContent, String dataSourceId, long supplierCode);

    /**
     * 按照用户ids发送打印信息
     *
     * @param messageContent 消息内容
     * @param supplierCode   分表
     */
    void sendERPPrintMessage(ERPTokenUser currentUser, String userIds, String messageContent, String dataSourceId, long supplierCode);

    void sendShowERPMessage(ERPTokenUser currentUser, String userIds, String messageContent, String dataSourceId, long supplierCode);

    /**
     * 按照用户ids发送打印信息
     *
     * @param messageContent 消息内容
     * @param supplierCode   分表
     */
    @SuppressWarnings("unused")
    void sendERPPrintMessage2(String userIds, String messageContent, String dataSourceId, long supplierCode);

    /**
     * 广播消息
     *
     * @param messageContent 消息内容
     * @param supplierCode   分表
     */
    void broadcastMessage(String messageContent, String dataSourceId, long supplierCode);

    //endregion

    /**
     * 表单重复提交检查
     *
     * @param formName      表单名称
     * @param userSessionId 操作人
     * @return 是否重提提交
     */
    @SuppressWarnings("unused")
    boolean checkFormSubmitCount(String formName, String userSessionId, String dataSourceId, long supplierCode);

    /**
     * 表单重复提交检查
     *
     * @param formName      表单名称
     * @param expireSecond  过期时间
     * @param userSessionId 操作人
     * @return 是否重提提交
     */
    @SuppressWarnings("unused")
    boolean checkFormSubmitCount(String formName, int expireSecond, String userSessionId, String dataSourceId, long supplierCode);

    /**
     * 请求formtoken
     *
     * @param formName     表单名称
     * @param supplierCode 分表
     * @return token
     */
    String requestFormToken(String formName, long supplierCode);

    /**
     * 检查表达是否提交
     *
     * @param formToken    token
     * @param supplierCode 分表
     * @return -1已提交，1正常
     */
    int checkFormToken(String formToken, long supplierCode);

    /**
     * 删除token
     *
     * @param formToken    token
     * @param supplierCode 分表
     */
    void resetFormToken(String formToken, long supplierCode);

    //region 调试

    /**
     * 通用修改es数据
     *
     * @param index      索引
     * @param type       文档type
     * @param recordId   es id
     * @param valuePairs 键值对
     * @return 操作信息
     */
    RetResult updateEsData(String index, String type, String recordId, List<KeyValuePair> valuePairs);

    //endregion

    //region 通用导出

    /**
     * 执行导出脚本
     *
     * @param exportCode   脚本编号
     * @param exportName   导出名称
     * @param params       查询条件
     * @param currentUser  操作用户
     * @param dataSourceId 分库
     * @param supplierCode 分表
     * @return 操作信息
     */
    @SuppressWarnings("rawtypes")
    RetResult<String> exportData(String exportCode, String exportName, RMap params, ERPTokenUser currentUser, String dataSourceId, long supplierCode);

    @SuppressWarnings({"rawtypes"})
    RetResult<List<TaskQueue>> selectUserTaskQueues(RMap searchData, ERPTokenUser currentUser, PageFlipper pageFlipper, String dataSourceId, long supplierCode);

    //endregion

    //region 图形统计

    /**
     * 获取图表统计数据
     *
     * @param chartCode    脚本代码
     * @param searchData   查询参数
     * @param currentUser  操作人
     * @param dataSourceId 分库
     * @param supplierCode 分表
     * @return 统计数据
     */
    @SuppressWarnings("rawtypes")
    RetResult<ProcessMapItem> getChartTotalData(String chartCode, RMap searchData, ERPTokenUser currentUser, String dataSourceId, long supplierCode);

    //endregion

    //region saas租户管理

    void initSaasClient(DataBaseMultiItemEx dataItem, String dataSourceId, long supplierCode);

    void voidSaasClient(DataBaseMultiItemEx dataItem, String dataSourceId, long supplierCode);

    //endregion

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