package com.cf.imes.module.system.service.organ;

import com.cf.imes.framework.common.pojo.PageResult;
import com.cf.imes.framework.organ.core.context.OrganContextHolder;
import com.cf.imes.module.system.controller.admin.organ.vo.organ.OrganPageReqVO;
import com.cf.imes.module.system.controller.admin.organ.vo.organ.OrganSaveReqVO;
import com.cf.imes.module.system.controller.admin.organ.vo.organ.OrganSimpleRespVO;
import com.cf.imes.module.system.controller.admin.user.vo.user.UserSimpleRespVO;
import com.cf.imes.module.system.dal.dataobject.organ.OrganizationDO;
import com.cf.imes.module.system.service.organ.handler.OrganInfoHandler;
import com.cf.imes.module.system.service.organ.handler.OrganMenuHandler;

import javax.validation.Valid;
import java.util.List;
import java.util.Set;

/**
 * 组织 Service 接口
 *
 * @author 晨丰科技
 */
public interface OrganService {

    /**
     * 创建组织
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createOrgan(@Valid OrganSaveReqVO createReqVO);

    /**
     * 更新组织
     *
     * @param updateReqVO 更新信息
     */
    void updateOrgan(@Valid OrganSaveReqVO updateReqVO);

    /**
     * 更新组织的角色菜单
     *
     * @param organId 组织编号
     * @param menuIds 菜单编号数组
     */
    void updateOrganRoleMenu(Long organId, Set<Long> menuIds);

    /**
     * 删除组织
     *
     * @param id 编号
     */
    void deleteOrgan(Long id);

    /**
     * 获得组织
     *
     * @param id 编号
     * @return 组织
     */
    OrganizationDO getOrgan(Long id);

    /**
     * 获得组织分页
     *
     * @param pageReqVO 分页查询
     * @return 组织分页
     */
    PageResult<OrganizationDO> getOrganPage(OrganPageReqVO pageReqVO);

    /**
     * 获得名字对应的组织
     *
     * @param name 组织名
     * @return 组织
     */
    OrganizationDO getOrganByName(String name);

    /**
     * 获得域名对应的组织
     *
     * @param website 域名
     * @return 组织
     */
    OrganizationDO getOrganByWebsite(String website);

    /**
     * 获得使用指定套餐的组织数量
     *
     * @param packageId 组织套餐编号
     * @return 组织数量
     */
    Long getOrganCountByPackageId(Long packageId);

    /**
     * 获得使用指定套餐的组织数组
     *
     * @param packageId 组织套餐编号
     * @return 组织数组
     */
    List<OrganizationDO> getOrganListByPackageId(Long packageId);

    /**
     * 进行组织的信息处理逻辑
     * 其中，组织编号从 {@link OrganContextHolder} 上下文中获取
     *
     * @param handler 处理器
     */
    void handleOrganInfo(OrganInfoHandler handler);

    /**
     * 进行组织的菜单处理逻辑
     * 其中，组织编号从 {@link OrganContextHolder} 上下文中获取
     *
     * @param handler 处理器
     */
    void handleOrganMenu(OrganMenuHandler handler);

    /**
     * 获得所有组织
     *
     * @return 组织编号数组
     */
    List<Long> getOrganIdList();

    /**
     * 校验组织是否合法
     *
     * @param id 组织编号
     */
    void validOrgan(Long id);

    List<OrganSimpleRespVO> getSimpleOrganList(String name);
}
