import pandas as pd
import matplotlib.pyplot as plt
from datetime import date, timedelta
import requests

import Shushushu as sh


class CovidStatistics:
    def top_five(self):
        raise RuntimeError

    def image_create(self):
        raise RuntimeError


class CovidStats(CovidStatistics):

    def upload_chosen_date(self, y, m, d):
        if len(d) == 1:
            d = '0' + d
        url = f'https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/' \
              f'csse_covid_19_data/csse_covid_19_daily_reports/{m}-{d}-{y}.csv'
        data = pd.read_csv(url).sort_values('Confirmed', ascending=False)
        data['Province_State'] = data['Province_State'].fillna('')
        return data

    def upload(self, y=str(date.today() - timedelta(days=1))[:4],
               m=str(date.today() - timedelta(days=1))[5:7],
               d=str(date.today() - timedelta(days=1))[8:]):

        url = f'https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/' \
              f'csse_covid_19_data/csse_covid_19_daily_reports/{m}-{d}-{y}.csv'
        # data = pd.read_csv(url)
        try:
            # data = pd.read_csv(covid_collection.find()).sort_values('Confirmed', ascending=False)
            data = pd.DataFrame(sh.covid_collection_t.find()).sort_values('Confirmed', ascending=False)

        except:
            data = pd.read_csv(url).sort_values('Confirmed', ascending=False)
            with open("source_pack/Covid.csv", "wb") as file_c:
                file_c.write(requests.get(url).content)
                # data_dict = data.to_dict(orient='records')
                sh.covid_collection_t.insert_many(data.to_dict(orient='records'))
        data['Province_State'] = data['Province_State'].fillna('')
        return data

    def top_five(self, data):
        top_5 = data[['Province_State', 'Country_Region', 'Last_Update', 'Confirmed', 'Deaths', 'Recovered']].iloc[:5]
        text = ''
        for col in top_5:
            text += col + '\t\t'
        text += '\n\n'
        for i in top_5.values:
            for j in i:
                text += str(j) + '\t\t'
            text += '\n\n'
        return text

    def image_create(self, data):
        week_ago = date.today() - timedelta(days=7)
        y = str(week_ago)[: 4]
        m = str(week_ago)[5: 7]
        d = str(week_ago)[8:]

        url = f'https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/' \
              f'csse_covid_19_data/csse_covid_19_daily_reports/{m}-{d}-{y}.csv'
        # data_ago = pd.read_csv(url)
        # data_ago = data_ago.sort_values('Confirmed', ascending=False)

        try:
            # data = pd.read_csv(covid_collection.find()).sort_values('Confirmed', ascending=False)
            data_ago = pd.DataFrame(sh.covid_collection_wa.find()).sort_values('Confirmed', ascending=False)
        except:
            data_ago = pd.read_csv(url).sort_values('Confirmed', ascending=False)
            with open("source_pack/Covid.csv", "wb") as file_c:
                file_c.write(requests.get(url).content)
                # data_dict = data.to_dict(orient='records')
                sh.covid_collection_wa.insert_many(data_ago.to_dict(orient='records'))

        all_confirmed = data['Confirmed'].sum()
        all_confirmed_ago = data_ago['Confirmed'].sum()
        all_dead = data['Deaths'].sum()
        all_dead_ago = data_ago['Deaths'].sum()
        all_recov = data['Recovered'].sum()
        all_recov_ago = data_ago['Recovered'].sum()

        fig, ax = plt.subplots(figsize=(15, 15))
        ax.bar("Confirmed til yesterday", all_confirmed, color="#FFA07A")
        ax.bar("Confirmed til week ago", all_confirmed_ago, color="#7CFC00")
        ax.bar("Dead til yesterday", all_dead, color="#FFA07A")
        ax.bar("Dead til week ago", all_dead_ago, color="#7CFC00")
        ax.bar("Recovered til yesterday", all_recov, color="#FFA07A")
        ax.bar("Recovered til week ago", all_recov_ago, color="#7CFC00")
        plt.title("Covid_statistics")
        fig.savefig("source_pack/Covid_statistics")

        fig, ax = plt.subplots(figsize=(15, 15))

        ax.bar("Confirmed", all_confirmed - all_confirmed_ago, color="#FFA07A")
        ax.bar("Dead", all_dead - all_dead_ago, color="#B0E0E6")
        ax.bar("Recovered", all_recov - all_recov_ago, color="#7CFC00")
        plt.title("Weekly changes in...")
        fig.savefig("source_pack/Covid_weekly_changes")


