# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.

from shapely.geometry import Polygon
from shapely.wkt import loads
from tests.test_base import TestBase

from sedona.spark.utils.geometry_adapter import GeometryAdapter


class TestDirectSerialization(TestBase):

    def test_polygon(self):
        polygon = Polygon([(0, 0), (0, 1), (1, 1), (1, 0), (0, 0)])
        jvm_geom = GeometryAdapter.create_jvm_geometry_from_base_geometry(
            self.sc._jvm, polygon
        )

        assert jvm_geom.toString() == "POLYGON ((0 0, 0 1, 1 1, 1 0, 0 0))"

        ext = [(0, 0), (0, 2), (2, 2), (2, 0), (0, 0)]
        int = [(1, 1), (1, 1.5), (1.5, 1.5), (1.5, 1), (1, 1)]

        polygon = Polygon(ext, [int])
        jvm_geom = GeometryAdapter.create_jvm_geometry_from_base_geometry(
            self.sc._jvm, polygon
        )

        assert (
            jvm_geom.toString()
            == "POLYGON ((0 0, 0 2, 2 2, 2 0, 0 0), (1 1, 1 1.5, 1.5 1.5, 1.5 1, 1 1))"
        )

        wkt = "POLYGON ((-71.1776585052917 42.3902909739571, -71.1776820268866 42.3903701743239, -71.1776063012595 42.3903825660754, -71.1775826583081 42.3903033653531, -71.1776585052917 42.3902909739571))"
        polygon = loads(wkt)
        jvm_geom = GeometryAdapter.create_jvm_geometry_from_base_geometry(
            self.sc._jvm, polygon
        )

        assert jvm_geom.toString() == wkt

    def test_point(self):
        wkt = "POINT (-71.064544 42.28787)"
        point = loads(wkt)
        jvm_geom = GeometryAdapter.create_jvm_geometry_from_base_geometry(
            self.sc._jvm, point
        )
        assert jvm_geom.toString() == wkt

    def test_linestring(self):
        wkt = "LINESTRING (-71.160281 42.258729, -71.160837 42.259113, -71.161144 42.25932)"
        linestring = loads(wkt)
        jvm_geom = GeometryAdapter.create_jvm_geometry_from_base_geometry(
            self.sc._jvm, linestring
        )
        assert jvm_geom.toString() == wkt
