#!/usr/bin/python
# -*- coding: latin-1 -*-

import os
import platform
import sqlite3 as lite
import pandas as pd
import datetime
import numpy as np
import pickle
import matplotlib.pyplot as plt
import time
import FreeSolRaspi_Helper

Version= "0.95"

Plattform=FreeSolRaspi_Helper.Plattform_Konfiguration()

# Für Raspi die Grafikausgabe umleiten
if os.environ.get('DISPLAY','') == '':
    print('No display found. Using non-interactive Agg backend')
    plt.switch_backend('Agg')


## Konfiguration von Displayparametern in der Konsole
#pd.set_option('display.max_rows', None)
#pd.set_option('display.max_columns', None)
#pd.set_option('display.width', 2000)
## SettingWithCopyWarning aus:
pd.options.mode.chained_assignment = None  # default='warn'



def AktuelleSolarleistung():
    ##################### Solarzähler
    FreeSolRaspi_Helper.InitialisiereDB(Plattform.db_filename)
    
    # DB Lesen 
    #gestern = (datetime.date.today() - datetime.timedelta(days=1)).strftime('%y%m%d')
    heute = (datetime.date.today()).strftime('%Y-%m-%d')
    #print(heute)
    con = lite.connect(Plattform.db_filename)          
    
    with con:    
        query = '''SELECT *
                   FROM SolarS0
                   WHERE SUBSTR(date,0,11) = ''' 
        query =query+ "'" + heute + "'"
        
        df00 = pd.read_sql(query, con)        
    con.close()  
    
    df00=df00.dropna(how='all') 
    
    df00=df00.replace('', np.nan, regex=True)
    #print(df00)
    
    
    #Gesamtenergie Tag
    if df00["S0"].count() >0:
        PGesamtHeute=  df00["S0"].sum()
    else:
        PGesamtHeute=  0
    #print(PGesamtHeute)
         
    #Letzte Leistung
    if df00["S0"].count() >0:
        ZeitpunktLetztes=df00.iloc[-1]['date']
        PGesamtLetzes= str(int(df00.iloc[-1]['S0'])*60)
    else:
        ZeitpunktLetztes="-"
        PGesamtLetzes= "0.0"
    #print(ZeitpunktLetztes, PGesamtLetzes)
    
    #Maximalleistung
    if df00["S0"].count() >0:
        ColMax=df00.ix[df00['S0'].idxmax()]
        ZeitpunktMax=ColMax['date']
        PMax= str(int(ColMax['S0'])*60)
    else:
        ZeitpunktMax="-"
        PMax= "0.0"
    #print(ZeitpunktMax, PMax)
    
    
    ### Vortag
    gestern = (datetime.date.today() - datetime.timedelta(days=1)).strftime('%Y-%m-%d')
    con = lite.connect(Plattform.db_filename)          
    
    with con:    
        query = '''SELECT *
                   FROM SolarS0
                   WHERE SUBSTR(date,0,11) = ''' 
        query =query+ "'" + gestern + "'"
    
        df00 = pd.read_sql(query, con)        
    con.close()  
    
    df00=df00.dropna(how='all') 
    
    df00=df00.replace('', np.nan, regex=True)
    #print(df00)
    
    #Gesamtenergie Tag gestern
    if df00["S0"].count() >0:
        PGesamtGestern=  df00["S0"].sum()
    else:
        PGesamtGestern=  0
    #print(PGesamtGestern)  
    
    #Maximalleistung gestern
    if df00["S0"].count() >0:
        ColMax=df00.ix[df00['S0'].idxmax()]
        ZeitpunktMaxGestern=ColMax['date']
        PMaxGestern= str(int(ColMax['S0'])*60)
    else:
        ZeitpunktMaxGestern="-"
        PMaxGestern= "0.0"

    #print(ZeitpunktMaxGestern, PMaxGestern)
    
    ### Letzter Messwert
    con = lite.connect(Plattform.db_filename)          
    
    with con:    
        query = '''SELECT *
                   FROM SolarS0
                   ORDER BY date DESC LIMIT 1''' 
    
        df00 = pd.read_sql(query, con)        
    con.close()  
    
    LetzterZeitpunkt=df00.iloc[0]['date']
    LetzterMesswert=df00.iloc[0]['S0']
    #print(LetzterZeitpunkt)
    #print(LetzterMesswert)
    
    
    return ZeitpunktLetztes, PGesamtLetzes, PGesamtHeute, ZeitpunktMax, PMax, PGesamtGestern, ZeitpunktMaxGestern, PMaxGestern, LetzterZeitpunkt, LetzterMesswert



