﻿# -*- coding: utf-8 -*-
import sys
import os


def MakeRainChart(drows, pos, titles, vsuffix):
    logstr = ""
    series = {}
    minTick = 5
    
    for key in drows:
        if len(drows[key]) != 0:
            # convert the data into a table
            tableId = key
            data = []
            xaxis = []
            rows = drows[key]
            periodRain = str(rows[-1][4]-rows[0][4])
            selectedPeriod = str(rows[0][0][:-3])+' - '+str(rows[-1][0][:-3])        
            r_start = rows[0][4]
            r_prev = 0
            bFirstDone = False
            for row in rows:
                r_tmp = row[4]
                t_tmp = row[0].split(' ')[1].split(':')
                d_tmp = row[0].split(' ')[0].split('-')
                if row[4] == r_start and not bFirstDone: #if first row
                    bFirstDone = True
                else:
                    if row[4] != r_prev:
                        rd = row[pos]-r_prev
                        dt = str(t_tmp[0]+':'+t_tmp[1])
                        data.append(rd)
                        xaxis.append(dt)
                    if row[4] == r_prev:
                        rd = 0.0
                        if d_tmp != d_prev:
                            dt = str(d_tmp[0][:-2]+'.'+d_tmp[1]+'.'+d_tmp[2])
                            data.append(rd)
                            xaxis.append(dt)
                        elif t_tmp[0] != t_prev[0]:
                            dt = str(t_tmp[0])
                            data.append(rd)
                            xaxis.append(dt)
                t_prev = t_tmp
                d_prev = d_tmp
                r_prev = r_tmp
            series['name'] = "Rain level"
            series['data'] = data
            divisor = len(xaxis) * 0.25
            minTick = int(len(xaxis)/divisor)
            #print len(xaxis), divisor, minTick
            if minTick == 0:
                minTick = 1
            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, minTick, xaxis, titles, vsuffix, series)
        else:
            print "No data found"
    return logstr


def MakeChart(drows, pos, titles, vsuffix):
    logstr = ""
    series = {}
    minTick = 5
    
    for key in drows:
        if len(drows[key]) != 0:
            # convert the data into a table
            tableId = key
            data = []
            xaxis = []
            rows = drows[key]
            selectedPeriod = str(rows[0][0][:-3])+' - '+str(rows[-1][0][:-3])        
            t_prev = ['00','00']
            d_prev = ['00','00','00']
            for row in rows:
                t_tmp = row[0].split(' ')[1].split(':')
                d_tmp = row[0].split(' ')[0].split('-')
                rd = row[pos]
                dt = str(t_tmp[1])
                if d_tmp[2] != d_prev[2]:
                    dt = str(d_tmp[0]+'-'+d_tmp[1]+'-'+d_tmp[2])
                elif t_tmp[0] != t_prev[0]:
                    dt = str(t_tmp[0]+':'+t_tmp[1])
                data.append(rd)
                xaxis.append(dt)
                t_prev = t_tmp
                d_prev = d_tmp

            series['name'] = str(tableId)
            series['data'] = data
            divisor = len(xaxis) * 0.1
            minTick = int(len(xaxis)/divisor)
            #print len(xaxis), divisor, minTick
            if minTick == 0:
                minTick = 1
            logstr += "<p><small>Selected period: "+selectedPeriod+"</small></p>"+'\n\r'
            logstr += HighchartSnippet('line', tableId, minTick, xaxis, titles, vsuffix, series)
        else:
            print "No data found"
    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
):
    # start creating the html page
    base = """
    <!DOCTYPE HTML>
    <html>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> 
		  <title>EventGhost Combo Report</title>
    <h1>EventGhost Climate Data Report Graph</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 = base + 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 HighchartSnippet(typ, tableId, minTick, xaxis, titles, vsuffix, series):
    c_code_0 = """
    <div id='"""
    c_code_0_1 = tableId.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 = tableId.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 = tableId
    c_code_3_1 = """',
    x: -20
    },
    xAxis: {
    tickInterval: """
    c_code_3_2 = str(minTick)
    c_code_3_3 = """,
    categories: """
    c_code_4 = str(xaxis)
    c_code_5 = """
    },
    yAxis: {
    title: {
    text: '"""
    c_code_5_1 = titles
    c_code_5_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+
        c_code_3_3+
        c_code_4+
        c_code_5+
        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



