﻿# -*- coding: utf-8 -*-
import sys
import os
from decimal import Decimal
from datetime import datetime, timedelta
sedt = [0, 999999, '', '']


def days_hours_minutes(td):
    m = td.days * 24 *60
    m+= td.seconds//60
    return int(m)


def MakeRainChart(drows, pos, titles, vsuffix):
    logstr = ""
    series = {}
    series_list = []
    selectedPeriod = '... - ...'
    lgth = 0
    
    if len(drows)>0:
        for key in drows:
            if len(drows[key]) != 0:
                # convert the data into a table
                tableId = key
                data = []
                series = {}
                rows = drows[key]
                periodRain = str(rows[-1][4]-rows[0][4])
                selectedPeriod = str(rows[0][0][:-3])+' - '+str(rows[-1][0][:-3])        
                pD = str(rows[0][0][:-3]).split(' ')[0].split('-')
                pT = str(rows[0][0][:-3]).split(' ')[1].split(':')
                pointStart = pD + pT
                diff = 0
                bFirstDone = False
                for row in rows:
                    rt = row[0][:-3].split(' ')[1].split(':')
                    if bFirstDone:
                        if int(rt[1])>int(rt_old[1]):
                            diff = int(rt[1]) - int(rt_old[1])
                        if int(rt[1])<int(rt_old[1]):
                            diff = (60 - int(rt_old[1])) + int(rt[1])
                        if diff > 1:
                            for i in range(diff-1):
                                data.append(0.0)
                            diff = 0
                        if int(rt[1])<>int(rt_old[1]):
                            if row[pos] != r_old:
                                rd = row[pos]-r_old
                                data.append(rd)
                            if row[pos] == r_old:
                                rd = 0.0
                                data.append(rd)
                            rt_old = rt
                            r_old =row[pos]
                    else:
                        bFirstDone = True
                        data.append(0.0)
                        rt_old = rt
                        r_old =row[pos]
                series['name'] = "Rain level"
                series['data'] = data
                series_list.append(series)
                lgth = len(data)
            else:
                print "No data found during specified range for", key

        if len(drows)>0 and lgth>0:
            logstr += "<p><small>Selected period: "+selectedPeriod+"</small></p>"+'\n\r'
            logstr += "<p><small>Total rain during period: "+periodRain+" mm</small></p>"+'\n\r'
            logstr += HighchartSnippet('column', tableId, titles, vsuffix, series_list, pointStart)

    return logstr


def MakeLightChart(drows, pos, titles, vsuffix):
    logstr = ""
    series_list = []
    data = []
    selectedPeriod = '... - ...'
    lgth = 0
    
    if len(drows)>0:
        for key in drows:
            if len(drows[key]) != 0:
                # convert the data into a table
                data = []
                series = {}
                rows = drows[key]
                selectedPeriod = str(rows[0][0][:-3])+' - '+str(rows[-1][0][:-3])                
                pD = str(rows[0][0][:-3]).split(' ')[0].split('-')
                pT = str(rows[0][0][:-3]).split(' ')[1].split(':')
                pointStart = pD + pT
                diff = 0
                bFirstDone = False
                for row in rows:
                    rd = float("%.2f" % row[pos])
                    rd = rd*10.0 + 60.0
                    rt = row[0][:-3].split(' ')[1].split(':')
                    if bFirstDone:
                        if int(rt[1])>int(rt_old[1]):
                            diff = int(rt[1]) - int(rt_old[1])
                        if int(rt[1])<int(rt_old[1]):
                            diff = (60 - int(rt_old[1])) + int(rt[1])
                        if diff > 1:
                            rd_old = float("%.2f" % row_old[pos])
                            rd_old = rd_old*10.0 + 60.0
                            for i in range(diff-1):
                                data.append(rd_old)
                            diff = 0
                        if not int(rt[1])==int(rt_old[1]):
                            data.append(rd)
                    else:
                        data.append(rd)
                        bFirstDone = True
                    rt_old = rt
                    row_old = row
                series['name'] = str(key.encode('utf-16'))[2:]
                series['data'] = data
                series_list.append(series)
                lgth = len(data)
            else:
                print "No data found during specified range for", key
        
        if len(drows)>0 and lgth>0:
            data = []
            series = {}
            for i in range (0, lgth):
                data.append(79.0)
            series['name'] = 'UpLevel'
            series['data'] = data
            series_list.append(series)
           
            data = []
            series = {}
            for i in range (0, lgth):
                data.append(81.0)
            series['name'] = 'DownLevel'
            series['data'] = data
            series_list.append(series)
            logstr += "<p><small>Selected period: "+selectedPeriod+"</small></p>"+'\n\r'
            logstr += HighchartLightSnippet('spline', titles, titles, vsuffix, series_list, pointStart)

    return logstr