def Abfrage(Art = 'Stunden', Tag='000000', Monat='0000', Jahr='00'):
    # Art aus 
    #    'Tag': Zusätzlich Tag = '160115' 
    
    FreeSolRaspi_Helper.InitialisiereDB(Plattform.db_filename)
    
    ##################### Bezugs- Einspeisezähler
    # DB Lesen  
    con = lite.connect(Plattform.db_filename)   
    
    with con:    
        query = '''SELECT *
                   FROM SolarS0'''
    
        df = pd.read_sql(query, con)        
    
    # Heraussuchen des Tags
    if Art == 'Tag':
        df2=df[df['date'].str[2:10]==Tag[0:2]+"-"+Tag[2:4]+"-"+Tag[4:6]]
        df2['date']=df2['date'].str[11:13]
        df3=pd.pivot_table(df2,index=["date"],aggfunc=np.sum)     
    elif Art == 'Monat':
        df2=df[df['date'].str[2:7]==Monat[0:2]+"-"+Monat[2:4]]
        df2['date']=df2['date'].str[8:10]
        df3=pd.pivot_table(df2,index=["date"],aggfunc=np.sum)     
    elif Art == 'Jahr':
        df2=df[df['date'].str[2:4]==Jahr[0:2]]
        df2['date']=df2['date'].str[5:7]
        df3=pd.pivot_table(df2,index=["date"],aggfunc=np.sum)     

    try: 
        df3["S0"]=df3["S0"]/1000.0
        print(df3)
    except:
        print("Leere Daten")
        return -1        
    ##################### Ausgabe in Mathplotlib
    Solarerzeugung = round(df3['S0'].sum(),2)
    kWhProkWp= round(Solarerzeugung/11.27, 2)
    print("Sol: "+ str( Solarerzeugung)+ " kWh")
    print("kWh/kWp: " + str(kWhProkWp) + " kWh")
    
    if Art =='Stunden' or Art == 'Tag':# or Art == 'Viertelstunden':
        if len(df3)>0:
            ax= df3.plot(kind='bar',stacked=True, color=['y', 'b', 'r', 'g'])
            ax.set_xlabel("Zeitpunkt",fontsize=12)
            ax.set_ylabel("kWh",fontsize=12)           
    
            if Art=='Tag':
                ax.set_title("Energie pro h in kWh am "+Tag)
            #elif  Art=='Stunden':
                #ax.set_title("Energie pro h in kWh")
            #elif Art=='Viertelstunde':
                #ax.set_title("Energie pro Viertelstunde in kWh am "+Tag)            
            
            # nur jede n-ten Tick beschriften
            n=2
            labels = [item.get_text() for item in ax.get_xticklabels()]
            for i in range(len(labels)):
                if i/n!=i//n:
                    labels[i] = ''
            ax.set_xticklabels(labels)
            plt.tight_layout() 
            
            # Shrink current axis by 30%
            box = ax.get_position()
            ax.set_position([box.x0, box.y0 +box.height*0.13, box.width, box.height*0.65])
            
            # Put a legend to the right of the current axis
            ax.legend(loc='upper left', bbox_to_anchor=(0.0,-0.21), ncol=2) #1.36
            
            #Kennzahlen zufügen:
            plt.figtext(.35, .07,  "Solarerzeugung: "+ str( Solarerzeugung)+ " kWh",  fontsize=10)                   
            plt.figtext(.7, .07, "kWh / kWp: "+str(kWhProkWp)+ " kWh",  fontsize=10)                   
                  
            #if Art=='Stunden':
                #plt.savefig(pfad+"Stundenwerte")
            if Art == 'Tag':
                plt.savefig(Plattform.bildpfad+"Stundenwerte "+Tag)
            #elif Art == 'Viertelstunden':
                #plt.savefig(pfad+"Viertelstundenwerte "+Tag)
            
            return 0
        else:
            print("Leere Daten")
            return -1
    
    elif Art =="Monat":
        #print(df3)
        if len(df3)>0:
            ax= df3.plot(kind='bar',stacked=True, color=['y', 'b', 'r', 'g'])
            ax.set_xlabel("Zeitpunkt",fontsize=12)
            ax.set_ylabel("kWh",fontsize=12)    
            
            ax.set_title("Energie pro Tag in kWh: "+Monat)
            
            plt.tight_layout() 
    
            # Shrink current axis by 30%
            box = ax.get_position()
            ax.set_position([box.x0, box.y0 +box.height*0.13, box.width, box.height*0.65])
            
            # Put a legend to the right of the current axis
            ax.legend(loc='upper left', bbox_to_anchor=(0.0,-0.21), ncol=2) #1.36
            
            #Kennzahlen zufügen:
            plt.figtext(.35, .07,  "Solarerzeugung: "+ str( Solarerzeugung)+ " kWh",  fontsize=10)                   
            plt.figtext(.7, .07, "kWh / kWp: "+str(kWhProkWp)+ " kWh",  fontsize=10)                   

            plt.savefig(Plattform.bildpfad+ "Monatswerte " +Monat)        
            return 0
        else:
            return -1
    
    elif Art =="Jahr":
        if len(df3)>0:
            ax= df3.plot(kind='bar',stacked=True, color=['y', 'b', 'r', 'g'])
            ax.set_xlabel("Zeitpunkt",fontsize=12)
            ax.set_ylabel("kWh",fontsize=12)    
            
            ax.set_title("Energie pro Monat in kWh: "+Jahr)
            
            plt.tight_layout() 
    
            # Shrink current axis by 30%
            box = ax.get_position()
            ax.set_position([box.x0, box.y0 +box.height*0.13, box.width, box.height*0.65])
            
            # Put a legend to the right of the current axis
            ax.legend(loc='upper left', bbox_to_anchor=(0.0,-0.21), ncol=2) #1.36
            
            #Kennzahlen zufügen:
            plt.figtext(.35, .07,  "Solarerzeugung: "+ str( Solarerzeugung)+ " kWh",  fontsize=10)                   
            plt.figtext(.7, .07, "kWh / kWp: "+str(kWhProkWp)+ " kWh",  fontsize=10)                   
     
            plt.savefig(Plattform.bildpfad+ "Jahreswerte " +Jahr)        
            return 0
        else:
            return -1
    
        
    ##plt.draw()    
    ##plt.show()
    return 0

