#!/usr/bin/env python3

import logging
import tweepy
import re
import requests
import report
from bot import Bot


logger = logging.getLogger(__name__)


class TwitterBot(Bot):
    def get_api(self, user):
        keys = user.get_twitter_credentials()
        auth = tweepy.OAuthHandler(consumer_key=keys[0],
                                   consumer_secret=keys[1])
        auth.set_access_token(keys[2],  # access_token_key
                              keys[3])  # access_token_secret
        return tweepy.API(auth)

    def crawl(self, user):
        """
        crawls all Tweets which mention the bot from the twitter rest API.

        :return: reports: (list of report.Report objects)
        """
        reports = []
        try:
            api = self.get_api(user)
        except Exception:
            #logger.error("Error Authenticating Twitter", exc_info=True)
            return reports
        last_mention = user.get_seen_tweet()
        try:
            if last_mention == 0:
                mentions = api.mentions_timeline()
            else:
                mentions = api.mentions_timeline(since_id=last_mention)
            for status in mentions:
                text = re.sub(
                        "(?<=^|(?<=[^a-zA-Z0-9-_\.]))@([A-Za-z]+[A-Za-z0-9-_]+)",
                        "", status.text)
                reports.append(report.Report(status.author.screen_name,
                                             self,
                                             text,
                                             status.id,
                                             status.created_at))
            user.save_seen_tweet(last_mention)
            return reports
        except tweepy.RateLimitError:
            logger.error("Twitter API Error: Rate Limit Exceeded",
                         exc_info=True)
            # :todo implement rate limiting
        except requests.exceptions.ConnectionError:
            logger.error("Twitter API Error: Bad Connection", exc_info=True)
        except tweepy.TweepError:
            logger.error("Twitter API Error: General Error", exc_info=True)
        return []

    def post(self, user, report):
        api = self.get_api(user)
        try:
            if report.source == self:
                api.retweet(report.id)
            else:
                text = report.text
                if len(text) > 280:
                    text = text[:280 - 4] + u' ...'
                api.update_status(status=text)
        except requests.exceptions.ConnectionError:
            logger.error("Twitter API Error: Bad Connection",
                         exc_info=True)
            # :todo implement rate limiting