import io
import os
import unittest

from mako import compat
from .. import skip_if
from .. import template_base
from .. import TemplateTest

try:
    import babel.messages.extract as babel
    from mako.ext.babelplugin import extract

except ImportError:
    babel = None


def skip():
    return skip_if(
        lambda: not babel, "babel not installed: skipping babelplugin test"
    )


class Test_extract(unittest.TestCase):
    @skip()
    def test_parse_python_expression(self):
        input_ = io.BytesIO(compat.b('<p>${_("Message")}</p>'))
        messages = list(extract(input_, ["_"], [], {}))
        self.assertEqual(messages, [(1, "_", compat.u("Message"), [])])

    @skip()
    def test_python_gettext_call(self):
        input_ = io.BytesIO(compat.b('<p>${_("Message")}</p>'))
        messages = list(extract(input_, ["_"], [], {}))
        self.assertEqual(messages, [(1, "_", compat.u("Message"), [])])

    @skip()
    def test_translator_comment(self):
        input_ = io.BytesIO(
            compat.b(
                """
        <p>
          ## TRANSLATORS: This is a comment.
          ${_("Message")}
        </p>"""
            )
        )
        messages = list(extract(input_, ["_"], ["TRANSLATORS:"], {}))
        self.assertEqual(
            messages,
            [
                (
                    4,
                    "_",
                    compat.u("Message"),
                    [compat.u("TRANSLATORS: This is a comment.")],
                )
            ],
        )


class ExtractMakoTestCase(TemplateTest):
    @skip()
    def test_extract(self):
        mako_tmpl = open(os.path.join(template_base, "gettext.mako"))
        self.addCleanup(mako_tmpl.close)
        messages = list(
            extract(
                mako_tmpl,
                {"_": None, "gettext": None, "ungettext": (1, 2)},
                ["TRANSLATOR:"],
                {},
            )
        )
        expected = [
            (1, "_", "Page arg 1", []),
            (1, "_", "Page arg 2", []),
            (10, "gettext", "Begin", []),
            (14, "_", "Hi there!", ["TRANSLATOR: Hi there!"]),
            (19, "_", "Hello", []),
            (22, "_", "Welcome", []),
            (25, "_", "Yo", []),
            (36, "_", "The", ["TRANSLATOR: Ensure so and", "so, thanks"]),
            (36, "ungettext", ("bunny", "bunnies", None), []),
            (41, "_", "Goodbye", ["TRANSLATOR: Good bye"]),
            (44, "_", "Babel", []),
            (45, "ungettext", ("hella", "hellas", None), []),
            (62, "_", "The", ["TRANSLATOR: Ensure so and", "so, thanks"]),
            (62, "ungettext", ("bunny", "bunnies", None), []),
            (68, "_", "Goodbye, really!", ["TRANSLATOR: HTML comment"]),
            (71, "_", "P.S. byebye", []),
            (77, "_", "Top", []),
            (83, "_", "foo", []),
            (83, "_", "hoho", []),
            (85, "_", "bar", []),
            (92, "_", "Inside a p tag", ["TRANSLATOR: <p> tag is ok?"]),
            (95, "_", "Later in a p tag", ["TRANSLATOR: also this"]),
            (99, "_", "No action at a distance.", []),
        ]
        self.assertEqual(expected, messages)

    @skip()
    def test_extract_utf8(self):
        mako_tmpl = open(
            os.path.join(template_base, "gettext_utf8.mako"), "rb"
        )
        self.addCleanup(mako_tmpl.close)
        message = next(
            extract(mako_tmpl, set(["_", None]), [], {"encoding": "utf-8"})
        )
        assert message == (1, "_", u"K\xf6ln", [])

    @skip()
    def test_extract_cp1251(self):
        mako_tmpl = open(
            os.path.join(template_base, "gettext_cp1251.mako"), "rb"
        )
        self.addCleanup(mako_tmpl.close)
        message = next(
            extract(mako_tmpl, set(["_", None]), [], {"encoding": "cp1251"})
        )
        # "test" in Rusian. File encoding is cp1251 (aka "windows-1251")
        assert message == (1, "_", u"\u0442\u0435\u0441\u0442", [])