package com.project.zcustom.service.service.basics.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.project.zcustom.controller.core.PageParamVo;
import com.project.zcustom.controller.core.StringUtils;
import com.project.zcustom.domain.basics.PlatAppOrg;
import com.project.zcustom.mapper.basics.PlatAppOrgMapper;
import com.project.zcustom.service.service.basics.IPlatAppOrgService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

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

/**
 * 地区编码Service业务层处理
 *
 * @author change
 * @date 2024-10-23
 */
@Service
public class PlatAppOrgServiceImpl extends ServiceImpl<PlatAppOrgMapper, PlatAppOrg> implements IPlatAppOrgService {
    @Autowired
    private PlatAppOrgMapper platAppOrgMapper;

    /**
     * 组装查询条件
     */
    private LambdaQueryWrapper<PlatAppOrg> getLambdaQueryWrapper(PlatAppOrg platAppOrg) {
        LambdaQueryWrapper<PlatAppOrg> lqw = new LambdaQueryWrapper<PlatAppOrg>();
        lqw.select(
                PlatAppOrg::getId,
                PlatAppOrg::getAppOrg,
                PlatAppOrg::getAppParentOrg,
                PlatAppOrg::getAppEncode,
                PlatAppOrg::getAppName,
                PlatAppOrg::getConnectFlag
        );
        if (StringUtils.isNotBlank(platAppOrg.getAppOrg())) {
            lqw.eq(PlatAppOrg::getAppOrg, platAppOrg.getAppOrg());
        }
        if (StringUtils.isNotBlank(platAppOrg.getConnectFlag())) {
            lqw.eq(PlatAppOrg::getConnectFlag, platAppOrg.getConnectFlag());
        }
        if (StringUtils.isNotBlank(platAppOrg.getAppName())) {
            lqw.like(PlatAppOrg::getAppName, platAppOrg.getAppName());
        }
        return lqw;
    }

    /**
     * 分页查询地区编码列表
     *
     * @param platAppOrg 地区编码
     * @return 地区编码集合
     */
    @Override
    public IPage<PlatAppOrg> pagingPlatAppOrgList(PlatAppOrg platAppOrg) {
        IPage<PlatAppOrg> page = new Page<>(platAppOrg.getPageNum(), platAppOrg.getPageSize());
        LambdaQueryWrapper<PlatAppOrg> lqw = getLambdaQueryWrapper(platAppOrg);
        // 排序 默认时间倒序
        lqw.orderByDesc(PlatAppOrg::getCreateTime);
        return baseMapper.selectPage(page, lqw);
    }

    /**
     * 分页查询地区编码列表
     *
     * @param lqw
     * @return 地区编码集合
     */
    @Override
    public IPage<PlatAppOrg> pagingPlatAppOrgList(PageParamVo pageParamVo, LambdaQueryWrapper<PlatAppOrg> lqw) {
        IPage<PlatAppOrg> page = new Page<>(pageParamVo.getPageNum(), pageParamVo.getPageSize());
        // 排序 默认时间倒序
        lqw.orderByDesc(PlatAppOrg::getCreateTime);
        return baseMapper.selectPage(page, lqw);
    }

    /**
     * 查询地区编码列表
     *
     * @param platAppOrg 地区编码
     * @return 地区编码
     */
    @Override
    public List<PlatAppOrg> selectPlatAppOrgList(PlatAppOrg platAppOrg) {
        platAppOrg.setConnectFlag("1");
        LambdaQueryWrapper<PlatAppOrg> lqw = getLambdaQueryWrapper(platAppOrg);
        // 排序 默认时间倒序
        lqw.orderByAsc(PlatAppOrg::getId);
        return baseMapper.selectList(lqw);
    }

    /**
     * 查询地区编码列表
     *
     * @param platAppOrg 地区编码
     * @return 地区编码
     */
    @Override
    public List<PlatAppOrg> selectPlatAppOrgList(PlatAppOrg platAppOrg, Long limitNum) {
        LambdaQueryWrapper<PlatAppOrg> lqw = getLambdaQueryWrapper(platAppOrg);
        // 排序 默认时间倒序
        lqw.orderByDesc(PlatAppOrg::getCreateTime);
        lqw.last("limit " + limitNum);
        return baseMapper.selectList(lqw);
    }

