package org.nstart.dep265.requestservice.service

import org.locationtech.jts.geom.MultiPolygon
import org.locationtech.jts.geom.Polygon
import org.nstart.dep265.requestservice.dto.RouteDto
import org.springframework.stereotype.Service

@Service
class RequestValidationService(
    private val geometryService: GeometryService,
) {
    private val maxAllowedRollAngle: Double = 90.0

    fun validate(route: RouteDto) {
        require(route.intervalBegin.isBefore(route.intervalEnd)) {
            "Начало интервала маршрута должно быть раньше окончания"
        }
        require(route.rollAngle.min >= 0.0) {
            "Минимальный крен маршрута не может быть отрицательным"
        }
        require(route.rollAngle.max <= maxAllowedRollAngle) {
            "Максимальный крен маршрута должен быть в диапазоне от 0 до $maxAllowedRollAngle градусов"
        }
        require(route.rollAngle.min <= route.rollAngle.max) {
            "Диапазон крена маршрута задан некорректно"
        }

        val routeGeometry = geometryService.parsePolygonalGeometry(route.geometry)
        require(routeGeometry is Polygon || routeGeometry is MultiPolygon) {
            "Геометрия маршрута должна быть POLYGON или MULTIPOLYGON в формате WKT"
        }
        require(routeGeometry.area > 0.0) {
            "Геометрия маршрута должна иметь положительную площадь"
        }
    }
}
