from __future__ import annotations

import sys
from io import BytesIO, StringIO

import pytest

from PIL import Image, IptcImagePlugin

from .helper import assert_image_equal, hopper

TEST_FILE = "Tests/images/iptc.jpg"


def test_open() -> None:
    expected = Image.new("L", (1, 1))

    f = BytesIO(
        b"\x1c\x03<\x00\x02\x01\x00\x1c\x03x\x00\x01\x01\x1c\x03\x14\x00\x01\x01"
        b"\x1c\x03\x1e\x00\x01\x01\x1c\x08\n\x00\x01\x00"
    )
    with Image.open(f) as im:
        assert im.tile == [("iptc", (0, 0, 1, 1), 25, "raw")]
        assert_image_equal(im, expected)


def test_getiptcinfo_jpg_none() -> None:
    # Arrange
    with hopper() as im:
        # Act
        iptc = IptcImagePlugin.getiptcinfo(im)

    # Assert
    assert iptc is None


def test_getiptcinfo_jpg_found() -> None:
    # Arrange
    with Image.open(TEST_FILE) as im:
        # Act
        iptc = IptcImagePlugin.getiptcinfo(im)

    # Assert
    assert isinstance(iptc, dict)
    assert iptc[(2, 90)] == b"Budapest"
    assert iptc[(2, 101)] == b"Hungary"


def test_getiptcinfo_fotostation() -> None:
    # Arrange
    with open(TEST_FILE, "rb") as fp:
        data = bytearray(fp.read())
    data[86] = 240
    f = BytesIO(data)
    with Image.open(f) as im:
        # Act
        iptc = IptcImagePlugin.getiptcinfo(im)

    # Assert
    assert iptc is not None
    for tag in iptc.keys():
        if tag[0] == 240:
            return
    pytest.fail("FotoStation tag not found")


def test_getiptcinfo_zero_padding() -> None:
    # Arrange
    with Image.open(TEST_FILE) as im:
        im.info["photoshop"][0x0404] += b"\x00\x00\x00"

        # Act
        iptc = IptcImagePlugin.getiptcinfo(im)

    # Assert
    assert isinstance(iptc, dict)
    assert len(iptc) == 3


def test_getiptcinfo_tiff() -> None:
    # Arrange
    with Image.open("Tests/images/hopper.Lab.tif") as im:
        # Act
        iptc = IptcImagePlugin.getiptcinfo(im)

    # Assert
    assert iptc == {(1, 90): b"\x1b%G", (2, 0): b"\xcf\xc0"}


def test_getiptcinfo_tiff_none() -> None:
    # Arrange
    with Image.open("Tests/images/hopper.tif") as im:
        # Act
        iptc = IptcImagePlugin.getiptcinfo(im)

    # Assert
    assert iptc is None


def test_i() -> None:
    # Arrange
    c = b"a"

    # Act
    with pytest.warns(DeprecationWarning):
        ret = IptcImagePlugin.i(c)

    # Assert
    assert ret == 97


def test_dump(monkeypatch: pytest.MonkeyPatch) -> None:
    # Arrange
    c = b"abc"
    # Temporarily redirect stdout
    mystdout = StringIO()
    monkeypatch.setattr(sys, "stdout", mystdout)

    # Act
    with pytest.warns(DeprecationWarning):
        IptcImagePlugin.dump(c)

    # Assert
    assert mystdout.getvalue() == "61 62 63 \n"


def test_pad_deprecation() -> None:
    with pytest.warns(DeprecationWarning):
        assert IptcImagePlugin.PAD == b"\0\0\0\0"
