import unittest
from pathlib import Path

from cadpy.step_metadata import (
    TEXT_TO_CAD_GENERATOR,
    inject_text_to_cad_step_metadata,
    read_text_to_cad_step_metadata,
)
from tests.python.support.tmp_root import temporary_directory


MINIMAL_STEP = """ISO-10303-21;
HEADER;
FILE_DESCRIPTION(('Open CASCADE Model'),'2;1');
ENDSEC;
DATA;
#1=PRODUCT_DEFINITION('design','',#2,#3);
#4=PRODUCT_DEFINITION_SHAPE('','',#1);
#5=SHAPE_REPRESENTATION('',(#6),#7);
#7=(GEOMETRIC_REPRESENTATION_CONTEXT(3) REPRESENTATION_CONTEXT('Context #1','3D'));
ENDSEC;
END-ISO-10303-21;
"""


class TextToCadStepMetadataTests(unittest.TestCase):
    def test_injects_and_reads_text_to_cad_metadata(self) -> None:
        with temporary_directory(prefix="cad-step-metadata-") as temp_dir:
            step_path = Path(temp_dir) / "fixture.step"
            step_path.write_text(MINIMAL_STEP, encoding="utf-8")

            inject_text_to_cad_step_metadata(
                step_path,
                entry_kind="assembly",
                source_hash="source-hash-123",
            )

            metadata = read_text_to_cad_step_metadata(step_path)
            self.assertEqual(TEXT_TO_CAD_GENERATOR, metadata.get("generator"))
            self.assertEqual("assembly", metadata.get("entryKind"))
            self.assertEqual("source-hash-123", metadata.get("sourceHash"))
            step_text = step_path.read_text(encoding="utf-8")
            self.assertIn("PROPERTY_DEFINITION('cadpy metadata','cadpy:entryKind'", step_text)

    def test_reads_tail_metadata_without_full_file_scan(self) -> None:
        with temporary_directory(prefix="cad-step-metadata-tail-") as temp_dir:
            step_path = Path(temp_dir) / "large-fixture.step"
            metadata_block = "\n".join(
                [
                    "#100=DESCRIPTIVE_REPRESENTATION_ITEM('cadpy:generator','cadpy');",
                    "#101=REPRESENTATION('cadpy:generator',(#100),#7);",
                    "#102=PROPERTY_DEFINITION('cadpy metadata','cadpy:generator',#1);",
                    "#103=PROPERTY_DEFINITION_REPRESENTATION(#102,#101);",
                    "#104=DESCRIPTIVE_REPRESENTATION_ITEM('cadpy:entryKind','assembly');",
                    "#105=REPRESENTATION('cadpy:entryKind',(#104),#7);",
                    "#106=PROPERTY_DEFINITION('cadpy metadata','cadpy:entryKind',#1);",
                    "#107=PROPERTY_DEFINITION_REPRESENTATION(#106,#105);",
                    "#112=DESCRIPTIVE_REPRESENTATION_ITEM('cadpy:sourceHash','source-hash-tail');",
                    "#113=REPRESENTATION('cadpy:sourceHash',(#112),#7);",
                    "#114=PROPERTY_DEFINITION('cadpy metadata','cadpy:sourceHash',#1);",
                    "#115=PROPERTY_DEFINITION_REPRESENTATION(#114,#113);",
                ]
            )
            step_path.write_text(
                "ISO-10303-21;\nDATA;\n"
                + ("#9=PRODUCT('padding','padding','',(#7));\n" * 40000)
                + metadata_block
                + "\nENDSEC;\nEND-ISO-10303-21;\n",
                encoding="utf-8",
            )

            metadata = read_text_to_cad_step_metadata(step_path)

            self.assertEqual(TEXT_TO_CAD_GENERATOR, metadata.get("generator"))
            self.assertEqual("assembly", metadata.get("entryKind"))
            self.assertEqual("source-hash-tail", metadata.get("sourceHash"))


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