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

from generate_qr_codes import make_public_url, write_qr_png


class GenerateQrCodesTest(unittest.TestCase):
    def test_make_public_url_encodes_spaces_and_keeps_path_separators(self):
        url = make_public_url(
            "https://mercedesqr.routerb.ro/",
            "files_qr/A 45 - W1K3F5EB7VJ573648 .pdf",
        )

        self.assertEqual(
            url,
            "https://mercedesqr.routerb.ro/files_qr/A%2045%20-%20W1K3F5EB7VJ573648%20.pdf",
        )

    def test_png_writer_creates_valid_png(self):
        with tempfile.TemporaryDirectory() as temp_dir:
            output_path = Path(temp_dir) / "qr.png"
            write_qr_png(output_path, "https://example.test/file.pdf", scale=2)

            self.assertTrue(output_path.read_bytes().startswith(b"\x89PNG\r\n\x1a\n"))

    def test_script_generates_qr_codes_and_manifest(self):
        with tempfile.TemporaryDirectory() as temp_dir:
            root = Path(temp_dir)
            input_dir = root / "files_qr"
            output_dir = root / "qr_codes"
            input_dir.mkdir()
            source_file = input_dir / "A 45 - W1K3F5EB7VJ573648 .pdf"
            source_file.write_bytes(b"%PDF-1.4\n")

            subprocess.check_call(
                [
                    sys.executable,
                    str(Path(__file__).resolve().parent / "generate_qr_codes.py"),
                    "--input-dir",
                    str(input_dir),
                    "--output-dir",
                    str(output_dir),
                    "--scale",
                    "2",
                ]
            )

            qr_path = output_dir / "A 45 - W1K3F5EB7VJ573648 .pdf.png"
            manifest_path = output_dir / "manifest.json"
            manifest = json.loads(manifest_path.read_text(encoding="utf-8"))

            self.assertTrue(qr_path.exists())
            self.assertEqual(len(manifest), 1)
            self.assertEqual(
                manifest[0]["url"],
                "https://mercedesqr.routerb.ro/files_qr/A%2045%20-%20W1K3F5EB7VJ573648%20.pdf",
            )


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