class TweetController:
    """docstring for Controller"""

    def __init__(self):
        self.settings = Settings()
        # self.auth = OAuthHandler(Listener.api_data["consumer_key"], Listener.api_data["consumer_secret"])
        # self.auth.set_access_token(Listener.api_data["access_token"], Listener.api_data["access_token_secret"])
        self.api = tweepy.API(self.settings.auth, parser=tweepy.parsers.JSONParser())

        self.db = DataBase()
        # self.tweet_gui = tweet_gui
        self.default_keyword = ['Obama', 'hillary ', 'Trump']
        self.db.create_table_if_not_exist()

    def start_stream(self):
        self.tweet_listener = Listener()
        self.stream = Stream(auth=self.settings.auth, listener=self.tweet_listener)
        self.stream.filter(track=self.default_keyword, async=True)

    def stop_stream(self):
        self.stream.disconnect()

    def set_keyword(self, default_keyword):
        self.default_keyword = default_keyword
        print(default_keyword)
 def __init__(self):
     self.db = DataBase()
     # self.panel()
     self.canvas_width = 400
     self.canvas_height = 0
     self.root = Tk()
     self.create_window(self.root)
 def __init__(self, save_location="data/tweets.json"):
     super().__init__()
     self.save_location = save_location
     self.count = 0
     self.analyser = MoodAnalyser()
     self.db = DataBase()
     self.max_tweets = 10000
     print("Listener created")
    def __init__(self):
        self.settings = Settings()
        # self.auth = OAuthHandler(Listener.api_data["consumer_key"], Listener.api_data["consumer_secret"])
        # self.auth.set_access_token(Listener.api_data["access_token"], Listener.api_data["access_token_secret"])
        self.api = tweepy.API(self.settings.auth, parser=tweepy.parsers.JSONParser())

        self.db = DataBase()
        # self.tweet_gui = tweet_gui
        self.default_keyword = ['Obama', 'hillary ', 'Trump']
        self.db.create_table_if_not_exist()
 def __init__(self):
     self.db = DataBase()
class MoodAnalyser:
    def __init__(self):
        self.db = DataBase()

    def start_up(self):
        """
        A function to startup the mood analyser, fetching all the tweets and passing
        each tweet to the analyser
        :return:
        """
        count = 0
        tweets = self.db.fetch_all_tweets()
        for tweet in tweets:
            count += 1
            self.analyse(tweet, count)
            # print(tweet)

    def analyse(self, tweet, count):
        """
        Analyser each word using the moodvalue file words
        :param tweet:
        :param count:
        :return:
        """
        tweet = "".join(tweet)
        processed_text = self.process_text(tweet)
        # calculate mood
        score = 0
        for word in processed_text:
            if word in mood_values.positive_words:
                score += 0.6
            if word in mood_values.negative_words:
                score -= 0.5

        self.scoring(score, count)

    def scoring(self,tweet_score, tweet_number):
        """
        Setting the score of each tweet
        :param tweet_score:
        :param tweet_number:
        :return:
        """
        if tweet_score <= -1:
            # tweet is negative
            self.db.set_mood(tweet_number, '-1')
        elif tweet_score >= 0.5:
            # tweet is positive
            self.db.set_mood(tweet_number, "+1")
        else:
            # tweet is neutral
            self.db.set_mood(tweet_number, "0.5")

    def process_text(self, text):
        """
        A function to process the text of the tweet stripping all the links and white spaces.
        :param text:
        :return:
        """
        text = text.lower()
        # Remove links
        text = re.sub('((www\.[^\s]+)|(https?://[^\s]+)|(http://[^\s]+))', 'URL', text)
        # Remove mentions
        text = re.sub('@[^\s]+', 'MENTION', text)
        # Remove white spaces
        text = re.sub('[\s]+', ' ', text)
        # Remove hashtag from words
        text = re.sub(r'#([^\s]+)', r'\1', text)
        # trim
        text = text.strip('\'"')
        # Split text to array
        text = text.split()
        return text
