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

from trytond.cache import Cache
from trytond.model import ModelSQL, Unique, fields
from trytond.rpc import RPC
from trytond.transaction import Transaction


class _Calendar(ModelSQL):
    _order_name = 'index'
    index = fields.Integer("Index", required=True)
    name = fields.Char("Name", required=True, translate=True)
    abbreviation = fields.Char("Abbreviation", required=True, translate=True)

    @classmethod
    def __setup__(cls):
        super().__setup__()
        t = cls.__table__()
        cls.__rpc__.update({
                'read': RPC(),
                'search': RPC(),
                'search_count': RPC(),
                'search_read': RPC(),
                })
        cls.index.domain = [
            ('index', '>=', cls._min_index),
            ('index', '<=', cls._max_index),
            ]
        cls._order.insert(0, ('index', 'ASC'))
        cls._sql_constraints = [
            ('index_unique', Unique(t, t.index),
                "The index must by unique.")
            ]

    @classmethod
    def locale(cls, language=None, field='name'):
        transaction = Transaction()
        if language is None:
            language = transaction.language
        elif isinstance(language, ModelSQL):
            language = language.code
        key = (language, field)
        result = cls._cache_locale.get(key)
        if not result:
            with transaction.set_context(language=language):
                records = cls.search([])
            result = [None] * cls._min_index
            result += [getattr(r, field) for r in records]
            cls._cache_locale.set(key, result)
        return result


class Month(_Calendar):
    __name__ = 'ir.calendar.month'
    _min_index = 1
    _max_index = 12
    _cache_locale = Cache('ir.calendar.month')


class Day(_Calendar):
    __name__ = 'ir.calendar.day'
    _min_index = 0
    _max_index = 6
    _cache_locale = Cache('ir.calendar.day')
