from eca import *
from eca.generators import start_offline_tweets

import random
import re

## You might have to update the root path to point to the correct path
## (by default, it points to <rules>_static)
root_content_path = 'dashboard_static'


# binds the 'setup' function as the action for the 'init' event
# the action will be called with the context and the event
@event('init')
def setup(ctx, e):
    start_offline_tweets('sports1.txt', event_name="tweet", time_factor=0.5)
    ctx.count = 0
    # fire('sample', {'previous': 0.0})


# define a normal Python function
def clip(lower, value, upper):
    return max(lower, min(value, upper))


# simple word splitter
pattern = re.compile('\W+')

# sample stopword list, needs to be much more sophisticated
stopwords = ["volleyball", "football", "basketball", "baseball", "tennis", "cricket", "soccer", "rugby"]


def words(message):
    result = pattern.split(message)
    result = map(lambda w: w.lower(), result)
    result = filter(lambda w: w in stopwords, result)
    result = filter(lambda w: len(w) > 2, result)
    return result


@event('tweet')
def generate_tweet(ctx, e):
    tweet = dict(e.data)
    # array of indexes that we want to pop from our tweets; this is to save memory
    pops = [
        "display_text_range",
        "in_reply_to_status_id",
        "in_reply_to_status_id_str",
        "in_reply_to_user_id",
        "in_reply_to_user_id_str",
        "in_reply_to_screen_name",
        "geo",
        "coordinates",
        "place",
        "contributors",
        "is_quote_status"
    ]
    try:
        for x in pops:
            try:
                tweet.pop(x)
            except KeyError:
                pass
    except:
        pass
    # base sample on previous one
    # sample = clip(-100, e.data['previous'] + random.uniform(+5.0, -5.0), 100)
    # emit to outside world
    emit('tweet', tweet)
    for w in words(tweet['text']):
        emit('pie', {
            'action': 'add',
            'value': (str(w), 1)
        })
    # # chain event
    # fire('tweet', {'previous': tweet}, delay=0.05)