class CovidStatsDaily(CovidStatistics):
    @staticmethod
    def read_covid_data(date):
        y = str(date)[: 4]
        m = str(date)[5: 7]
        d = str(date)[8:]

        url = f'https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/' \
              f'csse_covid_19_data/csse_covid_19_daily_reports/{m}-{d}-{y}.csv'
        return pd.read_csv(url)

    def __init__(self):
        self.today = date.today() - timedelta(days=1)  # т.к. выкладывают поздно, от-но мск времени
        self.yesterday = date.today() - timedelta(days=2)

        self.data_t = self.read_covid_data(self.today)
        self.data_y = self.read_covid_data(self.yesterday)

        self.data_t = self.data_t.sort_values('Confirmed', ascending=False)
        self.data_y = self.data_y.sort_values('Confirmed', ascending=False)

        self.confirmed_dif = self.data_t['Confirmed'].sum() - self.data_y['Confirmed'].sum()
        self.dead_dif = self.data_t['Deaths'].sum() - self.data_y['Deaths'].sum()
        self.recov_dif = self.data_t['Recovered'].sum() - self.data_y['Recovered'].sum()

    def image_create(self):
        fig, ax = plt.subplots(figsize=(15, 15))

        ax.bar("Confirmed", self.confirmed_dif, color="#FFA07A")
        ax.bar("Dead", self.dead_dif, color="#B0E0E6")
        ax.bar("Recovered", self.recov_dif, color="#7CFC00")
        # plt.text("Confirmed", all_confirmed_dif, str(all_confirmed_dif))
        plt.title(f"Daily changes in... (from {self.yesterday} to {self.today})")
        fig.savefig("source_pack/Covid_stats")

    def top_five(self):
        top_5_t = self.data_t[
                      ['Province_State', 'Country_Region', 'Last_Update', 'Confirmed', 'Deaths', 'Recovered']].iloc[:5]
        top_5_y = self.data_y[
                      ['Province_State', 'Country_Region', 'Last_Update', 'Confirmed', 'Deaths', 'Recovered']].iloc[:5]

        fig = plt.figure(figsize=(15, 15))
        plt.subplot(1, 2, 1).set_title("Today")
        ax = plt.pie(top_5_t["Confirmed"], labels=top_5_t["Country_Region"], autopct='%1.1f%%')
        plt.subplot(1, 2, 2).set_title("Yesterday")
        ax = plt.pie(top_5_y["Confirmed"], labels=top_5_t["Country_Region"], autopct='%1.1f%%')
        fig.savefig("source_pack/Top_5_pie")

        fig = plt.figure(figsize=(15, 15))
        plt.subplot(2, 1, 1).set_title("Today")
        ax = plt.bar(top_5_t["Country_Region"], top_5_t["Confirmed"], color="#FF6347")
        plt.subplot(2, 1, 2).set_title("Yesterday")
        ax = plt.bar(top_5_y["Country_Region"], top_5_y["Confirmed"], color="#87CEFA")
        fig.savefig("source_pack/Top_5_bar")

        self.data_t = self.data_t.sort_values('Deaths', ascending=False)
        self.data_y = self.data_y.sort_values('Deaths', ascending=False)
        top_5_t = self.data_t[
                      ['Province_State', 'Country_Region', 'Last_Update', 'Confirmed', 'Deaths', 'Recovered']].iloc[:5]
        top_5_y = self.data_y[
                      ['Province_State', 'Country_Region', 'Last_Update', 'Confirmed', 'Deaths', 'Recovered']].iloc[:5]

        fig = plt.figure(figsize=(15, 15))
        plt.subplot(2, 1, 1).set_title("Today")
        ax = plt.bar(top_5_t["Country_Region"], top_5_t["Deaths"], color="#FF6347")
        plt.subplot(2, 1, 2).set_title("Yesterday")
        ax = plt.bar(top_5_y["Country_Region"], top_5_y["Deaths"], color="#87CEFA")
        fig.savefig("source_pack/Top_5_bar_death")