package org.vaadin.example;

import org.locationtech.jts.geom.GeometryFactory;
import org.locationtech.jts.geom.LineString;
import org.locationtech.jts.geom.Point;
import org.locationtech.jts.geom.Polygon;
import org.locationtech.jts.geom.PrecisionModel;
import org.locationtech.jts.io.ParseException;
import org.locationtech.jts.io.WKTReader;
import org.springframework.stereotype.Service;

import java.time.LocalDate;
import java.util.List;

@Service
public class SportEventService {

    private final SportEventRepository repo;

    public SportEventService(SportEventRepository repository) {
        this.repo = repository;
    }

    public void ensureTestData() {
        if (repo.count() == 0) {
            GeometryFactory factory = new GeometryFactory();

            WKTReader wktReader = new WKTReader(new GeometryFactory(new PrecisionModel(), 4326));

            try {
                SportEvent theEvent = new SportEvent();
                theEvent.setTitle("Lutakon kierros");
                theEvent.setDate(LocalDate.now());
                theEvent.setLocation((Point) wktReader.read("POINT (25.77554278820253 62.2272018311204)"));
                theEvent.setRoute((LineString) wktReader.read("LINESTRING (25.77554278820253 62.2272018311204, 25.779524086129754 62.22702791012401, 25.787113435301052 62.22627424088853, 25.800301484682706 62.22586841119525, 25.802540964765228 62.2265061411197, 25.813587285546873 62.23417854401356, 25.816200012311214 62.23904679898311, 25.816448843431488 62.240843218395554, 25.80587352081554 62.24101705975687, 25.79380521148309 62.24345073358492, 25.788330926834163 62.24374044357751, 25.779497422061553 62.248201625968164, 25.77277898180992 62.251503634515785, 25.76394547703589 62.249070610653376, 25.754987556701792 62.244319855211785, 25.753743401100365 62.24240775456448, 25.749388856494107 62.23927860104487, 25.760710672470935 62.23632299124034, 25.76842443720369 62.231686157027355, 25.771270557328904 62.229011191767825, 25.77500302413449 62.227387987489095)"));
                repo.save(theEvent);

                SportEvent eventWithPath = new SportEvent();
                eventWithPath.setRoute((LineString) wktReader.read("LINESTRING (22.69504539358053 60.41742475722279, 22.697454647646992 60.41690574465318, 22.698768786227845 60.41649485382865, 22.700389557144803 60.41675436442708, 22.701046626435698 60.41671111280451, 22.702273155778926 60.415456790730445, 22.70354348974095 60.41446194917475, 22.70823058401524 60.41346707719282, 22.708537216350322 60.41281823124683, 22.710026573409664 60.41203959902907, 22.711121688894224 60.41048227868464, 22.71291767828862 60.41095813447669, 22.71414420763176 60.41193145419163, 22.715589760071282 60.411888196155985, 22.71686009403328 60.412104485759016, 22.71830564647621 60.41266683200189, 22.717604772566403 60.413164284033, 22.715940197029653 60.41283985965799, 22.713881379918092 60.412147743511554, 22.708975262547455 60.41126094817949, 22.70849341173391 60.411087912125595, 22.708186779398915 60.41242891747186, 22.708756239451105 60.412904744791774, 22.710289401129273 60.41299125810218, 22.71195397666608 60.413553589012, 22.70595274380986 60.41454845834818, 22.70595274380986 60.41521889660916, 22.70463860522895 60.41640834984031, 22.703806317460618 60.41710037534173, 22.701440868013975 60.417338255707534, 22.70043336176809 60.41720850299629, 22.69949230755762 60.417445646906515, 22.698791433647784 60.41798627584606, 22.697915341259574 60.41869989228667, 22.696075547246295 60.41872151678288, 22.694410971709488 60.418462021879435, 22.694104339373496 60.4180727756424, 22.694104339373496 60.41764027436014, 22.695155650239172 60.417424021562056)"));
                eventWithPath.setLocation((Point) wktReader.read("POINT (22.694516300414023 60.4174531804353)"));
                eventWithPath.setDate(LocalDate.now());
                eventWithPath.setTitle("MTB cup 1/10");
                repo.save(eventWithPath);

            } catch (ParseException e) {
                throw new RuntimeException(e);
            }
        }

    }

    public void save(SportEvent sportevent) {
        repo.save(sportevent);
    }

    public void delete(SportEvent event) {
        repo.deleteById(event.getId());
    }

    public List<SportEvent> filterByTitle(String value) {
        return repo.findByTitleContainingIgnoreCase(value);
    }

    public List<SportEvent> filterByBounds(Polygon bounds) {
        return repo.findAllWithin(bounds);
    }
}
