from __future__ import annotations

from pathlib import Path
import os
import unittest

from ap1_m1_background_multiscale_preflight import (
    DiagnosticConfig,
    build_report,
    load_seed,
)


ROOT = Path(os.environ["APEIRON_AP1_ROOT"])
CODE = ROOT / "AP1/CODE/ap1_m1_background_multiscale_preflight.py"


class AP1M1BackgroundMultiscalePreflightTests(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
        cls.seed_report, cls.arrays, cls.authorities = load_seed(ROOT)
        cls.report = build_report(ROOT, CODE, DiagnosticConfig())

    def test_seed_authority_and_all_array_hashes_are_exact(self):
        self.assertEqual(len(self.authorities), 7)
        self.assertEqual(
            set(self.arrays), set(self.seed_report["array_sha256"])
        )

    def test_exact_physical_span_ends_at_present_anchor(self):
        diagnostic = self.report["diagnostic"]
        self.assertEqual(diagnostic["N_seed_physical"], -56.97244594022879)
        self.assertTrue(diagnostic["present_anchor_reached_as_grid_endpoint_only"])

    def test_preflight_passes_only_at_architecture_scope(self):
        self.assertTrue(self.report["all_preflight_gates_pass"])
        self.assertTrue(all(self.report["gates"].values()))
        self.assertEqual(
            self.report["classification"],
            "M1_BACKGROUND_MULTISCALE_ARCHITECTURE_PREFLIGHT_PASS_NO_CANDIDATE",
        )

    def test_unscaled_tachyonic_path_exceeds_float64_log_range(self):
        diagnostic = self.report["diagnostic"]
        self.assertGreater(
            diagnostic["tachyonic_zero_mode_growth_exponent"],
            diagnostic["float64_log_max"],
        )

    def test_legacy_fixed_comoving_tail_split_rejects(self):
        diagnostic = self.report["diagnostic"]
        self.assertTrue(diagnostic["legacy_fixed_comoving_tail_split_rejected"])
        self.assertIn("omega2 <= 0", diagnostic["legacy_tail_rejection"])

    def test_required_architecture_is_complete(self):
        self.assertEqual(len(self.report["required_architecture"]), 7)
        self.assertTrue(all(self.report["required_architecture"].values()))

    def test_no_candidate_tolerance_seed_or_kernel_release(self):
        self.assertEqual(self.report["new_AP1_M1_background_runs"], 0)
        self.assertFalse(self.report["background_candidate_assessed"])
        self.assertFalse(self.report["background_tolerances_frozen"])
        self.assertFalse(self.report["physical_response_kernel_started"])
        self.assertFalse(self.report["seed_released"])

    def test_forbidden_legacy_execution_paths_are_not_imported(self):
        source = CODE.read_text(encoding="utf-8")
        self.assertNotIn("frw_pv_uv_yoshida_v6_31", source)
        self.assertNotIn("physical_map", source.lower())


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