# -*- coding: utf-8 -*-
"""
Created on Wed Apr 13 21:03:19 2016

@author: aniruddha
"""


from datetime import datetime, date, time
import glob
import numpy as np
import os
import datetime
import matplotlib.pyplot as plt
import matplotlib.dates as md
from pylab import *
import pickle
import pdb

import sqlite3 as lite
import sys
import re

f1 = open('street_names.pckl', 'rb')
Street_Names = pickle.load(f1)
f1.close()


f1 = open('Selected_Street_LatLong.pckl', 'rb')
Selected_Steer_Lat_Long = pickle.load(f1)
f1.close()


Dbconnection_Clean = lite.connect('ParkData_Selected_Clean.db')

with Dbconnection_Clean:
        cur1 = Dbconnection_Clean.cursor()
        cur1.execute("CREATE TABLE ParkDataTable(StreetId TEXT, Date TEXT, Time TEXT, Used_Slot INT, Allowed_Slot_cleaned INT,Allowed_Slot INT )")

        Dbconnection = lite.connect('ParkData_new.db')     

        #query="select * from ParkDataTable where StreetId='B422021' and Date='08-04'  order by Time asc"
        #query="select * from ParkDataTable where StreetId='B442061' and Date='09-24'"
        #query="select * from ParkDataTable where StreetId='B442061' and Date between '09-24' and  '09-29'"

        for streetD in Selected_Steer_Lat_Long :        
                streetData1=[]
                #pdb.set_trace()
                strName=streetD[0]
                print(streetD[1] + "  "+ streetD[0])
                strName= "'B" + strName + "'"
                #query="select * from ParkDataTable where StreetId='B442061' order by Date, Time"
                query="select * from ParkDataTable where StreetId= " + strName + " order by Date, Time"
                with Dbconnection :
                     cur = Dbconnection.cursor()     
                     for row in cur.execute(query):
                         streetData1.append(row)
                
                
                date1=np.array([a[1] for a in streetData1])       
                time1=np.array([a[2] for a in streetData1])       
                occ1=np.array([a[3] for a in streetData1])
                tavail1=np.array([a[4] for a in streetData1])
                tavail=np.array([a[4] for a in streetData1])
                
                
                
                
                
                uniqueLevel=set(tavail1)
                
                for lev in uniqueLevel :
                    #pdb.set_trace()
                    if lev !=0:
                        # Find Indices
                        indices=[index for index,value in enumerate(tavail) if value==lev]
                        # small length
                        if len(indices) < 10000 : 
                            occ_m=[occ1[x] for x in indices]
                            maxOcc = max(occ_m)
                            for indx in indices :
                                tavail1[indx]=maxOcc
                        else  :
                            mark1=0
                            mark2=5000
                            mult=0;
                            while mark2 < len(indices):
                                
                                maxOcc=max([occ1[x] for x in indices[mark1:]])
                                for indx in indices[mark1:mark2] :
                                    tavail1[indx]=maxOcc
                                mark1=mark1+5000
                                mark2=mark2+5000
                                
                            
                            
                            maxOcc=max([occ1[x] for x in indices[mark1:]])
                            for indx in indices[mark1:] :
                                tavail1[indx]=maxOcc
                                
                bar=[]
                barheight=max(tavail)+1
                
                for a in streetData1 :
                    tm=a[2]
                    if tm == '00:01' or tm== '00:00' :
                         bar.append(barheight)
                
                    else :
                         bar.append(0)
                         

                
                for i in range(8):

                        fig=plt.figure(figsize=(19,2))
                        plt.plot(occ1[i*10000:(i+1)*10000-1], 'r', label='occ')
                        plt.plot(tavail[i*10000:(i+1)*10000-1], 'g', label='total avail')
                        plt.plot(tavail1[i*10000:(i+1)*10000-1], 'b', label='total avail_predicted')
                        plt.plot(bar[i*10000:(i+1)*10000-1], 'k' )
                        plt.legend()
                        figloc= '../Parking_v2/figsCleaned/' + streetD[0]
                        numstr='{0}.eps'.format(i+1)
                        figstr=figloc+ '_' + numstr
                        plt.savefig(figstr, format='eps')
                        
                        #plt.show()
                        plt.close(fig)

                date1=date1.tolist()
                time1=time1.tolist()  
                occ1=occ1.tolist()
                tavail1=tavail1.tolist()
                tavail=tavail.tolist()
                #pdb.set_trace()
                for indx in range(len(streetData1)) : 

                    try:
                        item3=int(occ1[indx]) # TOTAL: total number of parking spot used as gathered from working sensors
                    except ValueError :
                        item3=0
                      
                    try:
                        item4= int(tavail1[indx]) # TOTAL: total number of sensor working
                    except ValueError :
                        item4=0

                    try:
                        item5= int(tavail[indx]) # TOTAL: total number of parking space reported
                    except ValueError :
                        item5=0
                    streetIdentification = "B"+ streetD[0]
                    cur1.execute("INSERT INTO ParkDataTable VALUES(?,?,?,?,?,?)", (streetIdentification ,date1[indx],time1[indx],item3,item4, item5))   
                    
                del occ1
                del tavail1
                del tavail
                del streetData1

        Dbconnection_Clean.commit()       
                    
        
        
        
    
    