    /**
     * 根据指定字段查询信息
     *
     * @param field      字段名称
     * @param filedValue 字段值
     * @return 地区编码
     */
    @Override
    public PlatAppOrg getPlatAppOrgByField(String field, String filedValue) {
        QueryWrapper<PlatAppOrg> lqw = new QueryWrapper<PlatAppOrg>();
        lqw.eq(field, filedValue);
        lqw.last("limit 1");
        return this.getOne(lqw, false);
    }

    /**
     * 根据指定字段查询信息列表
     *
     * @param field      字段名称
     * @param filedValue 字段值
     * @return 地区编码
     */
    @Override
    public List<PlatAppOrg> selectPlatAppOrgListByField(String field, String filedValue, Long limitNum) {
        QueryWrapper<PlatAppOrg> lqw = new QueryWrapper<PlatAppOrg>();
        lqw.eq(field, filedValue);
        lqw.last("limit " + limitNum);
        return this.list(lqw);
    }

    /**
     * 根据指定字段查询信息列表
     *
     * @param field      字段名称
     * @param filedValue 字段值
     * @return 地区编码
     */
    @Override
    public List<PlatAppOrg> selectPlatAppOrgListByField(String field, String filedValue) {
        QueryWrapper<PlatAppOrg> lqw = new QueryWrapper<PlatAppOrg>();
        lqw.eq(field, filedValue);
        return this.list(lqw);
    }

    /**
     * 判断指定字段值是否存在
     *
     * @param field      字段名称
     * @param filedValue 字段值
     */
    @Override
    public void checkFieldExist(String field, String filedValue, String tips, Long id) {
        QueryWrapper<PlatAppOrg> lqw = new QueryWrapper<PlatAppOrg>();
        lqw.eq(field, filedValue);
        lqw.ne("id", id);
        if (this.getOne(lqw, false) != null) {
            throw new RuntimeException(tips + "已存在");
        }
    }

    @Override
    public PlatAppOrg selectPlatAppOrgListTree(PlatAppOrg platAppOrg) {
        LambdaQueryWrapper<PlatAppOrg> lqw = getLambdaQueryWrapper(platAppOrg);
        // 排序 默认时间倒序
        lqw.orderByAsc(PlatAppOrg::getId);
        List<PlatAppOrg> list = baseMapper.selectList(lqw);
        PlatAppOrg platAppOrgEx = new PlatAppOrg();

        int i = 0;
        for (PlatAppOrg appOrg : list){
            if (appOrg.getAppOrg().equals("10001")){
                platAppOrgEx = appOrg;
                break;
            }
            i++;
        }
        list.remove(i);

        digui(platAppOrgEx, list);


        return platAppOrgEx;
    }

    private void digui(PlatAppOrg platAppOrg, List<PlatAppOrg> list){
        List<PlatAppOrg> listEx = new ArrayList<>();
        for (PlatAppOrg appOrg : list){
            if (appOrg.getAppParentOrg().equals(platAppOrg.getAppOrg())){
                listEx.add(appOrg);
            }
        }

        if (listEx.size() > 0){
            platAppOrg.setChildren(listEx);
            for (int i = 0;i < listEx.size(); i++){
                digui(platAppOrg.getChildren().get(i), list);
            }
        }

    }

    public List<PlatAppOrg> getProjectCameraNumList(String appOrg){
        return platAppOrgMapper.getProjectCameraNumList(appOrg);
    }

    public int getConnectUnitNum(){
        return platAppOrgMapper.getConnectUnitNum();
    }

    public List<PlatAppOrg> getAllCameraCondition(){
        return platAppOrgMapper.getAllCameraCondition();
    }

    public PlatAppOrg getCameraConditionByAppOrg(String appOrg){
        return platAppOrgMapper.getCameraConditionByAppOrg(appOrg);
    }

    @Override
    public List<PlatAppOrg> selectAppCodeList() {
        LambdaQueryWrapper<PlatAppOrg> lqw = new LambdaQueryWrapper<PlatAppOrg>();
        lqw.select(
                PlatAppOrg::getId,
                PlatAppOrg::getAppCode,
                PlatAppOrg::getAppName
        );
        lqw.isNotNull(PlatAppOrg::getAppCode);
        return this.list(lqw);
    }
}