class Main(object):
    def __init__(self):
        self.db = DataBase()
        # self.panel()
        self.canvas_width = 400
        self.canvas_height = 0
        self.root = Tk()
        self.create_window(self.root)

    def create_window(self, master):
        self.add_canvas(master)
        self.start_page(master)
        master.mainloop()

    def add_canvas(self, master):
        self.canvas = Canvas(self.root, width=self.canvas_width, height=self.canvas_height, background='white')
        self.canvas.grid(column=0, row=0, sticky=(N, W, E, S))
        self.canvas.pack()

    def start_page(self, master):
        label = Label(master, text="ISCP - Sevak Mardirosian", font=("Helvetica", 16))

        label.pack()
        Button1 = tk.Button(master, text="Bar Chart!", command=lambda: self.bar_chart(), bg="gray",
                            fg="white", font="Helvetica")
        Button1.pack()

        Button2 = tk.Button(master, text="Time Chart", command=lambda: self.time_chart(), bg="gray",
                            fg="white", font="Helvetica")
        Button2.pack()

        Button3 = tk.Button(master, text="Pie Chart!", command=lambda: self.pie_chart(), bg="gray",
                            fg="white", font="Helvetica")
        Button3.pack()

        Button4 = tk.Button(master, text="Heat Map!", command=lambda: self.heat_map(), bg="gray",
                            fg="white", font="Helvetica")
        Button4.pack()


    def bar_chart(self):
        plt.xlabel('Sentiment')
        plt.ylabel('Number')

        # X is negatief, neutraal, positief
        # Y is het Number
        data = ['Negatief', 'Neutral', 'Positive']
        x = np.arange(len(data))
        y = self.db.get_mood()
        width = 0.8

        plt.bar(x, y, width, color="darkblue")
        plt.xticks(x + 0.4, data)

        plt.tight_layout()
        plt.show()

    def time_chart(self):
        plt.figure(figsize=(30, 10))
        date_list = []
        score_List = []

        data = self.db.get_time_chart()
        for rij in data:
            date_list.append(datetime.datetime.fromtimestamp(rij[0] / 500.0))
            score_List.append(rij[1])

        plt.plot(date_list, score_List)
        plt.show()

    def pie_chart(self):
        dataLabels = "Negatief", "Neutraal", "Positief"
        dataSize = self.db.get_mood()
        colors = "firebrick", "yellow", "lightskyblue"
        explode = (0, 0, 0)
        plt.pie(dataSize, explode=explode, labels=dataLabels, colors=colors, autopct='%1.1f%%', shadow=True,
                startangle=90)
        plt.axis('equal')
        plt.show()

    def heat_map(self):
        # label = tk.Label(self, text="Heat Map", font=LARGE_FONT)
        # label.pack(pady=10, padx=10)

        title = "ROC's AUC"
        xlabel = "Timeshift"
        ylabel = "Scales"
        N = self.db.fetch_all_scores()
        data = np.random.rand(8, 12)

        f = plt.figure()
        plt.title(title)
        plt.xlabel(xlabel)
        plt.ylabel(ylabel)
        c = plt.pcolor(data, edgecolors='k', linewidths=4, cmap='RdBu', vmin=0.0, vmax=1.0)
        plt.colorbar(c)

        plt.show()
class Listener(StreamListener):
    # get a dictionary with keys for the twitter api
    # fr = open('config/config.json')
    # api_data = json.loads(fr.read())
    # fr.close()

    def __init__(self, save_location="data/tweets.json"):
        super().__init__()
        self.save_location = save_location
        self.count = 0
        self.analyser = MoodAnalyser()
        self.db = DataBase()
        self.max_tweets = 10000
        print("Listener created")

    def on_data(self, data):
        print("tweets receiving..")
        tweets = json.loads(data)
        try:
            if self.db.fetch_number_of_tweets() != self.max_tweets:
                timestamp = tweets["timestamp_ms"]
                tweet = tweets["text"]
                userData = tweets["user"]
                user = userData["screen_name"]

                if tweet.startswith("RT @") or tweet.startswith("@"):
                    return True
                if '"' in tweet:
                    tweet.replace('"', "")
                if '"' in user:
                    user.replace('"', "")

                self.db.insert_tweet(tweet, user, timestamp)
            else:
                # self.on_disconnect()
                self.analyser.start_up()
                return False
        except KeyError as e:
            print(e)

    def save_tweets(self):
        print("Saving tweets to tweets.json")
        f = open(os.path.dirname(__file__) + self.save_location, "w")
        f.write(jsonstruct.encode(self.tweets))
        f.close()

    # def create_tweet(self, status):
    #     return print(Tweet(status.text.encode("utf8"), str(status.created_at), status.user.screen_name))

    def on_error(self, status_code):
        sys.stderr.write("Error:" + str(status_code) + "\n")
        return False

    def on_limit(self, track):
        sys.stderr.write(track + "\n")
        return

    def on_timeout(self):
        sys.stderr.write("Timeout, sleeping for 60 seconds ...\n")
        time.sleep(60)
        return

    def on_disconnect(self):
        print("Disconnected")
        Stream.disconnect()
        return