package com.lqkj.link.module.zone.service;

import com.alibaba.fastjson2.JSONObject;
import com.lqkj.link.module.zone.domain.GeomInfo;
import com.lqkj.link.module.zone.domain.LayerInfo;
import com.lqkj.link.module.zone.domain.OneZoneGeomInfos;
import com.lqkj.link.module.zone.domain.ZoneInfo;
import com.lqkj.link.module.zone.repository.GeomInfoRepository;
import com.lqkj.link.module.zone.repository.LayerInfoRepository;
import com.lqkj.link.module.zone.repository.ZoneInfoRepository;
import org.apache.commons.lang3.StringUtils;
import org.locationtech.jts.geom.Coordinate;
import org.locationtech.jts.geom.GeometryFactory;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;
import java.util.List;

@Service
public class GeomInfoService {
    private final GeomInfoRepository geomInfoRepository;
    private final ZoneInfoRepository zoneInfoRepository;
    private final LayerInfoRepository layerInfoRepository;

    public GeomInfoService(GeomInfoRepository geomInfoRepository, ZoneInfoRepository zoneInfoRepository, LayerInfoRepository layerInfoRepository) {
        this.geomInfoRepository = geomInfoRepository;
        this.zoneInfoRepository = zoneInfoRepository;
        this.layerInfoRepository = layerInfoRepository;
    }

    public List<GeomInfo> findAllByZoneId(Integer zoneId) {
        return geomInfoRepository.findAllByZoneId(zoneId);
    }

    @Transactional
    public void saveGeomByZone(OneZoneGeomInfos infos) {
        GeometryFactory geometryFactory = new GeometryFactory();
        // 保存元素
        if (infos.getModifyGeomList() != null && infos.getModifyGeomList().size() > 0) {
            for (GeomInfo geomInfo : infos.getModifyGeomList()) {
                geomInfo.setTrans(geomInfo.getLocation());
                JSONObject pointObject = geomInfo.getLocation().getJSONObject("translation");
                geomInfo.setGeom(geometryFactory.createPoint(new Coordinate(
                        Double.parseDouble(pointObject.get("x").toString()),
                        Double.parseDouble(pointObject.get("y").toString()),
                        Double.parseDouble(pointObject.get("z").toString()))));
                if (StringUtils.isBlank(geomInfo.getLayerId())) {
                    geomInfo.setLayerId(null);
                }
            }
            geomInfoRepository.saveAll(infos.getModifyGeomList());
        }

        // 删除元素
        if (infos.getDeleteGeomList() != null && infos.getDeleteGeomList().size() > 0)
            geomInfoRepository.deleteAllByIdInBatch(infos.getDeleteGeomList());

        // 修改作品的更新时间
        ZoneInfo zoneInfo = zoneInfoRepository.findById(infos.getZoneId()).get();
        zoneInfo.setUpdateTime(new Date());
        zoneInfo.setInitLocation(infos.getTrans());
        zoneInfoRepository.save(zoneInfo);
    }

    @Transactional
    public void saveGeom(OneZoneGeomInfos infos) {
        // 保存图层
        if (infos.getModifyLayerList() != null && infos.getModifyLayerList().size() > 0) {
            for (LayerInfo layerInfo : infos.getModifyLayerList()) {
                layerInfo.setZoneId(infos.getZoneId());
            }
            layerInfoRepository.saveAll(infos.getModifyLayerList());
        }

        // 删除图层
        if (infos.getDeleteLayerList() != null && infos.getDeleteLayerList().size() > 0)
            layerInfoRepository.deleteAllByIdInBatch(infos.getDeleteLayerList());
        saveGeomByZone(infos);
    }

    public List<GeomInfo> getNavigationInfo(Integer zoneId) {
        return geomInfoRepository.getNavigationInfo(zoneId);
    }
}