package org.nstart.dep265.requestservice.service

import org.geotools.geometry.jts.JTS
import org.geotools.referencing.CRS
import org.springframework.stereotype.Service

@Service
class CompatGeometryService(
    private val geometryService: GeometryService,
) {
    fun calculateAreaSqKm(wkt: String): Double {
        /** Исходная геометрия берется в WGS84, как и в legacy earth-grid сервисе. */
        val geometry = geometryService.parseGeometry(wkt)

        val sourceCrs = CRS.decode("EPSG:4326")

        /** Проекция World Mollweide используется для стабильного расчета площади. */
        val targetCrs = CRS.decode("EPSG:54009")

        val transform = CRS.findMathTransform(sourceCrs, targetCrs)
        val projectedGeometry = JTS.transform(geometry, transform)
        val areaSqKm = projectedGeometry.area / 1_000_000.0
        return areaSqKm
    }

    fun toGeometryCollection(wkts: Iterable<String>): String {
        /** Ненулевые геометрии фильтруются, чтобы не строить битый WKT. */
        val nonBlankWkts = wkts.filter { wkt -> wkt.isNotBlank() }.toList()
        if (nonBlankWkts.isEmpty()) {
            return ""
        }

        val geometryCollection = buildString {
            append("GEOMETRYCOLLECTION(")
            append(nonBlankWkts.joinToString(","))
            append(")")
        }
        return geometryCollection
    }
}
