package com.yunzhupaas.base.service;

import com.yunzhupaas.base.ActionResult;
import com.yunzhupaas.base.entity.ModuleEntity;
import com.yunzhupaas.base.model.module.*;
import com.yunzhupaas.base.vo.DownloadVO;
import com.yunzhupaas.exception.DataException;

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

/**
 * 系统功能
 *
 * @author 云筑产品开发平台组
 * @version V3.1.0
 * @copyright 深圳市乐程软件有限公司
 * @date 2023/09/27
 */
public interface ModuleService extends SuperService<ModuleEntity> {

    /**
     * 列表
     *
     * @param filterFlowWork
     * @param moduleAuthorize
     * @param moduleUrlAddressAuthorize
     * @return ignore
     */
    List<ModuleEntity> getList(boolean filterFlowWork, List<String> moduleAuthorize, List<String> moduleUrlAddressAuthorize);

    /**
     * 列表
     *
     * @return ignore
     */
    List<ModuleEntity> getList();

    /**
     * 列表
     *
     * @param systemId 系统id
     * @param category
     * @param keyword
     * @param parentId
     * @param release
     * @return ignore
     */
    List<ModuleEntity> getList(String systemId, String category, String keyword, Integer type, Integer enabledMark, String parentId, boolean release);

    /**
     * 通过id获取子菜单
     *
     * @param id 主键
     * @return ignore
     */
    List<ModuleEntity> getList(String id);

    /**
     * 信息
     *
     * @param id 主键值
     * @return ignore
     */
    ModuleEntity getInfo(String id);

    /**
     * 信息
     *
     * @param id 主键值
     * @return ignore
     */
    ModuleEntity getInfo(String id, String systemId);

    /**
     * 信息
     *
     * @param fullName 主键值
     * @return ignore
     */
    List<ModuleEntity> getInfoByFullName(String fullName, String systemId);

    /**
     * 信息
     *
     * @param id 主键值
     * @return ignore
     */
    ModuleEntity getInfo(String id, String systemId, String parentId);

    /**
     * 验证名称
     *
     * @param entity   ignore
     * @param category 分类
     * @param systemId 分类
     * @return ignore
     */
    boolean isExistByFullName(ModuleEntity entity, String category, String systemId);

    /**
     * 验证编码
     *
     * @param entity   实体
     * @param category 分类
     * @param systemId 分类
     * @return ignore
     */
    boolean isExistByEnCode(ModuleEntity entity, String category, String systemId);

    /**
     * 删除
     *
     * @param entity 实体对象
     */
    void delete(ModuleEntity entity);

    /**
     * 删除
     *
     * @param systemId 实体对象
     */
    void deleteBySystemId(String systemId);


    /**
     * 删除权限（同步菜单 不处理数据权限）
     *
     * @param entity 实体对象
     */
    void deleteModule(ModuleEntity entity);

    /**
     * 创建
     *
     * @param entity 实体对象
     */
    void create(ModuleEntity entity);

    /**
     * 更新
     *
     * @param id     主键值
     * @param entity 实体对象
     * @return ignore
     */
    boolean update(String id, ModuleEntity entity);

    /**
     * 导出数据
     *
     * @param id 主键
     * @return DownloadVO ignore
     */
    DownloadVO exportData(String id);

    /**
     * 导入数据
     *
     * @param exportModel 导出模型
     * @param type
     * @return ignore
     * @throws DataException ignore
     */
    ActionResult importData(ModuleExportModel exportModel, Integer type) throws DataException;

    /**
     * 功能设计发布功能自动创建app pc菜单
     *
     * @return
     */
    List<ModuleEntity> getModuleList(String visualId);

    /**
     * 通过系统id获取菜单
     *
     * @param ids
     * @param moduleAuthorize
     * @param moduleUrlAddressAuthorize
     * @return
     */
    List<ModuleEntity> getModuleBySystemIds(List<String> ids, List<String> moduleAuthorize, List<String> moduleUrlAddressAuthorize);

    /**
     * 获取门户发布的菜单
     *
     * @param portalIds
     * @return
     */
    List<ModuleEntity> getModuleByPortal(List<String> portalIds);

    /**
     * 获取开发平台下的菜单
     *
     * @param moduleAuthorize
     * @param moduleUrlAddressAuthorize
     * @param singletonOrg
     * @return
     */
    List<ModuleEntity> getMainModule(List<String> moduleAuthorize, List<String> moduleUrlAddressAuthorize, boolean singletonOrg);

    List<ModuleEntity> getModuleByIds(List<String> moduleIds, List<String> moduleAuthorize, List<String> moduleUrlAddressAuthorize, boolean singletonOrg);

    /**
     * 通过ids获取系统菜单
     *
     * @param enCodeList
     * @return
     */
    List<ModuleEntity> getListByEnCode(List<String> enCodeList);

    /**
     * @param mark
     * @param id
     * @param moduleAuthorize
     * @param moduleUrlAddressAuthorize
     * @return
     */
    List<ModuleEntity> findModuleAdmin(int mark, String id, List<String> moduleAuthorize, List<String> moduleUrlAddressAuthorize);

    void getParentModule(List<ModuleEntity> data, Map<String, ModuleEntity> moduleEntityMap);

    /**
     * 通过urlAddressList找id
     *
     * @param ids
     * @param urlAddressList
     * @return
     */
    List<ModuleEntity> getListByUrlAddress(List<String> ids, List<String> urlAddressList);

    /**
     * 功能发布app pc菜单名称列表
     *
     * @return
     */
    ModuleNameVO getModuleNameList(String visualId);

    /**
     * 获取表单关联的菜单数据列表
     *
     * @param page
     * @return ignore
     */
    List<ModuleSelectorVo> getFormMenuList(ModulePagination page);


    /**
     * 获取应用菜单列表
     *
     * @param type      3代表表单
     * @param webType   页面类型（1、纯表单，2、表单加列表，4、数据视图）
     * @param categorys 菜单类型（web，app）
     * @return
     */
    List<MenuSelectAllVO> getSystemMenu(Integer type, List<Integer> webType, List<String> categorys);
}

