# -*- coding: iso-8859-1 -*-
"""
    MoinMoin - MyPages Macro

    @copyright: 2006-2006 by Keith Schwols (renegade_gourmet@yahoo.com)
    @license: GNU GPL, see COPYING for details.
"""

import re, time
from MoinMoin import util, wikiutil, config
from MoinMoin.Page import Page
from MoinMoin.logfile import editlog
from MoinMoin.user import getUserId, getUserIdentification 

_MAX_DAYS=999 
_MAX_PAGENAME_LENGTH=35
#############################################################################
### MyPages Macro
#############################################################################

def _mypages_header(self):
    """
    Completely stolen from the theme/__init.py__, however we don't want
    all the bells and whistles (RSS link, preample etc.)
    But, we do like the 'theme' controled table vision
    """
    html = '<div class="recentchanges"%s>\n' % self.ui_lang_attr()
    html += '<div>\n'
    html += '<p>'
    html += '</p>\n</div>\n'
    html += '<table>\n'
    return html

def _mypages_footer():
    """
    Complete the RecentChanges like table
    """
    html = ''
    html += '</table>\n'
    html += '</div>\n'
    return html

def execute(macro, args):
    """
    Define args accepted here
    @max_days - limit log to last 'n' days
    @user - if not current user
    @hide_deleted = 1 if you wish to skip non-existent pages (created and subsequently deleted)
    @list_only =1 if you wish a single <OL> list
    """
    request = macro.request
    formatter = macro.formatter
    user = request.user

    ## KCS TBD: should find a standard MoinMoin args parser - is there one?
    if args:
        args = args.split(',')
        args = [arg.strip() for arg in args]
    else:
        args = []

    kw = {} # create a dictionary for the formatter.image call
    for arg in args :
        if '=' in arg:
            key, value = arg.split('=', 1)
            kw[str(key)] = wikiutil.escape(value, quote=1)

    if kw.has_key('user'):
      user.name = kw['user']
      user.id = getUserId(request,user.name)

    max_days = int(kw.get('max_days',_MAX_DAYS))
    msg = ""
    if not max_days == _MAX_DAYS:
        msg = "within the last %s days" % max_days
    tnow = time.time()
    tthen = tnow - max_days * 24 * 60 * 60;

    page = formatter.page
    pagename = page.page_name
    
    log = editlog.EditLog(request)

    pages = {}
    pagelist = [];
    # Process the global logfile and save all the matching page create messages in the pagelist 
    for line in log.reverse():
        if not request.user.may.read(line.pagename):
            continue
    
        if (line.ed_time_usecs/1000000) < tthen:
            continue

	pages[line.pagename] = [line]
	if kw.get('hide_deleted',0):
	   page = Page(request, line.pagename)
	   if not page.exists():
	      continue
	if line.action == "SAVENEW"  and line.userid == user.id:
            pagelist.append(line.pagename)

    # Sort ignoring case
    tmp = [(name.upper(), name) for name in pagelist]
    tmp.sort()
    pagelist = [item[1] for item in tmp]

    request.write("<h2>%d %s %s %s\n<br></h2>" % (len(pagelist),' Pages created by ',user.name, msg))

    # Use the Table is we have more than 2 entries, otherwise simple list (or message of 0 pages)
    if not kw.get('list_only',1) or len(pagelist) > 2:
	d = {} # data dictionary to theme
        index_letters = []
	info_img = request.theme.make_icon('info')
        diff_img = request.theme.make_icon('diffrc')
        del_img =  request.theme.make_icon('deleted')
        new_img =  request.theme.make_icon('new')
        current_letter = None
	request.write(_mypages_header(request.theme))
        for name in pagelist:
            page = Page(request,name)
            (file, rev, exists) = page.get_rev()
            letter = wikiutil.getUnicodeIndexGroup(name)
            if letter not in index_letters:
                index_letters.append(letter)
            if letter != current_letter:
                current_letter = letter
		d['date'] = letter
                d['bookmark_link_html'] = None
                request.write(request.theme.recentchanges_daybreak(d))
            d['icon_html'] = ''
            if exists:
              if rev == 1:
		d['icon_html'] = wikiutil.link_tag(request,
						   wikiutil.quoteWikinameURL(name),
                                                   new_img, formatter=macro.formatter)
              else:
		d['icon_html'] = wikiutil.link_tag(request,
						   wikiutil.quoteWikinameURL(name) + "?action=diff",
						   diff_img, formatter=macro.formatter)
            else:
		d['icon_html'] = del_img
 
	    dispname = name 
	    if len(name) > _MAX_PAGENAME_LENGTH:
		dispname = name.replace('/','/ ')

	    d['pagelink_html'] = page.link_to(request, attachment_indicator=1, text=dispname)
                                              
            line=pages[name][0]
            line.time_tuple = request.user.getTime(wikiutil.version2timestamp(line.ed_time_usecs))
	    d['time_html'] = 'Created: ' + time.strftime(request.cfg.date_fmt, line.time_tuple)
            d['info_html'] = wikiutil.link_tag(request,
					       wikiutil.quoteWikinameURL(name) + "?action=info",
					       info_img, formatter=macro.formatter)
            # Don't know what to put in the 'editors' column - afraid of information overload 
            # User's have the 'action-info' to get the details.
	    d['editors'] = ''
            d['comments'] = ''
            if exists and rev > 1:
	      comments=[[0,u'%d revisions' % rev]]
	      d['changecount'] = 1
	      d['comments'] = comments
            request.write(request.theme.recentchanges_entry(d))
        d['rc_msg'] = ''
	request.write(_mypages_footer())

    elif len(pagelist) > 0:
      request.write('<ol>')
      for pagename in pagelist:
	 page = Page(request, pagename)
	 page_link = page.link_to(request, text=pagename)
	 request.write('<li>')
	 request.write(page_link)
	 request.write('</li>')
      request.write('</ol>')
    else:
      request.write("<emphasis>You have not created any pages on this Wiki!</emphasis>")

    return ''
