from __future__ import annotations

import unittest

from amundsen.core.distance_calculator import DistanceCalculator
from amundsen.core.gpx_simplifier import GPXSimplifier
from amundsen.core.models import GPXDocument, Track, TrackPoint, TrackSegment, Waypoint


class GPXSimplifierTest(unittest.TestCase):
    def test_simplify_reduces_points_but_keeps_route_ends(self) -> None:
        simplifier = GPXSimplifier(DistanceCalculator())
        document = GPXDocument(
            name="Lang",
            tracks=[
                Track(
                    name="Track",
                    segments=[
                        TrackSegment(
                            points=[
                                TrackPoint(46.0000, 7.0000, 1000),
                                TrackPoint(46.0005, 7.0001, 1002),
                                TrackPoint(46.0010, 7.0000, 1004),
                                TrackPoint(46.0015, 7.0001, 1006),
                                TrackPoint(46.0020, 7.0000, 1008),
                                TrackPoint(46.0025, 7.0001, 1010),
                                TrackPoint(46.0030, 7.0000, 1012),
                            ]
                        )
                    ],
                )
            ],
            waypoints=[Waypoint(46.0010, 7.0000, "Rustpunt", 1004)],
        )

        preview = simplifier.build_preview(document, 20)
        simplified = simplifier.simplify(document, "Klein", 20)
        points = simplified.all_points()

        self.assertEqual(simplified.name, "Klein")
        self.assertLess(len(points), len(document.all_points()))
        self.assertEqual(points[0].lat, document.all_points()[0].lat)
        self.assertEqual(points[-1].lat, document.all_points()[-1].lat)
        self.assertEqual(preview["original_point_count"], 7)
        self.assertLess(preview["simplified_point_count"], preview["original_point_count"])
        self.assertEqual(preview["waypoints"][0]["name"], "Rustpunt")
        self.assertEqual(simplified.waypoints[0].name, "Rustpunt")


if __name__ == "__main__":
    unittest.main()
