package com.ruoyi.project.business.service;

import cn.hutool.core.lang.tree.Tree;
import com.ruoyi.project.business.domain.TbArea;
import com.ruoyi.project.business.domain.vo.country.AreaWithCountriesVo;
import com.ruoyi.project.business.domain.vo.selectParam.AreaParam;
import java.util.List;
import java.util.Map;

/**
 * 区域Service接口
 * 
 * @author ruoyi
 * @date 2024-04-15
 */
public interface ITbAreaService 
{
    /**
     * 查询区域
     * 
     * @param areaId 区域主键
     * @return 区域
     */
    public TbArea selectTbAreaByAreaId(Long areaId);

    /**
     * 查询区域列表
     * 
     * @param tbArea 区域
     * @return 区域集合
     */
    public List<TbArea> selectTbAreaList(AreaParam tbArea);
    
    List<AreaWithCountriesVo> selectTbAreaWithCountriesList(TbArea tbArea);
    
    

    /**
     * 查询区域列表（导出用）
     *
     * @param tbArea 区域
     * @return 区域集合
     */
    public List<TbArea> selectTbAreaListExport(AreaParam tbArea);

    /**
     * 新增区域
     * 
     * @param tbArea 区域
     * @return 结果
     */
    public int insertTbArea(TbArea tbArea);

    /**
     * 修改区域
     * 
     * @param tbArea 区域
     * @return 结果
     */
    public int updateTbArea(TbArea tbArea);

    /**
     * 批量删除区域
     * 
     * @param areaIds 需要删除的区域主键集合
     * @return 结果
     */
    public int deleteTbAreaByAreaIds(Long[] areaIds);

    /**
     * 删除区域信息
     * 
     * @param areaId 区域主键
     * @return 结果
     */
    public int deleteTbAreaByAreaId(Long areaId);

    /**
     * 获取所有区域列表
     * @return 结果
     */
    List<TbArea> getAllAreaList();

    /**
     * 根据区域等级获取区域列表
     * @return 结果
     */
    List<TbArea> getAreaListByLevel(String level);
    
    /**
     * 获取所有区域列表
     * @return 结果
     */
    List<Tree<Long>> getAllAreaTree();

    /**
     * 根据登录用户获取区域树
     * @return 结果
     */
    List<Tree<Long>> getAreaTreeByUser();

    List<TbArea> getAreaListByCountryId(Long countryId);

    List<TbArea> selectAreaListByIds(List<Long> areaIds);

    /**
     * 查询指定区域的所有子区域
     * 
     * @param areaIds 区域ID
     * @param justSubs 是否只查询直接子区域
     * @param includeSelf 是否包含自己
     */
    List<TbArea> selectChildAreaList(List<Long> areaIds, boolean justSubs, boolean includeSelf);

    /**
     * 根据区域id获取自己及所有下属区域id
     */
    List<Long> selectChildAreaIdsByAreaIds(List<Long> areaId);


    List<Long> selectDeepOneAreaList(List<Long> areaIds);

    /**
     * 所有区域 map 带缓存
     */
    Map<Long, TbArea> allAreaMap();

    List<TbArea> getAreaByUser();
}
