# -*- coding: iso-8859-1 -*-
u"""
    MoinMoin - ShowTweets macro Version 0.4 ALPHA
               Displays twitter messages (aka tweeds) from a user

    <<ShowTweets(user="Twitter Username", maxTweets=10)>>

    Exampels:
     * <<ShowTweets(twitter)>>

    @copyright: 2009 by MarcelHäfner (http://moinmo.in/MarcelHäfner)
    @license: GNU GPL, see COPYING for details.

    Licences for dependencies:
     * Python-Twitter is under Apache License, Version 2.0
     * simplejson is under MIT License

    Dependencies:
     * Python wrapper around the Python API (Python-Twitter):
       http://code.google.com/p/python-twitter/
     * JSON encoder/decoder for Python (simplejson)
       http://pypi.python.org/pypi/simplejson

    @TODO:
     1. Better caching for the displayed tweets:
        http://apiwiki.twitter.com/Rate-limiting)
     2. Authentication without cleartext passwd
        http://apiwiki.twitter.com/OAuth-FAQ
     3. Better error handling for the urllib, not depending on sys and socket
        stuff or atleast optimize the try and except stuff
"""
from MoinMoin import wikiutil
from MoinMoin.parser.text_moin_wiki import Parser as WikiParser
import twitter
import socket
import sys

Dependencies = []  # do cache; or use ['time'] for not caching


def errorOutput(macro, errorType, errorMessage):
    """
    Return a rendered error message
    @param errorType: some main error type
    @param errorMessage: detail error type
    @returns: list
    """
    request = macro.request
    fmt = macro.formatter
    _ = request.getText

    errorMsg = []
    errorMsg.append(fmt.div(True, css_class="error"))
    errorMsg.append(wikiutil.renderText(request, WikiParser, _("/!\ Error Message from Macro [[http://moinmo.in/MacroMarket/ShowTweets|ShowTweets]]!")))
    errorMsg.append(fmt.bullet_list(True))
    errorMsg.append(fmt.listitem(True))
    errorMsg.append(fmt.text(_("Type: %s") % wikiutil.escape(errorType)))
    errorMsg.append(fmt.listitem(False))
    errorMsg.append(fmt.listitem(True))
    errorMsg.append(fmt.text(_("Message: %s") % wikiutil.escape(errorMessage)))
    errorMsg.append(fmt.listitem(False))
    errorMsg.append(fmt.bullet_list(False))
    errorMsg.append(fmt.div(False))
    return ''.join(errorMsg)


def macro_ShowTweets(macro, user, maxTweets=10):
    """
    Creates a ordered list with twitter status messages
    @param user: username from a twitter account, needed
    @param maxTweets: optional, how many tweets should be displayed
    """

    #inital stuff
    socket.setdefaulttimeout(10)  # timeout set to 10s
    request = macro.request
    fmt = macro.formatter
    _ = request.getText
    output = []
    tweetNumber = 0

    #You also can use your Twitter Account to request for example privat twitter
    #statuses. but be aware, that for the moment you have to put your userdata
    #and password in cleartext, so make sure that nobody else can read your
    #macro. Change "api = twitter.Api" to
    #"api = twitter.Api(username='username', password='password')"
    api = twitter.Api()

    #get the messages from twitter or use an exception to display an error msg
    try:
        statuses = api.GetUserTimeline(user=wikiutil.escape(user), count=maxTweets)
    except:
        return errorOutput(macro, _("GetUserTimeline"), str(sys.exc_info()[1]))

    #starting tweets output
    output.append(fmt.div(True, css_class="ShowTweets"))
    output.append(fmt.bullet_list(True))

    #reading tweets
    for tweetNumber in range(len(statuses)):
        output.append(fmt.listitem(True))
        output.append(wikiutil.renderText(request, WikiParser, wikiutil.escape(statuses[tweetNumber].text)))
        output.append(fmt.span(True, css_class="date", style="color:Gray; font-size:75%; display:block;"))
        output.append(fmt.text(wikiutil.escape(statuses[tweetNumber].created_at)))
        output.append(fmt.span(False))
        output.append(fmt.listitem(False))

    #check if there is atleast one tweet available for ouput
    if tweetNumber < 1:
        return errorOutput(macro, _("tweetNumber"), _("Can't find any twitter status message from user '%s'" % user))

    #finishing output
    output.append(fmt.bullet_list(False))
    output.append(fmt.div(False))
    return ''.join(output)
