package com.ruoyi.hezhi.service.impl;

import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.hezhi.domain.TbRegion;
import com.ruoyi.hezhi.mapper.TbRegionMapper;
import com.ruoyi.hezhi.service.ITbRegionService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

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

/**
 * 行政区域Service业务层处理
 *
 * @author ruoyi
 * @date 2024-10-21
 */
@Service
public class TbRegionServiceImpl implements ITbRegionService
{
    @Autowired
    private TbRegionMapper tbRegionMapper;

    /**
     * 查询行政区域
     *
     * @param id 行政区域主键
     * @return 行政区域
     */
    @Override
    public TbRegion selectTbRegionById(Long id)
    {
        return tbRegionMapper.selectTbRegionById(id);
    }

    /**
     * 查询行政区域列表
     *
     * @param tbRegion 行政区域
     * @return 行政区域
     */
    @Override
    public List<TbRegion> selectTbRegionList(TbRegion tbRegion)
    {
        return tbRegionMapper.selectTbRegionList(tbRegion);
    }

    /**
     * 查询行政区域列表
     *
     * @param tbRegion 行政区域
     * @return 行政区域集合
     */
    @Override
    public List<TbRegion> selectTbRegionTreeList(TbRegion tbRegion) {
        // 1. 查询所有省份
        List<TbRegion> provinces = tbRegionMapper.findByType(1);

        // 2. 为每个省份查询城市
        for (TbRegion province : provinces) {
            List<TbRegion> cities = tbRegionMapper.findByPid(province.getId());

            // 3. 为每个城市查询区县
            for (TbRegion city : cities) {
                List<TbRegion> districts = tbRegionMapper.findByPid(city.getId());
                city.setChildren(districts);
            }
            province.setChildren(cities);
        }

        return provinces;
    }

    /**
     * 新增行政区域
     *
     * @param tbRegion 行政区域
     * @return 结果
     */
    @Override
    public int insertTbRegion(TbRegion tbRegion)
    {
        tbRegion.setCreateTime(DateUtils.getNowDate());
        return tbRegionMapper.insertTbRegion(tbRegion);
    }

    /**
     * 修改行政区域
     *
     * @param tbRegion 行政区域
     * @return 结果
     */
    @Override
    public int updateTbRegion(TbRegion tbRegion)
    {
        tbRegion.setUpdateTime(DateUtils.getNowDate());
        return tbRegionMapper.updateTbRegion(tbRegion);
    }

    /**
     * 批量删除行政区域
     *
     * @param ids 需要删除的行政区域主键
     * @return 结果
     */
    @Override
    public int deleteTbRegionByIds(Long[] ids)
    {
        return tbRegionMapper.deleteTbRegionByIds(ids);
    }

    /**
     * 删除行政区域信息
     *
     * @param id 行政区域主键
     * @return 结果
     */
    @Override
    public int deleteTbRegionById(Long id)
    {
        return tbRegionMapper.deleteTbRegionById(id);
    }

    /**
     * 查询行政区域列表
     *
     * @param params 参数
     * @return 行政区域集合
     */
    @Override
    public List<TbRegion> getRegionList(Map<String, Object> params) {
        return tbRegionMapper.getRegionList(params);
    }

    /**
     * 行政区域树列表
     *
     * @return 行政区域树列表
     */
    @Override
    public List<TbRegion> selectTbRegionTreeList() {
        TbRegion tbRegion = new TbRegion();
        tbRegion.setDelFlag(0);
        List<TbRegion> list = tbRegionMapper.selectTbRegionList(tbRegion);
        return this.toTree(list, 0L);
    }

    /**
     * 方式一：使用两层循环实现
     * @param treeList
     * @return
     */
    @Override
    public List<TbRegion> toTree(List<TbRegion> treeList, Long pid) {
        List<TbRegion> retList = new ArrayList<TbRegion>();
        for (TbRegion parent : treeList) {
            if (pid.equals(parent.getPid())) {
                retList.add(parent);
            }
            for (TbRegion childOne : treeList) {
                if (childOne.getPid().equals(parent.getId())) {
                    if (parent.getChildrenList() == null) {
                        parent.setChildrenList(new ArrayList<TbRegion>());
                    }
                    parent.getChildrenList().add(childOne);
                }
            }
        }
        return retList;
    }

    /**
     * 查询行政区域列表省
     *
     * @return 行政区域集合
     */
    @Override
    public List<TbRegion> selectRegionProvinceList() {
        return tbRegionMapper.selectRegionProvinceList();
    }

    /**
     * 查询行政区域列表省
     *
     * @return 行政区域集合
     */
    @Override
    public List<TbRegion> selectRegionCityOrAreaList(Integer id) {
        return tbRegionMapper.selectRegionCityOrAreaList(id);
    }
}
