# -*- coding: utf-8 -*-
# Copyright (C) 2012-2015 Mag. Christian Tanzer All rights reserved
# Glasauergasse 32, A--1130 Wien, Austria. tanzer@swing.co.at
# #*** <License> ************************************************************#
# This module is part of the package GTW.RST.TOP.
#
# This module is licensed under the terms of the BSD 3-Clause License
# <http://www.c-tanzer.at/license/bsd_3c.html>.
# #*** </License> ***********************************************************#
#
#++
# Name
#    GTW.RST.TOP.L10N
#
# Purpose
#    Language selection for tree of pages
#
# Revision Dates
#     9-Jul-2012 (CT) Creation
#    23-Jul-2012 (CT) Add argument `response` to `_Language_.GET.__call__`
#    24-Jul-2012 (CT) Fix `_Language_.GET.__call__`
#    26-Nov-2013 (CT) Use cookie, not session, to store `language`
#    26-Nov-2013 (CT) Add `_Language_.skip_etag`
#    11-Mar-2015 (CT) Add `logging.error` to `_Language_.GET.__call__`
#    11-Mar-2015 (CT) Use `HTTP_Status.See_Other`, not `.Temporary_Redirect`
#    20-Mar-2015 (CT) Add `request.use_language` to `_Language_.GET.__call__`
#    ««revision-date»»···
#--

from   _GTW                     import GTW
from   _TFL                     import TFL

import _GTW.Notification
import _GTW._RST.HTTP_Method
import _GTW._RST._TOP.Dir
import _GTW._RST._TOP.Page

from   _TFL._Meta.Once_Property import Once_Property

from   _TFL.Decorator           import getattr_safe
from   _TFL.I18N                import _, _T, _Tn
from   _TFL.pyk                 import pyk

from   posixpath                import join  as pp_join

import itertools
import logging

_Ancestor = GTW.RST.TOP.Page

class _Language_ (_Ancestor) :

    implicit  = True
    skip_etag = True

    class _Language__GET_ (_Ancestor.GET) :

        _real_name             = "GET"

        def __call__ (self, resource, request, response) :
            Status   = resource.Status
            language = resource.language
            with TFL.I18N.context (language) :
                next   = request.req_data.get ("next", request.referrer)
                choice = TFL.I18N.Config.choice
                if language.startswith (choice [0]) :
                    request.use_language (choice)
                    response.set_cookie ("language", language, max_age = 1<<31)
                    response.add_notification \
                        ( GTW.Notification
                            (_T (u"Language %s selected") % language)
                        )
                else :
                    logging.error \
                        ( "%s: request for language %r; "
                          "I18N.context returned %r"
                        % (resource.abs_href, language, choice)
                        )
                raise Status.See_Other (next)
            raise Status.Not_Found ()
        # end def __call__

    GET = _Language__GET_ # end class _Language__GET_

# end class _Language_

class L10N (GTW.RST.TOP.Dir) :
    """Navigation directory supporting language selection."""

    hidden          = True
    pid             = "L10N"

    country_map     = dict\
        ( en        = "us"
        )

    _flag_map       = {}
    _flag_prefix    = "/media/GTW/icons/flags"

    def __init__ (self, ** kw) :
        self.country_map = dict \
            (self.country_map, ** kw.pop ("country_map", {}))
        kw ["entries"] = tuple \
            (   _Language_ (language = l, name = l)
            for l in sorted (TFL.I18N.Config.Languages) if l
            )
        self.__super.__init__ (** kw)
    # end def __init__

    @Once_Property
    @getattr_safe
    def languages (self) :
        return self._entry_map
    # end def languages

    def flag (self, lang) :
        key    = tuple (lang)
        result = self._flag_map.get (key)
        if result is None :
            if isinstance (lang, pyk.string_types) :
                lang = lang.split ("_")
            check    = self.static_handler.get_path
            map      = self.country_map
            prefix   = self._flag_prefix
            for l in itertools.chain (reversed (lang), (self.language, "en")) :
                k = (map.get (l) or l).lower ()
                if k :
                    r = pp_join (prefix, "%s.png" % (k, ))
                    if check (r) :
                        result = self._flag_map [key] = r
                        break
        return result
    # end def flag

    def _get_child (self, child, * grandchildren) :
        if not grandchildren :
            result = self.__super._get_child (child)
            if result is None and child :
                result = self.languages.get (child.split ("_") [0])
            return result
    # end def _get_child

    def __bool__ (self) :
        return bool (self.languages)
    # end def __bool__

# end class L10N

if __name__ != "__main__" :
    GTW.RST.TOP._Export ("*")
### __END__ GTW.RST.TOP.L10N
