# -*- coding: utf-8 -*-
"""
    MoinMoin - macro to collect data from definition lists from subpages
    into a databrowser widget table

    <<CollectLists>>
    will create a table column for every subpage of the current page and fills in
    the data from each key value pair of a definition list.
    Optional you can give the template page the definition list page depends on
    or the column_heading. In the latter case the order is used.
    Also it can optionally use definition list from another pagename.
    By setting optional a parser one can use e.g. wikimarkup from a different
    parser than moinmoin.
    By filter_selection you can optional use the filter method of the databrowser
    widget (this needs javascript enabled).
    By using a different filter_column_value than the default, eg. name:: Cohen  you
    get only rows shown where that name was found.
    By using the keyword transpose the table is shown transposed. Until transpose is not part
    of the databrowser widget itselfs we don't support filter_selection by transpose=True.
    * adapted by JV on basis of modification suggested by MarcelHaefner to accept the variable category_name instead of
      deriving that from the pagename where the macro is called (too inflexible)*
    @copyright: 2006 by michael cohen <scudette@users.sourceforge.net> (PageDicts)
    @copyright: 2008-2009 by MoinMoin:ReimarBauer (completly rewritten)
    @license: GNU GPL, see COPYING for details.
"""
import re
from MoinMoin import wikiutil
from MoinMoin.Page import Page
from MoinMoin.util.dataset import TupleDataset, Column
from MoinMoin.wikidicts import Dict
from MoinMoin.widget.browser import DataBrowserWidget
from MoinMoin.search import searchPages

Dependencies = ["pages"]

def macro_CollectLists(macro, pagename=unicode,
                      align=("left", "center", "right"),
                      column_heading=u'', template=u'',
                      transpose=False,
                      filter_column_value=u'',
                      parser=u'text_moin_wiki',
                      filter_selection=u'NeverExistingDefaultFilter',
                      category_name=u''):

    """
    currently we don't support transpose together with filter_selection
    """
    request = macro.request
    formatter = macro.formatter
    _ = request.getText

    try:
        WikiParser = wikiutil.importPlugin(request.cfg, 'parser', parser, function="Parser")
    except wikiutil.PluginMissingError:
        WikiParser = None

    if not pagename:
        pagename = formatter.page.page_name

    if filter_column_value and ':: ' in filter_column_value:
        filter_key, filter_word = filter_column_value.split('::')
        filter_key = filter_key.strip()
        filter_word = filter_word.strip()
    else:
        # Don't filter if syntax was wrong
        filter_column_value = u''

    #needle = '^%s/(.*)' % pagename
    #Marcel: because there is no child or subpage under the pagename exist, so no / to search for
    # needle = '^%s(.*)' % pagename
    # filterfn = re.compile(needle).search
    # pages = request.rootpage.getPageList(exists=1, filter=filterfn)
    # if not pages:
    #    return _("Page '%(new_pagename)s' does not exist or you don't have enough rights.") % {"new_pagename": pagename}

    # ignore Template pages ; lower two lines superfluous JV
    # filterfn = request.cfg.cache.page_template_regexact.search
    # templates = request.rootpage.getPageList(filter=filterfn)
    #subpages = [page for page in pages if page not in templates]
    #Marcel: subpages are not generated from the parent/main pages
    #JV I put below in if then clause to allow to search for category_name
    #Marcel:s earching now for the category pages = cat:CategogoryName
    if category_name==u'':
        needle = "cat:%s" % pagename
    else:
        needle = "cat:%s" % category_name
    searchresult =  searchPages(request, needle)
    subpages = []
    for title in searchresult.hits:
        # if not wikiutil.isSystemPage(request, title.page_name) or not title.page.getPageStatus()[0]: 
	# upper line replaced by JV
	if (not wikiutil.isSystemPage(request, title.page_name)) and (not title.page.getPageStatus()[0]):
            subpages.append(title.page_name)
            
    if not subpages:
        return _("Subpage of '%(pagename)s' does not exist or you don't have enough rights.") % {"pagename": pagename}
    subpages.sort()

    # use selection and order
    if column_heading:
        column_heading_keys = [key.strip() for key in column_heading.split(',')]
    # use keys from template page
    elif Page(request, template).exists():
        page = Page(request, template)
        page_dict = Dict(request, template)
        column_heading_keys = page_dict.keys()
    else:
        # fallback use the keys of the first subpage
        page = Page(request, subpages[0])
        page_dict = Dict(request, subpages[0])
        column_heading_keys = page_dict.keys()

    data = TupleDataset()
    data.columns = []
    #JV trying here to get rid of the column heading being name after the page
    # data.columns.extend([Column(pagename.strip('/'), label=pagename.strip('/'), align=align)])
    data.columns.extend([Column('Page', label='Page', align=align)])
    # may be transpose should be moved into the databrowser widget
    if transpose:
        data.addRow([pagename.strip('/')] + column_heading_keys)

    for name in subpages:
        page = Page(request, name)
        page_dict = Dict(request, name)
        if filter_column_value and page_dict.get(filter_key, '') != filter_word:
            continue
        row = []
        keep = False
        for key in column_heading_keys:
            if key in page_dict.keys():
                value = page_dict.get(key, '')
                if WikiParser:
                    # xxx check how our brand new Image class solves this
                    if parser == u'text_moin_wiki':
                        value = value.replace('attachment:', 'attachment:%s/' % name)
                    row.append((wikiutil.renderText(request, WikiParser, value), wikiutil.escape(value, 1)))
                else:
                    row.append((wikiutil.escape(value, 1), wikiutil.escape(value, 1)))
            else:
                row.append('')
        #parent, child = name.split('/', 1)
        #Marcel: because the categorypage is not the parent page of the wanted page
        parent = pagename #there is no need for this string... but for to stay compatible let it be
	# JV don't want this parent as column heading
	# parent = u'Page' doesn't work
        child = name
        
        #link = page.link_to(request, text="/%s" % child)
        #Marcel: don't want the / before every pagelink
        link = page.link_to(request, text="%s" % child)
        data.addRow([link] + row)
        if transpose:
            data.columns.extend([Column(link, label=link, align=align)])

    if transpose:
        data.data = map(None, zip(*data.data))
        data.data = data.data[1:]
    else:
        # transpose does not support filter_selection
        if filter_selection:
            filtercols = filter_selection.split(',')
            for key in column_heading_keys:
                key = key.strip()
                if filter_selection != u'NeverExistingDefaultFilter' and key in filtercols:
                    data.columns.append(Column(key, autofilter=(key in filtercols)))
                else:
                    data.columns.extend([Column(key, label=key, align=align)])

    table = DataBrowserWidget(request)
    table.setData(data)
    html = ''.join(table.format(method='GET'))
    # seems to work together with
    # http://moinmo.in/FeatureRequests/SortableTables?action=AttachFile&do=view&target=common.js.patch
    # html = html.replace('id="dbw.table', 'class="sortable" id="dbw.table')
    return html
