from __future__ import annotations

import tempfile
import unittest
from pathlib import Path

from PIL import Image

from omr_service.page_normalization import normalize_phone_image, normalize_scanner_page


class PageNormalizationTest(unittest.TestCase):
    def test_half_letter_is_padded_below_without_scaling(self) -> None:
        with tempfile.TemporaryDirectory() as directory:
            root = Path(directory)
            source, output = root / "half.png", root / "normalized.png"
            Image.new("L", (2544, 1650), 120).save(source)
            normalize_scanner_page(source, output)
            with Image.open(output) as image:
                self.assertEqual((2544, 3292), image.size)
                self.assertEqual(120, image.getpixel((100, 100)))
                self.assertEqual(255, image.getpixel((100, 3000)))

    def test_full_letter_uses_top_half(self) -> None:
        with tempfile.TemporaryDirectory() as directory:
            root = Path(directory)
            source, output = root / "letter.png", root / "normalized.png"
            image = Image.new("L", (2544, 3300), 255)
            image.paste(80, (0, 0, 2544, 1650))
            image.save(source)
            normalize_scanner_page(source, output)
            with Image.open(output) as normalized:
                self.assertEqual((2544, 3292), normalized.size)
                self.assertEqual(80, normalized.getpixel((100, 100)))
                self.assertEqual(255, normalized.getpixel((100, 3000)))

    def test_sideways_phone_is_rotated_and_padded(self) -> None:
        with tempfile.TemporaryDirectory() as directory:
            root = Path(directory)
            source, output = root / "phone.jpg", root / "normalized.png"
            Image.new("L", (1400, 1900), 100).save(source)
            normalize_phone_image(source, output, 90)
            with Image.open(output) as image:
                self.assertEqual(1900, image.width)
                self.assertGreater(image.height, image.width)


if __name__ == "__main__":
    unittest.main()
