package ink.wgink.module.map.service.grid;

import ink.wgink.exceptions.SearchException;
import ink.wgink.module.map.pojo.dtos.grid.GridDTO;
import ink.wgink.module.map.pojo.pos.grid.GridPO;
import ink.wgink.module.map.pojo.vos.grid.GridVO;
import ink.wgink.pojo.ListPage;
import ink.wgink.pojo.result.SuccessResultList;

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

/**
 * When you feel like quitting. Think about why you started
 * 当你想要放弃的时候，想想当初你为何开始
 *
 * @ClassName: IGridService
 * @Description: 网格业务
 * @Author: WangGeng
 * @Date: 2020/10/21 11:14
 * @Version: 1.0
 **/
public interface IGridService {

    /**
     * 保存网格
     *
     * @param gridVO
     * @return
     * @throws Exception
     */
    void save(GridVO gridVO) throws Exception;

    /**
     * 保存网格并返回ID
     *
     * @param gridVO
     * @return
     * @throws Exception
     */
    String saveAndReturnId(GridVO gridVO) throws Exception;

    /**
     * 删除网格
     *
     * @param ids
     */
    void remove(List<String> ids);

    /**
     * 删除网格
     *
     * @param relationId 关联关系
     */
    void deleteByRelationId(String relationId);

    /**
     * 删除网格
     *
     * @param gridIds 网格ID列表
     */
    void deleteByGridIds(List<String> gridIds);

    /**
     * 删除空网格（没有节点的网格）
     *
     * @param gridIds
     */
    void deleteEmpty(List<String> gridIds);

    /**
     * 更新网格
     *
     * @param gridId 网格ID
     * @param gridVO 更新内容
     * @throws Exception
     */
    void update(String gridId, GridVO gridVO) throws Exception;

    /**
     * 网格详情
     *
     * @param params
     * @return
     */
    GridDTO get(Map<String, Object> params);

    /**
     * 网格详情
     *
     * @param params
     * @param withRelations 包含关联关系
     * @param withPoints    包含点
     * @return
     */
    GridDTO get(Map<String, Object> params, boolean withRelations, boolean withPoints);

    /**
     * 网格详情
     *
     * @param gridId
     * @return
     */
    GridDTO get(String gridId);

    /**
     * 网格详情
     *
     * @param gridId
     * @param withRelations 包含关联关系
     * @param withPoints    包含点
     * @return
     */
    GridDTO get(String gridId, boolean withRelations, boolean withPoints);

    /**
     * 网格详情
     *
     * @param params
     * @return
     */
    GridPO gridPO(Map<String, Object> params);

    /**
     * 网格详情
     *
     * @param gridId
     * @return
     */
    GridPO gridPO(String gridId);

    /**
     * 网格列表
     *
     * @param params
     * @return
     */
    List<GridDTO> list(Map<String, Object> params);

    /**
     * 网格列表
     *
     * @param params
     * @param withRelations 包含关联关系
     * @param withPoints    包含点
     * @return
     */
    List<GridDTO> list(Map<String, Object> params, boolean withRelations, boolean withPoints);

    /**
     * 网格列表
     *
     * @param gridIds 网格ID
     * @return
     */
    List<GridDTO> list(List<String> gridIds);

    /**
     * 网格列表
     *
     * @param gridIds       网格ID
     * @param withRelations 包含关联关系
     * @param withPoints    包含点
     * @return
     */
    List<GridDTO> list(List<String> gridIds, boolean withRelations, boolean withPoints);

    /**
     * 获取网格列表
     *
     * @param relationId 关联ID
     * @return
     */
    List<GridDTO> listByRelationId(String relationId);

    /**
     * 获取网格列表
     *
     * @param relationIds 关联ID列表
     * @return
     */
    List<GridDTO> listGroupByRelationIds(List<String> relationIds);

    /**
     * 获取全部网格列表
     *
     * @param relationIds
     * @return
     * @throws SearchException
     */
    List<GridDTO> listByRelationIds(List<String> relationIds);

    /**
     * 获取网格分页列表
     *
     * @param relationIds
     * @return
     */
    SuccessResultList<List<GridDTO>> listPageByRelationIds(ListPage page, List<String> relationIds);

    /**
     * 网格列表
     *
     * @param page
     * @return
     */
    SuccessResultList<List<GridDTO>> listPage(ListPage page);

    /**
     * 网格列表
     *
     * @param page
     * @param withRelations 包含关联关系
     * @param withPoints    包含点
     * @return
     */
    SuccessResultList<List<GridDTO>> listPage(ListPage page, boolean withRelations, boolean withPoints);

    /**
     * 网格（排除查询网格）
     *
     * @param gridId 排除的网格ID
     * @param params
     * @return
     */
    List<GridDTO> listExcept(String gridId, Map<String, Object> params);

    /**
     * 网格列表
     *
     * @param areaCode
     * @param params
     * @return
     */
    List<GridDTO> listByAreaCode(String areaCode, Map<String, Object> params);

    /**
     * 网格列表
     *
     * @param areaCode 区域编码
     * @param params
     * @return
     */
    List<GridDTO> listAllByAreaCode(String areaCode, Map<String, Object> params);

    /**
     * 子网格列表
     *
     * @param areaCode 区域编码
     * @param params
     * @return
     */
    List<GridDTO> listSubByAreaCode(String areaCode, Map<String, Object> params);

    /**
     * 网格分页列表
     *
     * @param areaCode
     * @param page
     * @return
     */
    SuccessResultList<List<GridDTO>> listPageByAreaCode(String areaCode, ListPage page);

    /**
     * 关系网格列表
     *
     * @param relationId
     * @return
     */
    List<GridDTO> listWithPointByRelationId(String relationId);

    /**
     * 全部网格（带网格点）列表
     *
     * @param areaCode
     * @param params
     * @return
     */
    List<GridDTO> listAllWithPointByAreaCode(String areaCode, Map<String, Object> params);

    /**
     * 我的网格列表
     *
     * @param token
     * @param params
     * @return
     */
    List<GridDTO> listOfMine(String token, Map<String, Object> params);

    /**
     * 我的网格分页列表
     *
     * @param token
     * @param page
     * @return
     */
    SuccessResultList<List<GridDTO>> listPageOfMine(String token, ListPage page);

    /**
     * 不是我的网格列表
     *
     * @param token
     * @param params
     * @return
     */
    List<GridDTO> listNotMine(String token, Map<String, Object> params);

    /**
     * 不是我的网格分页列表
     *
     * @param token
     * @param page
     * @return
     */
    SuccessResultList<List<GridDTO>> listPageNotMine(String token, ListPage page);
}