def Abfrage_Collect(Art = 'Monat', Monat='0000', Jahr='00'):
    FreeSolRaspi_Helper.InitialisiereDB(Plattform.db_filename)
    
    ##################### Bezugs- Einspeisezähler
    # DB Lesen  
    con = lite.connect(Plattform.db_filename)   
    
    with con:    
        query = '''SELECT *
                   FROM SolarS0'''
    
        df = pd.read_sql(query, con)        
    
    # Heraussuchen der Tage im Monat
    if Art == 'Monat':
        df2=df[df['date'].str[2:7]==Monat[0:2]+"-"+Monat[2:4]]
        df2['date']=df2['date'].str[8:10]
        df3=pd.pivot_table(df2,index=["date"],aggfunc=np.sum)     
    try: 
        df3["S0"]=df3["S0"]/1000.0
        #print(df3)
    except:
        print("Leere Daten")
        return -1   
    
    index=df3.index.tolist()
    index=[int(i) for i in index]
    return dict(zip(index, df3.values[:,0].tolist()))

def Status_Tagesspeicher(Art = 'Monat', Monat='0000', Jahr='00'):
    FreeSolRaspi_Helper.InitialisiereDB(Plattform.db_filename)
    
    ##################### Bezugs- Einspeisezähler
    # DB Lesen  
    con = lite.connect(Plattform.db_filename)   
    
    # Tabelle anlegen wenn nicht vorhanden
    with con:    
        query = '''SELECT count(*) FROM sqlite_master WHERE type='table' AND name='SolarS0' 
        '''
    
        df = pd.read_sql(query, con)        
    
    if df.values[0,0]==0:
        pass
        
   
    
    

if __name__ == '__main__':
    #Ergebnis=Abfrage(Art='Tag', Tag='181023')
    print(Status_Tagesspeicher(Art='Monat', Monat='1810'))
    
    #Ergebnis=Abfrage_Collect(Art='Monat', Monat='1810')
    #print(Ergebnis)
###   Ergebnis=Abfrage(Art='Jahr', Jahr='18')    
    #print(Ergebnis)
    #a,b,c,d,e,f,g,h, i, j=AktuelleSolarleistung()
    #print(a)
    #print(b)
    #print(c)
    #print( d)
    #print( e)
    #print( f)
    #print( g)
    #print( h)
    #print( i)
    #print( j)
    
