package com.ruoyi.benyun.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.ruoyi.benyun.mapper.WdInfoDao;
import com.ruoyi.benyun.service.TopologicalEnterpriseWdService;
import com.ruoyi.benyun.entity.TopologicalEnterpriseWd;
import com.ruoyi.benyun.entity.WdInfo;
import com.ruoyi.benyun.entity.vo.TopologicalWdAceeptVo;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.ruoyi.benyun.utils.InitMapUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.data.geo.Circle;
import org.springframework.data.geo.Distance;
import org.springframework.data.geo.GeoResults;
import org.springframework.data.geo.Point;
import org.springframework.data.redis.connection.RedisGeoCommands;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

@Service
public class TopologicalEnterpriseWdServiceImpl implements TopologicalEnterpriseWdService {

    @Autowired
    WdInfoDao wdInfoDao;

    @Autowired
    InitMapUtil initMapUtil;

    @Autowired
    RedisTemplate redisTemplate;

    @Override
    public List<TopologicalEnterpriseWd> list(TopologicalWdAceeptVo topologicalWdAceeptVo) {
        //1.根据中心网点Id找到网点详细信息
        QueryWrapper<WdInfo> queryWrapper1 = new QueryWrapper<>();
        queryWrapper1.eq("wd_id",topologicalWdAceeptVo.getCenterWdId());
        WdInfo wdInfo1 = wdInfoDao.selectOne(queryWrapper1);

        //2.根据中心网点找到周边网点Id
        // 以经纬度为中心，获取半径不超过最大距离的所有元素
        Point point = new Point(wdInfo1.getLng().doubleValue(),wdInfo1.getLat().doubleValue());
        //半径范围
        Distance distance = new Distance(topologicalWdAceeptVo.getRadius(), RedisGeoCommands.DistanceUnit.METERS);
        //圆
        Circle circle = new Circle(point, distance);
        RedisGeoCommands.GeoRadiusCommandArgs geoRadiusCommandArgs = RedisGeoCommands.GeoRadiusCommandArgs.newGeoRadiusArgs();
        geoRadiusCommandArgs.includeDistance();
        GeoResults<RedisGeoCommands.GeoLocation<Object>> radius = redisTemplate.boundGeoOps(wdInfo1.getAddrCode().substring(0, 4)).radius(circle,geoRadiusCommandArgs);
        //周边网点Id
        List<String> aroundWdId = new ArrayList<>();
        HashMap<String,Double> hashMap = new HashMap<>();
        radius.getContent().stream().forEach(item -> {
            //记录网点坐标及距离
            aroundWdId.add((String) item.getContent().getName());
            hashMap.put((String) item.getContent().getName(), item.getDistance().getValue());
        });


        //4.分页查找网点信息
        QueryWrapper<WdInfo> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("wd_type_code","5")
            .and(wdInfoQueryWrapper -> {
                wdInfoQueryWrapper.in("wd_id", aroundWdId);
            });

        //5.查询周边网点结果
        PageHelper.startPage(1, topologicalWdAceeptVo.getSize());
        List<WdInfo> wdInfos = wdInfoDao.selectList(queryWrapper);
        PageInfo<WdInfo> pageInfo = new PageInfo<>(wdInfos);


        //6.组装结果集
        List<TopologicalEnterpriseWd> list = new ArrayList<>();  //返回结果集
        for (WdInfo wdInfo : pageInfo.getList()) {
            TopologicalEnterpriseWd topologicalEnterpriseWd = new TopologicalEnterpriseWd(wdInfo);
            topologicalEnterpriseWd.setAddrCodeInfo(initMapUtil.getInitAddrCodeMap(topologicalEnterpriseWd.getAddrCode()));
            BigDecimal bigDecimal = new BigDecimal(hashMap.get(wdInfo.getWdId()));
            topologicalEnterpriseWd.setDistance(bigDecimal.setScale(2,BigDecimal.ROUND_HALF_UP).doubleValue());
            list.add(topologicalEnterpriseWd);
        }

        return list;
    }
}
