# -*- coding: utf-8 -*-
# Future imports
from __future__ import unicode_literals

try:
    # Django imports
    from django.urls import reverse
except ImportError:
    from django.core.urlresolvers import reverse
# Django imports
from django.utils.translation import get_language
from django.utils.translation import ugettext_lazy as _

# Third Party
from newsbox.models import NewsboxManager
from newsbox.models import NewsboxModelBase
from parler.managers import TranslatableManager
from parler.managers import TranslatableQuerySet
from parler.models import TranslatableModel
from parler.models import TranslatedFields
from parler.utils.context import switch_language
import six


class NewsboxI18NQueryset(TranslatableQuerySet):
    pass


class NewsboxI18NManager(TranslatableManager, NewsboxManager):

    queryset_class = NewsboxI18NQueryset


def newsboxi18n_mcls_processor(mcls, class_name, class_bases, class_attrs, base, newsbox_opts):
    translatedFields = {}
    for trans_field in newsbox_opts['trans_fieldnames']:
        translatedFields[trans_field] = class_attrs.pop(trans_field)
    translatedFields['meta'] = {
        'unique_together': (('newsbox_slug', 'language_code'), ),
        'verbose_name': _('News translation'),
        'verbose_name_plural': _('News translations')
    }
    class_attrs['translations'] = TranslatedFields(**translatedFields)
    class_attrs['newsbox_objects'] = NewsboxI18NManager()
    # class_attrs['default_manager'] = class_attrs['newsbox_objects']


class NewsboxI18NModelBase(NewsboxModelBase):
    pass


class NewsboxI18NBase(six.with_metaclass(NewsboxI18NModelBase, TranslatableModel)):
    """
    Define News which expires in time and will not be displayed in front
    """

    default_manager = NewsboxI18NManager()
    objects = default_manager

    def __str__(self):
        return self.safe_translation_getter(
            'newsbox_title',
            _('News #%d') % (self.pk or 0),
            any_language=True)

    def get_slug(self, language=None, *args, **kwargs):
        """
        Returns the slug for this object for the given language.
        """
        if language is None or language == self.language_code:
            return self.safe_translation_getter('newsbox_slug')
        else:
            instance = self.__class__.objects.language(language).get(pk=self.pk)
            return instance.safe_translation_getter('newsbox_slug')

    def get_absolute_url(self, language=None, *args, **kwargs):
        """
        Build url for the given language.
        """
        current_language = get_language()

        if not language:
            language = current_language

        if language not in self.get_available_languages():
            if not self.get_available_languages():
                return None
            language = None
            for lang in self.get_fallback_languages():
                if lang in self.get_available_languages():
                    language = lang
                    break
            if not language:
                return None
        with switch_language(self, language):
            url = reverse(self._newsbox_meta['detail_url_name'], args=(
                self.newsbox_publication_start_date.strftime("%Y"),
                self.newsbox_publication_start_date.strftime("%m"),
                self.newsbox_publication_start_date.strftime("%d"),
                self.get_slug(language=language),))
        return url

    class Meta:
        abstract = True
        verbose_name = _('news')
        verbose_name_plural = _('news')
        # newsbox_metaclass_base_processor = 'newsboxi18n_mcls_processor'
        newsbox_metaclass_final_processor = 'newsboxi18n_mcls_processor'