import datetime

from gavo import api
from gavo import stc
from gavo import utils

RDID = "lightmeter/q"

DAYS_PER_BIN = 10
BINS_SHOWN = 40

QUERY = """
select stationid, round(epoch/%s) as bin, count(*)
from lightmeter.measurements
where epoch>%%(minepoch)s
group by stationid, bin
"""%DAYS_PER_BIN


def makePlot():
	from matplotlib import figure
	from matplotlib import patches
	from matplotlib.backends.backend_agg import FigureCanvasAgg

	coverages = {}
	minBin, maxBin = utils.Supremum, utils.Infimum
	normalizer = utils.Infimum
	with api.getTableConn() as conn:
		cursor = conn.cursor()
		cursor.execute(QUERY, {
			"minepoch": stc.dateTimeToJdn(datetime.datetime.utcnow(
				))-DAYS_PER_BIN*BINS_SHOWN})
		for stationid, bin, count in cursor:
			coverages.setdefault(stationid, {})[bin] = count
			minBin = min(minBin, bin)
			maxBin = max(maxBin, bin)
			normalizer = max(normalizer, count)
	normalizer = float(normalizer)

	binPixels = 25
	y0, yHeight = 2*binPixels, binPixels*2
	xlimit = binPixels*(maxBin-minBin+1)
	ylimit = y0+(len(coverages)+0.3)*yHeight

	plotWidth = 0.7
	fig = figure.Figure(figsize=(3, plotWidth*len(coverages)*binPixels/200.))
	plot = fig.add_axes([1-plotWidth, 0, plotWidth*0.98, 1], yticks=[])
	plot.set_xlim(0, xlimit)
	plot.set_ylim(0, ylimit)
	plot.set_axisbelow(False)
	plot.set_axis_off()

	for stationid in reversed(sorted(coverages)):
		values = coverages[stationid]
		plot.text(-binPixels/2, y0, stationid,
			horizontalalignment="right", size=5)
		for bin, value in values.items():
			plot.add_patch(
				patches.Rectangle(
					(binPixels*(bin-minBin), y0),  binPixels, yHeight,
					color=str(1-0.9*value/normalizer),
					linewidth=0))
		y0 += yHeight

	plot.text(0, 2, stc.jdnToDateTime(minBin*DAYS_PER_BIN).strftime("%Y-%m"),
		horizontalalignment="left", verticalalignment="bottom",
		size=5)
	plot.text(xlimit, 2,
		stc.jdnToDateTime(maxBin*DAYS_PER_BIN).strftime("%Y-%m"),
		horizontalalignment="right", verticalalignment="bottom",
		size=5)

	canvas = FigureCanvasAgg(fig)
	canvas.print_figure(api.getRD(RDID).getAbsPath("static/coverage.png"),
		format="png",
		dpi=200)


if __name__=="__main__":
	makePlot()
