package io.gmss.fiscad.service;

import org.locationtech.jts.geom.GeometryFactory;
import org.locationtech.jts.geom.MultiPolygon;
import org.locationtech.jts.geom.PrecisionModel;
import org.locationtech.jts.io.ParseException;
import org.locationtech.jts.io.WKTReader;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.sql.SQLException;

//
@Service
public class GeometryService {
    @Value("${infocad.geom.srid}")
    private String defaultSrid;

    //    @Autowired
//    private ParcelleService parcelleService;
//    @Autowired
//    private ParcelleGeomRepository parcelleGeomRepository;
//    @Autowired
//    private ParcelleRepository parcelleRepository;
//    @Autowired
//    private AppartenirRepository appartenirRepository;
//
//
//
//
////    public Geometry transform(Geometry source) {
////        try {
////            MathTransform crsTransform = GeotoolsDataStoreUtils.makeCrsTransform("EPSG:27700");
////            if (crsTransform.isTransforming()) {
////                Geometry transformableArea = crsTransform.getTransformableGeometry();
////                if (null != transformableArea && !transformableArea.covers(source)) {
////                    source = source.intersection(transformableArea);
////                }
////                return JTS.transform(source, crsTransform);
////            } else {
////                return source;
////            }
////        } catch (Exception e) { // NOSONAR typically TopologyException, TransformException or FactoryException
////            logEnvelopeSuggestCrsTransformInfo(crsTransform.getId(), source, e);
////            return createEmptyGeometryForClass(source.getClass());
////        }
////    }
//
////    public Geometry getShape(String wtk) throws FactoryException, TransformException {
////        GeometryFactory geometryFactory = new GeometryFactory(new PrecisionModel(), Subject.SRID);
////        WKTReader reader = new WKTReader(geometryFactory);
////        MathTransform crsTransform = GeotoolsDataStoreUtils.makeCrsTransform("EPSG:27700");
////
////        try {
////            LineString line = (LineString) reader.read(wtk);
////            Geometry transformedGeom = JTS.transform(line, crsTransform);
////            return transformedGeom;
////        } catch (ParseException e) {
////            e.printStackTrace();
////         //   log.error("Not a valid geometry");
////            return null;
////        }
////    }
//
    public MultiPolygon toGeometry(String wkt, int srid) throws SQLException {
        if (wkt == null) {
            return null;
        }
        try {
            WKTReader wktReaderSRID = new WKTReader(new GeometryFactory(new PrecisionModel(), srid));


            MultiPolygon multiPolygon = (MultiPolygon) wktReaderSRID.read(String.format("MULTIPOLYGON( ((%s)) )", wkt));

//            GeometryTransformUtils.transform(multiPolygon,srid);
            return multiPolygon;
        } catch (ParseException ex) {
            throw new SQLException(ex);
        }
    }
//
//    public void saveParcelleGeom(Parcelle parcelle){
//        try {
//            MultiPolygon multiPolygon=null;
//            if (parcelle.getCoordonnees() != null){
//                multiPolygon = toGeometry(parcelle.getCoordonnees(), parcelle.getGeomSrid());//Integer.parseInt(defaultSrid));
//            }
//
//            RechercheParcellePayLoad rechercheParcellePayLoad=new RechercheParcellePayLoad();
//            rechercheParcellePayLoad.setEp(parcelle.getEntrePorte());
//            rechercheParcellePayLoad.setI(parcelle.getCodeIlotParcellaire());
//            rechercheParcellePayLoad.setNumTF(parcelle.getNumTitreFonc());
//            rechercheParcellePayLoad.setP(parcelle.getCodeAdressageParcellaire());
//            rechercheParcellePayLoad.setQz(parcelle.getCodeQuartierZoneParcellaire());
//            rechercheParcellePayLoad.setR(parcelle.getRue().getNumero());
//            rechercheParcellePayLoad.setNup(parcelle.getNup());
//            ParcelleGeom parcelleGeom=rechercheParcelleGeom(rechercheParcellePayLoad);
//            parcelleGeom.setParcelle(parcelle);
//            if(parcelleGeom.getId()!=null){
//                if (parcelle.getCoordonnees() != null) {
//                    parcelleGeom.setGeometry(multiPolygon);
//                }
//            }else{
//                if (parcelle.getCoordonnees() != null) {
//                    parcelleGeom.setCodeQuartierZoneParcellaire(parcelle.getCodeQuartierZoneParcellaire());
//                    parcelleGeom.setCodeAdressageParcellaire(parcelle.getCodeAdressageParcellaire());
//                    parcelleGeom.setCodeIlotParcellaire(parcelle.getCodeIlotParcellaire());
//                    parcelleGeom.setEntrePorte(parcelle.getEntrePorte());
//                    parcelleGeom.setNumTitre(parcelle.getNumTitreFonc());
//                    parcelleGeom.setNup(parcelle.getNup());
//                    parcelleGeom.setGeometry(multiPolygon);
//                    if(parcelle.getRue()!=null)
//                        parcelleGeom.setNumRue(parcelle.getRue().getNumero());
//                    parcelleGeom.setVillageQuartier(parcelle.getVillageQuartier());
//                    if(parcelle.getVillageQuartier()!=null)
//                        parcelleGeom.setCommune(parcelle.getVillageQuartier().getArrondissement().getCommune());
//                    //TODO
//                    //parcelleGeom.setLattitudeGeoCentrique(multiPolygon);
//                    //parcelleGeom.setLongitudeGeoCentrique(multiPolygon);
//                }
//            }
//            ///////////MAJ PROPRIETAIRE COURANT//////////////////
//            try {
//                majProprietaireCourant(parcelle);
//            }catch (Exception e){
//
//            }
//            ///////////////////////////////////////////////////////
//
//            parcelleGeomRepository.save(parcelleGeom);
//        } catch (SQLException e) {
//            e.printStackTrace();
//        }
//    }
//
//    public ParcelleGeom saveParcelleGeom(ParcelleGeomPayload parcelleGeomPayload){
//        try {
//            MultiPolygon multiPolygon=toGeometry(parcelleGeomPayload.getCoordonnees(),parcelleGeomPayload.getSrid());//Integer.parseInt(defaultSrid));
//
//            RechercheParcellePayLoad rechercheParcellePayLoad=new RechercheParcellePayLoad();
//            rechercheParcellePayLoad.setEp(parcelleGeomPayload.getEntrePorte());
//            rechercheParcellePayLoad.setI(parcelleGeomPayload.getCodeIlotParcellaire());
//            rechercheParcellePayLoad.setNumTF(parcelleGeomPayload.getNumTitre());
//            rechercheParcellePayLoad.setP(parcelleGeomPayload.getCodeAdressageParcellaire());
//            rechercheParcellePayLoad.setQz(parcelleGeomPayload.getCodeQuartierZoneParcellaire());
//            rechercheParcellePayLoad.setR(parcelleGeomPayload.getNumRue());
//            rechercheParcellePayLoad.setNup(parcelleGeomPayload.getNup());
//
//            ParcelleGeom parcelleGeom=rechercheParcelleGeom(rechercheParcellePayLoad);
//
//            if(parcelleGeom.getId()!=null){
//                parcelleGeom.setGeometry(multiPolygon);
//            }else{
//                parcelleGeom.setCodeQuartierZoneParcellaire(parcelleGeomPayload.getCodeQuartierZoneParcellaire());
//                parcelleGeom.setCodeAdressageParcellaire(parcelleGeomPayload.getCodeAdressageParcellaire());
//                parcelleGeom.setCodeIlotParcellaire(parcelleGeomPayload.getCodeIlotParcellaire());
//                parcelleGeom.setEntrePorte(parcelleGeomPayload.getEntrePorte());
//                parcelleGeom.setNup(parcelleGeomPayload.getNup());
//                parcelleGeom.setNumTitre(parcelleGeomPayload.getNumTitre());
//                parcelleGeom.setNumRue(parcelleGeomPayload.getNumRue());
//                parcelleGeom.setArrondissement_nom(parcelleGeomPayload.getArrondissement_nom());
//                parcelleGeom.setGeometry(multiPolygon);
////                if(parcelleGeomPayload.getRue()!=null)
////                    parcelleGeom.setNumRue(parcelleGeomPayload.getRue().getNumero());
////                parcelleGeom.setVillageQuartier(parcelleGeomPayload.getVillageQuartier());
////                if(parcelleGeomPayload.getVillageQuartier()!=null)
////                    parcelleGeom.setCommune(parcelleGeomPayload.getVillageQuartier().getArrondissement().getCommune());
//
//                //TODO
//                //parcelleGeom.setLattitudeGeoCentrique(multiPolygon);
//                //parcelleGeom.setLongitudeGeoCentrique(multiPolygon);
//            }
//            System.out.println("COORDONNEES : "+multiPolygon.getCoordinates().toString());
//            System.out.println("COORDONNEES : "+multiPolygon.toText());
//
//            return   parcelleGeomRepository.save(parcelleGeom);
////              parcelleGeomRepository.save(parcelleGeom);
//        } catch (SQLException e) {
//            e.printStackTrace();
//            return null;
//        }
//    }
//
//    public ParcelleGeom rechercheParcelleGeom(RechercheParcellePayLoad rechercheParcellePayLoad){
//        ParcelleGeom parcelleGeom=new ParcelleGeom();
//        if(rechercheParcellePayLoad.getQz()!=null && rechercheParcellePayLoad.getI()!=null && rechercheParcellePayLoad.getP()!=null){
//            List<ParcelleGeom> parcelleGeoms=  parcelleGeomRepository.findFirstByCodeQuartierZoneParcellaireAndCodeIlotParcellaireAndCodeAdressageParcellaire(rechercheParcellePayLoad.getQz(),rechercheParcellePayLoad.getI(),rechercheParcellePayLoad.getP());
//            if(!parcelleGeoms.isEmpty()){
//                parcelleGeom= parcelleGeoms.get(0);
//            }
//        }
//
//        if(rechercheParcellePayLoad.getEp()!=null && rechercheParcellePayLoad.getR()!=null){
//            List<ParcelleGeom> parcelleGeoms=  parcelleGeomRepository.findFirstByNumRueAndEntrePorte(rechercheParcellePayLoad.getEp(),rechercheParcellePayLoad.getR());
//            if(!parcelleGeoms.isEmpty()){
//                parcelleGeom= parcelleGeoms.get(0);
//            }
//        }
//
//        if(rechercheParcellePayLoad.getNup()!=null){
//            List<ParcelleGeom> parcelleGeoms=  parcelleGeomRepository.findFirstByNup(rechercheParcellePayLoad.getNup());
//            if(!parcelleGeoms.isEmpty()){
//                parcelleGeom= parcelleGeoms.get(0);
//            }
//        }
//        return parcelleGeom;
//    }
//
//
//    public ParcelleGeom rechercheParcelleGeomParParcelle(Parcelle parcelle){
//        ParcelleGeom parcelleGeom=new ParcelleGeom();
//        RechercheParcellePayLoad rechercheParcellePayLoad=new RechercheParcellePayLoad();
//        rechercheParcellePayLoad.setEp(parcelle.getEntrePorte());
//        rechercheParcellePayLoad.setI(parcelle.getCodeIlotParcellaire());
//        rechercheParcellePayLoad.setNumTF(parcelle.getNumTitreFonc());
//        rechercheParcellePayLoad.setP(parcelle.getCodeAdressageParcellaire());
//        rechercheParcellePayLoad.setQz(parcelle.getCodeQuartierZoneParcellaire());
//        rechercheParcellePayLoad.setR(parcelle.getRue().getNumero());
//        rechercheParcellePayLoad.setNup(parcelle.getNup());
//
//        if(rechercheParcellePayLoad.getQz()!=null && rechercheParcellePayLoad.getI()!=null && rechercheParcellePayLoad.getP()!=null){
//            List<ParcelleGeom> parcelleGeoms=  parcelleGeomRepository.findFirstByCodeQuartierZoneParcellaireAndCodeIlotParcellaireAndCodeAdressageParcellaire(rechercheParcellePayLoad.getQz(),rechercheParcellePayLoad.getI(),rechercheParcellePayLoad.getP());
//            if(!parcelleGeoms.isEmpty()){
//                parcelleGeom= parcelleGeoms.get(0);
//            }
//        }
//
//        if(rechercheParcellePayLoad.getEp()!=null && rechercheParcellePayLoad.getR()!=null){
//            List<ParcelleGeom> parcelleGeoms=  parcelleGeomRepository.findFirstByNumRueAndEntrePorte(rechercheParcellePayLoad.getEp(),rechercheParcellePayLoad.getR());
//            if(!parcelleGeoms.isEmpty()){
//                parcelleGeom= parcelleGeoms.get(0);
//            }
//        }
//
//        if(rechercheParcellePayLoad.getNup()!=null){
//            List<ParcelleGeom> parcelleGeoms=  parcelleGeomRepository.findFirstByNup(rechercheParcellePayLoad.getNup());
//            if(!parcelleGeoms.isEmpty()){
//                parcelleGeom= parcelleGeoms.get(0);
//            }
//        }
//        return parcelleGeom;
//    }
//
//    public void majProprietaireCourant(Parcelle parcelle){
//        ///////////MAJ PROPRIETAIRE COURANT//////////////////
//        try {
//            Appartenir proprietaireCourant=appartenirRepository.getProprietaireCourant(parcelle.getId());
//            if(proprietaireCourant!=null){
//                parcelle.setProprietaireCourant(proprietaireCourant.getContribuable());
//                parcelleRepository.save(parcelle);
//                ParcelleGeom parcelleGeom=rechercheParcelleGeomParParcelle(proprietaireCourant.getParcelle());
//                if(parcelleGeom!=null){
//                    parcelleGeom.setProprietaireCourant(proprietaireCourant.getContribuable());
//                    parcelleGeomRepository.save(parcelleGeom);
//                }
//            }
//        }catch (Exception e){
//
//        }
//        ///////////////////////////////////////////////////////
//    }
//
////    public String listCoordonneesToPolygonString(List<Coordonnees> coordonnees){
////        StringBuilder wkt= new StringBuilder();
////        if(coordonnees==null){
////            return null;
////        }
////        wkt.append(coordonnees.get(0).getXY());
////        coordonnees.forEach(coordonnees1 -> {
////            wkt.append(",").append(coordonnees.get(0).getXY());
////        });
////        return String.format("MULTIPOLYGON( ((%s)) )",wkt.toString());
////    }
//
//
//
//
//
}
