from __future__ import annotations

import unittest

from config import CONFIG
from amundsen.core.report_normalizer import ReportNormalizer


class ReportNormalizerTest(unittest.TestCase):
    def test_service_payload_is_translated_to_frontend_report_shape(self) -> None:
        payload = {
            "name": "Service route",
            "summary": {
                "distance_km": 0.2,
                "distance_m": 200,
                "ascent_m": 18,
                "descent_m": 6,
                "estimated_minutes": 8.4,
                "point_count": 3,
            },
            "route": [
                {"lat": 46.0, "lon": 7.0, "ele": 1000, "distance_m": 0},
                {"lat": 46.0009, "lon": 7.0, "ele": 1018, "distance_m": 100},
                {"lat": 46.0018, "lon": 7.0, "ele": 1012, "distance_m": 200},
            ],
            "route_segments": [
                {"index": 1, "distance_m": 100, "cumulative_distance_m": 100, "slope_percent": 18},
                {"index": 2, "distance_m": 100, "cumulative_distance_m": 200, "slope_percent": -6},
            ],
            "elevation_profile": [
                {"distance_m": 0, "ele": 1000},
                {"distance_m": 100, "ele": 1018},
                {"distance_m": 200, "ele": 1012},
            ],
            "slope_classes": [{"class": "afdaling", "segment_count": 1}],
            "waypoints": [{"lat": 46.0, "lon": 7.0, "name": "Start", "ele": 1000}],
            "waypoint_legs": [],
        }

        report = ReportNormalizer(CONFIG).normalize(payload)

        self.assertEqual(report["summary"]["walking_time"], "8 minuten")
        self.assertEqual(report["summary"]["min_elevation_m"], 1000)
        self.assertEqual(report["summary"]["max_elevation_m"], 1018)
        self.assertEqual(report["route"][0], [46.0, 7.0])
        self.assertEqual(report["elevation_profile"][0], {"distance_km": 0.0, "elevation_m": 1000.0})
        self.assertEqual(report["route_segments"][0]["points"], [[46.0, 7.0], [46.0009, 7.0]])
        self.assertEqual(report["route_segments"][0]["color"], "#ff9540")
        self.assertEqual(report["route_segments"][0]["distance_from_start_km"], 0.1)
        self.assertIn("walking_time_from_start", report["route_segments"][0])
        self.assertEqual(report["slope_classes"][0]["label"], "0-5%")
        self.assertEqual(len(report["route_views"]), 1)
        self.assertIn("forward", report["route_directions"])
        self.assertIn("reverse", report["route_directions"])
        self.assertGreater(len(report["elevation_time_profile"]), 0)


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