package com.xinyilu.system.service.systemarea.impl;

import com.xinyilu.common.core.domain.AjaxResult;
import com.xinyilu.common.utils.DateUtils;
import com.xinyilu.system.domain.systemarea.SysArea;
import com.xinyilu.system.mapper.systemarea.SysAreaMapper;
import com.xinyilu.system.service.systemarea.ISysAreaService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;
import java.util.Objects;

/**
 * 区域管理Service业务层处理
 *
 * @author jihan
 * @date 2022-07-27
 */
@Service
public class SysAreaServiceImpl implements ISysAreaService {

    @Resource
    private SysAreaMapper sysAreaMapper;

    /**
     * 查询区域管理
     *
     * @param id 区域管理主键
     * @return 区域管理
     */
    @Override
    public SysArea selectSysAreaById(Long id) {
        return sysAreaMapper.selectSysAreaById(id);
    }

    /**
     * 查询区域管理列表
     *
     * @param sysArea 区域管理
     * @return 区域管理
     */
    @Override
    public List<SysArea> selectSysAreaList(SysArea sysArea) {
        return sysAreaMapper.selectSysAreaList(sysArea);
    }

    /**
     * 新增区域管理
     *
     * @param sysArea 区域管理
     * @return 结果
     */
    @Override
    public AjaxResult insertSysArea(SysArea sysArea) {
        //判断当前区域是否已经存在
        int count = sysAreaMapper.getSysAreaByCodeAndName(StringUtils.isBlank(sysArea.getCode()) ? "" : sysArea.getCode());
        if (count > 0) {
            return AjaxResult.error("新增区域编号为'" + sysArea.getCode() + "'的失败，该区域编号已存在");
        }
        //如果父级id位空，说明为一级节点，节点的值为0
        if (Objects.isNull(sysArea.getParentId())) {
            sysArea.setParentId(0L);
        } else {
            sysArea.setParentId(sysArea.getParentId());
        }
        //创建时间
        sysArea.setCreateTime(DateUtils.getNowDate());
        //是否删除
        sysArea.setDelFlag(0);
        //新增区域信息
        int insertCount = sysAreaMapper.insertSysArea(sysArea);
        if (insertCount < 0) {
            return AjaxResult.error("新增区域信息失败");
        }
        return AjaxResult.success();
    }

    /**
     * 修改区域管理
     *
     * @param sysArea 区域管理
     * @return 结果
     */
    @Override
    public AjaxResult updateSysArea(SysArea sysArea) {
        //查询当前区域信息是否存在
        SysArea sysAreaInfo = sysAreaMapper.selectSysAreaById(sysArea.getId());
        if (Objects.isNull(sysAreaInfo)) {
            return AjaxResult.error("当前区域信息不存在");
        }
        if (!sysArea.getCode().equals(sysAreaInfo.getCode())) {
            int count = sysAreaMapper.getSysAreaByCodeAndName(StringUtils.isBlank(sysArea.getCode()) ? "" : sysArea.getCode());
            if (count > 0) {
                return AjaxResult.error("新增区域编号为'" + sysArea.getCode() + "'的失败，该区域编号已存在");
            }
        }
        //如果父级id位空，说明为一级节点，节点的值为0
        if (Objects.isNull(sysArea.getParentId())) {
            sysArea.setParentId(0L);
        } else {
            sysArea.setParentId(sysArea.getParentId());
        }
        //修改时间
        sysArea.setUpdateTime(DateUtils.getNowDate());
        //是否删除
        sysArea.setDelFlag(0);
        sysAreaMapper.updateSysArea(sysArea);
        return AjaxResult.success();
    }

    /**
     * 批量删除区域管理
     *
     * @param ids 需要删除的区域管理主键
     * @return 结果
     */
    @Override
    public int deleteSysAreaByIds(Long[] ids) {
        return sysAreaMapper.deleteSysAreaByIds(ids);
    }

    /**
     * 查询省市区域管理列表
     *
     * @param sysArea 区域管理
     * @return 区域管理集合
     */
    @Override
    public List<SysArea> getCityAreaInfoList(SysArea sysArea) {
        //查询省市
        sysArea.setParentId(0L);
        return sysAreaMapper.getCityAreaInfoList(sysArea);
    }

    /**
     * 查询省级区域信息信息
     *
     * @return 省级区域信息集合
     */
    @Override
    public AjaxResult getProvinceAreaInfo() {
        SysArea area = new SysArea();
        area.setLevel(1);
        return AjaxResult.success(sysAreaMapper.selectSysAreaList(area));
    }

    /**
     * 根据父id查询其下属区域信息
     *
     * @param id 父级区域id
     * @return 下属区域信息集合
     */
    @Override
    public AjaxResult getSubordinateAreaInfo(Long id) {
        SysArea area = new SysArea();
        area.setParentId(id);
        return AjaxResult.success(sysAreaMapper.selectSysAreaList(area));
    }
}