def MakeDewPointChart(drows, pos, titles, vsuffix):
    logstr = ""
    series_list = []
    data = []
    selectedPeriod = '... - ...'
    lgth = 0
    
    if len(drows)>0:
        for key in drows:
            if len(drows[key]) != 0:
                # convert the data into a table
                data = []
                series = {}
                rows = drows[key]
                selectedPeriod = str(rows[0][0][:-3])+' - '+str(rows[-1][0][:-3])        
                pD = str(rows[0][0][:-3]).split(' ')[0].split('-')
                pT = str(rows[0][0][:-3]).split(' ')[1].split(':')
                pointStart = pD + pT
                diff = 0
                bFirstDone = False
                for row in rows:
                    rd = row[pos]
                    rt = row[0][:-3].split(' ')[1].split(':')
                    if bFirstDone:
                        if int(rt[1])>int(rt_old[1]):
                            diff = int(rt[1]) - int(rt_old[1])
                        if int(rt[1])<int(rt_old[1]):
                            diff = (60 - int(rt_old[1])) + int(rt[1])
                        if diff > 1:
                            rd_old = row_old[pos]
                            for i in range(diff-1):
                                data.append(rd_old)
                            diff = 0
                        if not int(rt[1])==int(rt_old[1]):
                            data.append(rd)
                    else:
                        data.append(rd)
                        bFirstDone = True
                    rt_old = rt
                    row_old = row
                series['name'] = str(key.encode('utf-16'))[2:]
                series['data'] = data
                series_list.append(series)
                lgth = len(data)
            else:
                print "No data found during specified range for", key
    
        if len(drows)>0 and lgth>0:
            logstr += "<p><small>Selected period: "+selectedPeriod+"</small></p>"+'\n\r'
            logstr += HighchartSnippet('spline', titles, titles, vsuffix, series_list, pointStart)

    return logstr

    
def MakeChart(drows, pos, titles, vsuffix):
    logstr = ""
    series = {}
    series_list = []
    selectedPeriod = '... - ...'
    lgth = 0
    d1 = datetime.now()
        
    if len(drows)>0:
        for key in drows:
            if len(drows[key]) != 0:
                rows = drows[key]
                start = days_hours_minutes(d1 - datetime.strptime(str(rows[0][0][:-3]), '%Y-%m-%d %H:%M'))
                end = days_hours_minutes(d1 - datetime.strptime(str(rows[-1][0][:-3]), '%Y-%m-%d %H:%M'))
                if start > sedt[0]:
                    sedt[0] = start
                    sedt[2] = str(rows[0][0][:-3])
                if end < sedt[1]:
                    sedt[1] = end
                    sedt[3] = str(rows[-1][0][:-3])
                selectedPeriod = sedt[2]+' - '+sedt[3]
                pD = sedt[2].split(' ')[0].split('-')
                pT = sedt[2].split(' ')[1].split(':')
                pointStart = pD + pT
        

    if len(drows)>0:
        for key in drows:
            if len(drows[key]) != 0:
                # convert the data into a table
                tableId = str(key.encode('utf-16'))[2:]
                data = []
                series = {}
                rows = drows[key]
                diff = 0
                bFirstDone = False
                for row in rows:
                    rd = float("%.2f" % row[pos])
                    rt = row[0][:-3].split(' ')[1].split(':')
                    if bFirstDone:
#                        rc = row[0][:-3].split(' ')[0].split('-')
#                        if rc[2]=='08' and rt[0]=='14':
#                            print row
                        if int(rt[0]) >= int(rt_old[0]):
                            diff = (int(rt[0])*60 + int(rt[1])) - (int(rt_old[0])*60 + int(rt_old[1]))
                        if int(rt[0])<int(rt_old[0]):
                            diff = (24*60 + int(rt[1])) - (int(rt_old[0])*60 + int(rt_old[1]))
                        if diff > 0:
#                            if diff > 2:
#                                print row_old
#                                print row
                            rd_old = float("%.2f" % row_old[pos])
                            for i in range(diff-1):
                               data.append(rd_old)
                            diff = 0
                            data.append(rd)
                    else:
                        s = days_hours_minutes(d1 - datetime.strptime(str(rows[0][0][:-3]), '%Y-%m-%d %H:%M'))
                        if sedt[0] - s > 0:
                            for i in range(sedt[0] - s):
                                data.append(0.0) 
                        data.append(rd)
                        bFirstDone = True
                    rt_old = rt
                    row_old = row
                series['name'] = tableId
                series['data'] = data
                series_list.append(series)
                lgth = len(data)
            else:
                print "No data found during specified range for", key
        
        if len(drows)>0 and lgth>0:
            logstr += "<p><small>Selected period: "+selectedPeriod+"</small></p>"+'\n\r'
            logstr += HighchartSnippet('spline', tableId, titles, vsuffix, series_list, pointStart)

    return logstr


def CreateComboHtml(
    rprtName, 
    dataType, 
    fPath, 
    rows_1, 
    titles_1, 
    pos_1, 
    rows_2, 
    titles_2, 
    pos_2, 
    rows_3, 
    titles_3, 
    pos_3, 
    rows_4, 
    titles_4, 
    pos_4,
    rows_5, 
    titles_5, 
    pos_5,
    rprtTitle,
    rprtHeading
):
    # start creating the html page
    base_1 = """<!DOCTYPE HTML><html><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/><title>"""
    base_2 = """</title><h1>"""
    base_3 = """</h1>
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
    <body>
    <script src="js/highcharts.js"></script>
    <script src="js/modules/exporting.js"></script>
   	</body>
    </html> """
  
    logstr = MakeChart(rows_1, pos_1, 'Temperature', ' degrees C')
    logstr += MakeChart(rows_2, pos_2, 'Humidity', ' percent RH')
    logstr += MakeRainChart(rows_3, pos_3, 'Rain level', ' mm')
    logstr += MakeLightChart(rows_4, pos_4, 'Light level', ' pts')
    logstr += MakeDewPointChart(rows_5, pos_5, 'Dewpoint delta', ' degrees C')
    logstr = base_1 + rprtTitle + base_2 + rprtHeading + base_3 + logstr 
    
    fName = rprtName+'.html'
    fileHandle = None
    if not os.path.exists(fPath) and not os.path.isdir(fPath):
        os.makedirs(fPath)
    fileHandle = open(fPath+'/'+fName, 'a')
    fileHandle.seek(0)
    fileHandle.truncate()
    fileHandle.write(logstr.encode('utf-8'))
    fileHandle.close()


def HighchartLightSnippet(typ, tableId, titles, vsuffix, series, pointStart):
    c_code_0 = """
    <div id='"""
    c_code_0_1 = titles.replace(' ', '_')
    c_code_0_2 = """' style="min-width: 1000px; height: 450px; margin: 0 auto"></div>"""
    c_code_1 = """
    <script type="text/javascript">
    $(function () {
    $('#"""
    c_code_1_1 = titles.replace(' ', '_')
    c_code_1_2 = """').highcharts({
    chart: {
    type: '"""
    c_code_1_3 = typ
    c_code_1_4 = """',
    zoomType: 'x',
    panning: true,
    panKey: 'shift'
    },
    title: {
    text: '"""
    c_code_2 = titles
    c_code_3_1 = """',
    x: -20
    },
    xAxis: {
    type: "datetime"
    },
    plotOptions: {
    series: {
    pointStart: Date.UTC("""
    c_code_3_2_1 = str(int(pointStart[0]))
    c_code_3_2_2 = ','
    c_code_3_2_3 = str(int(pointStart[1])-1)
    c_code_3_2_4 = ','
    c_code_3_2_5 = str(int(pointStart[2]))
    c_code_3_2_6 = ','
    c_code_3_2_7 = str(int(pointStart[3]))
    c_code_3_2_8 = ','
    c_code_3_2_9 = str(int(pointStart[4]))
    c_code_3_3 = """),
    pointInterval: 60 * 1000 // one per minut
    }
    },
    yAxis: {
    title: {
    text: '"""
    c_code_5_1 = titles
    c_code_5_2 = """'
    },
    plotOptions: {
    spline: {
    lineWidth: 4,
    states: {
    hover: {
    lineWidth: 5
    }
    },
    marker: {
    enabled: false,
    states: {
    hover: {
    enabled: true,
    symbol: 'circle',
    radius: 5,
    lineWidth: 1
    }
    }
    }
    }
    },
    gridLineWidth: 2,
    plotLines: [{
    value: 0,
    width: 1,
    color: '#808080'
    }],
    },
    tooltip: {
    valueSuffix: '"""
    c_code_5_3 = vsuffix
    c_code_5_4 = """'
    },
    legend: {
    layout: 'vertical',
    align: 'right',
    verticalAlign: 'middle',
    borderWidth: 0
    },
    series: """
    c_code_6 = str(series).replace("'data':", "data:")
    c_code_6 = c_code_6.replace("'name':", "name:")
    c_code_7 = """
    });
    });
    </script>
    """    
    
    c_code = (
        c_code_0+
        c_code_0_1+
        c_code_0_2+
        c_code_1+
        c_code_1_1+
        c_code_1_2+
        c_code_1_3+
        c_code_1_4+
        c_code_2+
        c_code_3_1+
        c_code_3_2_1+
        c_code_3_2_2+
        c_code_3_2_3+
        c_code_3_2_4+
        c_code_3_2_5+
        c_code_3_2_6+
        c_code_3_2_7+
        c_code_3_2_8+
        c_code_3_2_9+
        c_code_3_3+
        c_code_5_1+
        c_code_5_2+
        c_code_5_3+
        c_code_5_4+
        c_code_6+
        c_code_7
    )
    return c_code


