# This file is part of Tryton.  The COPYRIGHT file at the top level of
# this repository contains the full copyright notices and license terms.
import unittest
from unittest.mock import patch

from trytond.i18n import gettext, lazy_gettext
from trytond.pool import Pool
from trytond.tests.test_tryton import activate_module, with_transaction
from trytond.tools.string_ import LazyString


class I18nTestCase(unittest.TestCase):
    'Test Model Access'

    @classmethod
    def setUpClass(cls):
        activate_module('tests')

    @with_transaction()
    def test_gettext_with_translation(self):
        "gettext returns the translated text"
        pool = Pool()
        Lang = pool.get('ir.lang')
        Translation = pool.get('ir.translation')
        ModelData = pool.get('ir.model.data')

        lang, = Lang.search([('code', '!=', 'en')], limit=1)
        Translation.create([{
                    'name': 'ir.message,text',
                    'lang': lang.code,
                    'type': 'model',
                    'res_id': ModelData.get_id('tests', 'msg_test'),
                    'src': 'Message',
                    'value': 'Translated Message',
                    'module': 'tests',
                    'fuzzy': False,
                    }])

        message = gettext('tests.msg_test', lang.code)

        self.assertEqual(message, 'Translated Message')

    @with_transaction()
    def test_gettext_with_translation_format(self):
        "gettext returns the translated and formatted text"
        pool = Pool()
        Lang = pool.get('ir.lang')
        Translation = pool.get('ir.translation')
        ModelData = pool.get('ir.model.data')

        lang, = Lang.search([('code', '!=', 'en')], limit=1)
        Translation.create([{
                    'name': 'ir.message,text',
                    'lang': lang.code,
                    'type': 'model',
                    'res_id': ModelData.get_id('tests', 'msg_test'),
                    'src': 'Message',
                    'value': 'Translated Message %(variable)s',
                    'module': 'tests',
                    'fuzzy': False,
                    }])

        message1 = gettext(
            'tests.msg_test', lang.code, variable='foo')
        message2 = gettext(
            'tests.msg_test', lang.code, variable='bar')

        self.assertEqual(message1, 'Translated Message foo')
        self.assertEqual(message2, 'Translated Message bar')

    @with_transaction()
    def test_gettext_no_translation(self):
        "gettext returns original string when no translation"
        pool = Pool()
        Lang = pool.get('ir.lang')

        lang, = Lang.search([('code', '!=', 'en')], limit=1)

        message = gettext('tests.msg_test', lang.code)

        self.assertEqual(message, 'Message')

    @with_transaction()
    def test_gettest_wrong_id_format(self):
        "gettext returns the id if it has wrong format"
        with patch('trytond.pool.Pool.test', False):
            message = gettext("Wrong Format")

        self.assertEqual(message, "Wrong Format")

    @with_transaction()
    def test_gettext_wrong_id(self):
        "gettext returns the id if it does not exist"
        with patch('trytond.pool.Pool.test', False):
            message = gettext('tests.not_exist')

        self.assertEqual(message, 'tests.not_exist')

    def test_gettext_without_transaction(self):
        "gettext return the id if there is no transaction"
        message = gettext('test.msg_test')

        self.assertEqual(message, 'test.msg_test')

    @with_transaction()
    def test_lazy_gettext(self):
        "lazy_gettext returns a LazyString"
        lazy = lazy_gettext('tests.msg_test')

        self.assertIsInstance(lazy, LazyString)
        self.assertEqual(str(lazy), "Message")
