from django.test import SimpleTestCase
from django.utils import translation

from arches.app.models.system_settings import settings
from arches.app.utils.i18n import rank_label

# these tests can be run from the command line via
# python manage.py test tests.utils.i18n --settings="tests.test_settings"


class I18nTests(SimpleTestCase):
    def test_rank_label(self):
        translation.activate("es-ES")
        self.addCleanup(translation.activate, "en")

        old_system_lang = settings.LANGUAGE_CODE
        settings.LANGUAGE_CODE = "en-US"
        self.addCleanup(setattr, settings, "LANGUAGE_CODE", old_system_lang)

        # Match against explicitly specified language (fr-CA)
        self.assertGreater(
            rank_label("prefLabel", "fr-CA", "fr-CA"),
            rank_label("prefLabel", "fr", "fr-CA"),
        )
        self.assertGreater(
            rank_label("prefLabel", "fr", "fr-CA"),
            rank_label("altLabel", "fr", "fr-CA"),
        )
        self.assertGreater(
            rank_label("altLabel", "fr", "fr-CA"), rank_label("", "fr", "fr-CA")
        )

        # Match against user language (es-ES)
        self.assertGreater(
            rank_label("prefLabel", "es-ES"), rank_label("prefLabel", "es-MX")
        )
        self.assertGreater(
            rank_label("prefLabel", "es-ES"), rank_label("prefLabel", "en-US")
        )  # red herring (system)
        self.assertGreater(rank_label("prefLabel", "es"), rank_label("prefLabel", "de"))
        self.assertGreater(rank_label("prefLabel", "es"), rank_label("altLabel", "es"))
        self.assertGreater(
            rank_label("prefLabel", "es"), rank_label("altLabel", "en-US")
        )

        # Match against system language (en-US)
        self.assertGreater(
            rank_label("prefLabel", "en-US"), rank_label("prefLabel", "en-GB")
        )
        self.assertGreater(rank_label("prefLabel", "en"), rank_label("prefLabel", "de"))
        self.assertGreater(rank_label("prefLabel", "en"), rank_label("altLabel", "en"))
        self.assertGreater(
            rank_label("prefLabel", "en"), rank_label("altLabel", "en-US")
        )

        # Edge cases
        self.assertGreater(
            rank_label("prefLabel", "es"), rank_label("altLabel", "en-US")
        )
        self.assertGreater(
            rank_label("altLabel", "en-US"), rank_label("prefLabel", "de")
        )