def HighchartSnippet(typ, tableId, titles, vsuffix, series, pointStart):
    c_code_0 = """
    <div id='"""
    c_code_0_1 = titles.replace(' ', '_')
    c_code_0_2 = """' style="min-width: 1000px; height: 450px; margin: 0 auto"></div>"""
    c_code_1 = """
    <script type="text/javascript">
    $(function () {
    $('#"""
    c_code_1_1 = titles.replace(' ', '_')
    c_code_1_2 = """').highcharts({
    chart: {
    type: '"""
    c_code_1_3 = typ
    c_code_1_4 = """',
    zoomType: 'x',
    panning: true,
    panKey: 'shift'
    },
    title: {
    text: '"""
    c_code_2 = ''
    c_code_3_1 = """',
    x: -20
    },
    xAxis: {
    type: "datetime"
    },
    plotOptions: {
    series: {
    pointStart: Date.UTC("""
    c_code_3_2_1 = str(int(pointStart[0]))
    c_code_3_2_2 = ','
    c_code_3_2_3 = str(int(pointStart[1])-1)
    c_code_3_2_4 = ','
    c_code_3_2_5 = str(int(pointStart[2]))
    c_code_3_2_6 = ','
    c_code_3_2_7 = str(int(pointStart[3]))
    c_code_3_2_8 = ','
    c_code_3_2_9 = str(int(pointStart[4]))
    c_code_3_3 = """),
    pointInterval: 60 * 1000 // one per minut
    }
    },
    yAxis: {
    title: {
    text: '"""
    c_code_5_1 = titles
    c_code_5_2 = """'
    },
    plotOptions: {
    spline: {
    lineWidth: 4,
    states: {
    hover: {
    lineWidth: 5
    }
    },
    marker: {
    enabled: false,
    states: {
    hover: {
    enabled: true,
    symbol: 'circle',
    radius: 5,
    lineWidth: 1
    }
    }
    }
    }
    },
    gridLineWidth: 2,
    plotLines: [{
    value: 0,
    width: 1,
    color: '#808080'
    }]
    },
    tooltip: {
    valueSuffix: '"""
    c_code_5_3 = vsuffix
    c_code_5_4 = """'
    },
    legend: {
    layout: 'vertical',
    align: 'right',
    verticalAlign: 'middle',
    borderWidth: 0
    },
    series: """
    c_code_6 = str(series).replace("'data':", "data:")
    c_code_6 = c_code_6.replace("'name':", "name:")
    c_code_7 = """
    });
    });
    </script>
    """    
    
    c_code = (
        c_code_0+
        c_code_0_1+
        c_code_0_2+
        c_code_1+
        c_code_1_1+
        c_code_1_2+
        c_code_1_3+
        c_code_1_4+
        c_code_2+
        c_code_3_1+
        c_code_3_2_1+
        c_code_3_2_2+
        c_code_3_2_3+
        c_code_3_2_4+
        c_code_3_2_5+
        c_code_3_2_6+
        c_code_3_2_7+
        c_code_3_2_8+
        c_code_3_2_9+
        c_code_3_3+
        c_code_5_1+
        c_code_5_2+
        c_code_5_3+
        c_code_5_4+
        c_code_6+
        c_code_7
    )
    return c_code



