#!/usr/bin/env python

import csv
from backports import lzma
import sys
import os
from datetime import date

n_returns = 600
sensorlist = [1,2,4,8,11,12,13,14,15,16,17,18,19,20]

frm_s = sys.argv[1]
to_s  = sys.argv[2]
#div = sys.argv[3]

frm_y, frm_m, frm_d = [int(x) for x in frm_s.split('/')]
to_y,  to_m,  to_d  = [int(x) for x in  to_s.split('/')]


# first, calculate culling step
frm = date(frm_y, frm_m, frm_d)
to  = date(to_y, to_m, to_d)
frm_s = frm.strftime("%Y/%m/%d 00:00")  # refine input
to_s = to.strftime("%Y/%m/%d 23:59")    # refine input
samples_per_day = 24 * 6
ndays = (to - frm).days * samples_per_day
step  = int(ndays / n_returns) + 1

# retreive from database
result = []
while frm.year < to.year or frm.month <= to.month:
    tmplist = []

    for i in sensorlist:
        no = str(i)
        fname = "data/"+ no+ frm.strftime("/%Y%m.csv.xz")
        try:
            xz = lzma.LZMAFile(fname)
            r1 = csv.DictReader(xz, fieldnames=["datetime", "temp-"+no, "humid-"+no])
            if frm.year == to_y and frm.month == to_m:
                r1 = filter(lambda x: x["datetime"] <= to_s, r1)
            elif frm.year == frm_y and frm.month == frm_m:
                r1 = filter(lambda x: x["datetime"] >= frm_s , r1)
            if r1 == []: continue
            tmplist.append(r1)
        except IOError:
            break

    result += [x for s in zip(*tmplist) for x in s]

    if frm.month == 12:
        frm = date(frm.year + 1, 1, 1)
    else:
        frm = date(frm.year, frm.month + 1, 1)

# align on 10 minite
for i in range(len(result)):
    result[i]["datetime"] = result[i]["datetime"][:-1]+"0"

result.sort(key=lambda x: x["datetime"])  # maybe not needed

# gather all sensors
prev=""
fa = []
for entry in result:
    if entry["datetime"] == prev:
        fa[-1] = {k: v for dic in [entry, fa[-1]]
                for k, v in dic.items()}
    else:
        fa.append(entry)
        prev = entry["datetime"]

# cull data to fit about 2000 entries
print fa[::step]

