import json
from pathlib import Path
import sys
import tempfile
import unittest

sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
from fleet_cycle import report


class FleetCycleEvidenceTests(unittest.TestCase):
    def test_assignments_empty_returns_and_old_pickups_are_not_completed_cycles(self):
        def miner(identity, ore=0, connected=False, blocks=85):
            return dict(id=identity, name=identity, state="Servicing" if connected else "Transit",
                        sourceSha256="verified-source", jobId="assigned-task", cargoOres={"Stone": ore},
                        connectors=[{"status": "Connected" if connected else "Unconnected"}],
                        integrity=dict(currentDamage=0, inspectedBlockCount=blocks, current=blocks * 100))

        with tempfile.TemporaryDirectory() as temporary:
            directory = Path(temporary)
            records = [
                dict(utc="2026-10-10T10:00:00+00:00", miners=[miner("old", 500)]),
                dict(utc="2026-10-10T11:00:00+00:00", miners=[miner("assigned"), miner("cycle"), miner("not-docked"), miner("old", connected=True)]),
                dict(utc="2026-10-10T11:01:00+00:00", miners=[miner("assigned"), miner("cycle", 100), miner("not-docked", 50)]),
                dict(utc="2026-10-10T11:02:00+00:00", miners=[miner("assigned", connected=True), miner("cycle", connected=True), miner("not-docked", blocks=84)]),
            ]
            (directory / "trace-01.jsonl").write_text("".join(json.dumps(row) + "\n" for row in records) + '{"unfinished":', encoding="utf-8")
            result = report(directory, "2026-10-10T11:00:00+00:00")
            self.assertEqual(3, result["samples"])
            self.assertEqual(4, result["observedMiners"])
            self.assertEqual(2, result["observedOrePickup"])
            self.assertEqual(1, result["observedDockedEmptyAfterPickup"])
            self.assertIsNone(result["miners"]["old"]["firstOreUtc"])
            self.assertIsNone(result["miners"]["assigned"]["firstOreUtc"])
            self.assertEqual(84, result["miners"]["not-docked"]["minimumBlockCount"])
            self.assertEqual(100, result["miners"]["cycle"]["peakCargoKg"])
            self.assertTrue((directory / "cycle-report.json").is_file())


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