# -*- coding: utf-8 -*-
"""
    MoinMoin - Create a link to system page based on used locale.

    This macro adds link to system page (page which included in i18n
    "all_pages" list).

    Usage: <<SystemPageLink(pagename, [description, [lang, [anchor, 
                        [params]]]])>>
           <<SystemPageLink(pagename, [description="description string"],
                        [lang="iso 639-1 lang code"], [anchor="anchor name"],
                        [params="url query params"])>>

    @param pagename: name of system page linked to. Should be in i18n 
           "all_pages" list, otherwise error returned. 
    @param description: description string, used as link text.
    @param lang: Language which should be used. Value should be iso 639-1
           language code, or "page" for page language, "user" for user
           language, "default" for default wiki instance language. If no
           language provided, macro tries to find existing page with name
           translated to language in next order: page language, user default
           language, instance default language, english (used even page doesn't
           exist).
    @param anchor: Anchor on page link should point to. By default no anchor 
           pointed.
    @param params: URL query params. No params added by default.
    
    @return Formatted link if pagename in i18n "all_pages" list, formatted
            error message text in other case.

    @copyright: 2009 MoinMoin:EugeneSyromyatnikov
    @license: GNU GPL, see COPYING for details.
"""

from MoinMoin import wikiutil
from MoinMoin import i18n
from MoinMoin.i18n import strings
from MoinMoin.Page import Page

Dependencies = ["language"]

def macro_SystemPageLink(macro, pagename=u'', description=u'', lang=u'',
    anchor=u'', params=u''):
    _ = macro.request.getText

    if pagename in i18n.strings.all_pages:
        page_lang = macro.formatter.page.get_pi()['language']
        use_lang = lang

        #using array instead of dict to preserve order of items
        langs = [
            ('page', page_lang),
            ('user', macro.request.lang),
            ('default', macro.formatter.page.request.cfg.language_default),
        ]

        if lang:
            use_lang = lang
            for lang_name, lang_val in langs:
                if lang == lang_name:
                    use_lang = lang_val
                    break
        else:
            for language in [lang[1] for lang in langs] + ['en']:
                use_lang = language
                if Page(macro.request, i18n.getText(pagename, macro.request,
                    use_lang)).exists():
                    break

        __ = lambda text: i18n.getText(text, macro.request, use_lang)

        return ''.join([
                macro.formatter.pagelink(1, __(pagename), anchor=anchor,
                    querystr=params),
                macro.formatter.text(description and
                    __(description) or __(pagename)),
                macro.formatter.pagelink(0),
            ])
    else:
        return  macro.formatter.text(_("(SystemPageLink macro error: can't "
            "find page \"%(pagename)s\" in list of all system pages)" % {
            'pagename': pagename,
        }))
