import sys
import warnings

from PIL import ImageQt

from .helper import PillowTestCase, hopper

if sys.version_info.major >= 3:
    from importlib import reload

if ImageQt.qt_is_installed:
    from PIL.ImageQt import qRgba

    def skip_if_qt_is_not_installed(_):
        pass


else:

    def skip_if_qt_is_not_installed(test_case):
        test_case.skipTest("Qt bindings are not installed")


class PillowQtTestCase(object):
    def setUp(self):
        skip_if_qt_is_not_installed(self)

    def tearDown(self):
        pass


class PillowQPixmapTestCase(PillowQtTestCase):
    def setUp(self):
        PillowQtTestCase.setUp(self)
        try:
            if ImageQt.qt_version == "5":
                from PyQt5.QtGui import QGuiApplication
            elif ImageQt.qt_version == "4":
                from PyQt4.QtGui import QGuiApplication
            elif ImageQt.qt_version == "side":
                from PySide.QtGui import QGuiApplication
            elif ImageQt.qt_version == "side2":
                from PySide2.QtGui import QGuiApplication
        except ImportError:
            self.skipTest("QGuiApplication not installed")

        self.app = QGuiApplication([])

    def tearDown(self):
        PillowQtTestCase.tearDown(self)
        self.app.quit()


class TestImageQt(PillowQtTestCase, PillowTestCase):
    def test_rgb(self):
        # from https://doc.qt.io/archives/qt-4.8/qcolor.html
        # typedef QRgb
        # An ARGB quadruplet on the format #AARRGGBB,
        # equivalent to an unsigned int.
        if ImageQt.qt_version == "5":
            from PyQt5.QtGui import qRgb
        elif ImageQt.qt_version == "4":
            from PyQt4.QtGui import qRgb
        elif ImageQt.qt_version == "side":
            from PySide.QtGui import qRgb
        elif ImageQt.qt_version == "side2":
            from PySide2.QtGui import qRgb

        self.assertEqual(qRgb(0, 0, 0), qRgba(0, 0, 0, 255))

        def checkrgb(r, g, b):
            val = ImageQt.rgb(r, g, b)
            val = val % 2 ** 24  # drop the alpha
            self.assertEqual(val >> 16, r)
            self.assertEqual(((val >> 8) % 2 ** 8), g)
            self.assertEqual(val % 2 ** 8, b)

        checkrgb(0, 0, 0)
        checkrgb(255, 0, 0)
        checkrgb(0, 255, 0)
        checkrgb(0, 0, 255)

    def test_image(self):
        for mode in ("1", "RGB", "RGBA", "L", "P"):
            ImageQt.ImageQt(hopper(mode))

    def test_deprecated(self):
        with warnings.catch_warnings(record=True) as w:
            reload(ImageQt)
        if ImageQt.qt_version in ["4", "side"]:
            self.assertEqual(len(w), 1)
            self.assertTrue(issubclass(w[-1].category, DeprecationWarning))
        else:
            # No warning.
            self.assertEqual(w, [])
