import unittest
from pathlib import Path

import numpy as np

from app.class_catalog import class_key, coco_class_ids
from app.rfdetr_postprocess import parse_boxes_labels


class RfDetrClassContractTest(unittest.TestCase):
    def test_background_is_excluded_and_foreground_is_zero_based(self):
        dets = np.zeros((1, 4), dtype=np.float32)
        labels = np.full((1, 91), -20.0, dtype=np.float32)
        labels[0, 0] = 50.0
        labels[0, 1] = 10.0
        parsed = parse_boxes_labels(dets, labels, threshold=0.5)
        self.assertTrue(parsed["keep"][0])
        self.assertEqual(1, int(parsed["model_classes"][0]))
        self.assertEqual(0, int(parsed["classes"][0]))

        background_only = np.array([[50.0]], dtype=np.float32)
        parsed_background = parse_boxes_labels(dets, background_only, threshold=0.5)
        self.assertFalse(parsed_background["keep"][0])

    def test_class_catalog_owns_zero_based_class_key(self):
        self.assertEqual("person", class_key(0))
        self.assertEqual("toothbrush", class_key(79))
        self.assertEqual("class_80", class_key(80))
        self.assertEqual(list(range(80)), coco_class_ids())

    def test_image_build_references_only_canonical_native_adapter(self):
        dockerfile = Path("docker/Dockerfile").read_text(encoding="utf-8")
        ignore = Path(".dockerignore").read_text(encoding="utf-8")
        template = Path("app/cfg_templates/nvinferserver_grpc_det.tmpl").read_text(
            encoding="utf-8"
        )
        self.assertIn("AS rfdetr_processor_build", dockerfile)
        self.assertNotIn("AS parser_build", dockerfile)
        self.assertIn("native/nvinferserver_rfdetr/", ignore)
        self.assertNotIn("models/rfdetr_parser", ignore)
        self.assertIn("libcontextra_nvinferserver_rfdetr.so", template)
        self.assertIn("CreateContextraRfDetrProcessor", template)
        self.assertFalse(Path("models/rfdetr_parser/deepstream_rfdetr_bbox.cpp").exists())


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