from __future__ import annotations

import unittest

from amundsen.core.distance_calculator import DistanceCalculator
from amundsen.core.gpx_trimmer import GPXTrimmer
from amundsen.core.models import GPXDocument, Track, TrackPoint, TrackSegment, Waypoint


class GPXTrimmerTest(unittest.TestCase):
    def test_trim_keeps_selected_interval_and_waypoints_inside_it(self) -> None:
        trimmer = GPXTrimmer(DistanceCalculator())
        document = GPXDocument(
            name="Lang",
            tracks=[
                Track(
                    name="Track",
                    segments=[
                        TrackSegment(
                            points=[
                                TrackPoint(46.000, 7.000, 1000),
                                TrackPoint(46.001, 7.000, 1010),
                                TrackPoint(46.002, 7.000, 1020),
                                TrackPoint(46.003, 7.000, 1030),
                                TrackPoint(46.004, 7.000, 1040),
                            ]
                        )
                    ],
                )
            ],
            waypoints=[
                Waypoint(46.000, 7.000, "Start"),
                Waypoint(46.002, 7.000, "Midden"),
                Waypoint(46.004, 7.000, "Einde"),
            ],
        )

        preview = trimmer.build_preview(document)
        trimmed = trimmer.trim(document, "Kort", 0.25, 0.75)

        self.assertEqual(preview["point_count"], 5)
        self.assertEqual([waypoint["name"] for waypoint in preview["waypoints"]], ["Start", "Midden", "Einde"])
        self.assertAlmostEqual(preview["waypoints"][1]["ratio"], 0.5, places=2)
        self.assertEqual(trimmed.name, "Kort")
        self.assertEqual([round(point.lat, 3) for point in trimmed.all_points()], [46.001, 46.002, 46.003])
        self.assertEqual([waypoint.name for waypoint in trimmed.waypoints], ["Midden"])


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