%D \module
%D   [      file=s-youless,
%D        version=2013.11.12,
%D          title=\CONTEXT\ Style File,
%D       subtitle=Youless Graphics,
%D         author=Hans Hagen,
%D           date=\currentdate,
%D      copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
%C
%C This module is part of the \CONTEXT\ macro||package and is
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.

%D This is experimental code. When I have collected enough data I will make the
%D graphics nicer and provide some more.
%D
%D The Jouless can serve web pages but there is not much detail in them. They also are
%D somewhat bad \HTML, like unquoted attributes and so. We don't need this anyway as we
%D can also fetch data directly. The data is collected using a dedicated helper script
%D (of course we could just call it as module too). The data is fetched from the Jouless
%D device using queries (currently we use json, but a more direct parsing of data might
%D be more efficient). The data is converted into a proper \LUA\ table and saved (merged).

% in cronjob on one of the servers:
%
% mtxrun --script youless --collect --host=192.168.2.50 --watt youless-watt.lua
% mtxrun --script youless --collect --host=192.168.2.50 --kwk  youless-kwh.lua

\startluacode

    require("util-you")

    moduledata.youless = { }

    function moduledata.youless.kwh(specification)
        -- todo
    end

    function moduledata.youless.watt(specification)

        local year = tonumber(specification.year) or os.today().year
        local data = table.load(specification.filename or "youless-watt.lua")

        if not data or data.variant ~= "watt" then
            context("invalid variant")
            return
        end

        utilities.youless.analyze(data)

        -- for the moment no specific font scaling

        local years = data.years

        if not years then
            context("no years")
            return
        end

        for y=year,year do

            local year    = years[y]
            local scale   = 20
            local mark    = 3
            local maxwatt = specification.maxwatt or year.maxwatt

            for m=1,12 do
                local month = year.months[m]
                if month then
                    context.startMPpage { offset = "10pt" }
                    context("linecap := butt; pickup pencircle scaled .5")

                    for i=0,(math.div(maxwatt,1000)+1)*1000,100 do
                        context("draw (%s,%s) -- (%s,%s) withcolor .6white ;",0,i/scale,31 * 24,i/scale)
                    end

                    context("draw (0,%s) -- (31 * 24,%s) dashed dashpattern(on 6 off 6) withcolor darkgreen withpen pencircle scaled 1 ;",year.watt /scale,year.watt /scale)
                    context("draw (0,%s) -- (31 * 24,%s) dashed dashpattern(off 6 on 6) withcolor darkred   withpen pencircle scaled 1 ;",month.watt/scale,month.watt/scale)

                    local days = month.days
                    if days then
                        local nd = os.nofdays(y,m)
                        for d=1,nd do
                            local day = days[d]
                            local xoffset = (d-1) * 24
                            local wd = os.weekday(d,m,y)
                            local weekend = wd == 1 or wd == 7
                            if not weekend then
                                -- okay
                            elseif mark == 1 then
                                context("draw (%s,%s) -- (%s,%s) ; ",xoffset,   -17.5,xoffset,   -32.5)
                                context("draw (%s,%s) -- (%s,%s) ; ",xoffset+24,-17.5,xoffset+24,-32.5)
                            elseif mark == 2 then
                                context("draw (%s,%s) -- (%s,%s) ; ",xoffset,   -17.5,xoffset+24,-17.5)
                                context("draw (%s,%s) -- (%s,%s) ; ",xoffset,   -32.5,xoffset+24,-32.5)
                            elseif mark == 3 then
                                context("draw unitsquare xysized (%s,%s) shifted (%s,%s) ; ",24,15,xoffset,-32.5)
                            end
                            context([[draw textext("%s") shifted (%s,%s) ; ]],d,xoffset + 12,-25)
                            if day then
                                for h=0,23 do
                                    local hours = day.hours
                                    if hours then
                                        local hour = hours[h]
                                        if hour then
                                            local dx = xoffset + h
                                            local dy = hour.watt/scale
                                            local dm = hour.maxwatt/scale
                                            context("draw (%s,%s) -- (%s,%s) withcolor %s ; ",dx, 0,dx,dy,weekend and "darkmagenta" or "darkblue")
                                            context("draw (%s,%s) -- (%s,%s) withcolor %s ; ",dx,dy,dx,dm,"darkgray")
                                        end
                                    end
                                end
                            end
                        end
                        for d=0,30 do
                            local xoffset = d * 24
                            context("draw (%s,%s) -- (%s,%s) withcolor darkgray ; ",xoffset+ 0,0,xoffset+ 0,-10)
                            context("draw (%s,%s) -- (%s,%s) withcolor darkgray ; ",xoffset+ 6,0,xoffset+ 6,-2.5)
                            context("draw (%s,%s) -- (%s,%s) withcolor darkgray ; ",xoffset+12,0,xoffset+12,-5)
                            context("draw (%s,%s) -- (%s,%s) withcolor darkgray ; ",xoffset+18,0,xoffset+18,-2.5)
                        end
                        local xoffset = 31 * 24
                        context("draw (%s,%s) -- (%s,%s) withcolor darkgray ; ",xoffset,0,xoffset,-10)
                    end

                    local max = (math.div(maxwatt,1000)+1)

                    for i=0,max*1000,1000 do
                        context([[draw textext.lft("%s") shifted (%s,%s) ; ]],i,-10,i/scale)
                        context("draw (%s,%s) -- (%s,%s) withcolor .2white  ;",0,i/scale,31 * 24,i/scale)
                    end

                    context([[draw textext("\strut\month{%s}\enspace%s") shifted (%s,%s) ; ]],m, y, 31 * 24 / 2, -50)
                    context([[draw textext.lft("watt") shifted (%s,%s) ; ]],-10,-25)

                    context.stopMPpage()
                else
                    -- maybe placeholder
                end
            end

        end

    end

\stopluacode

\continueifinputfile{s-youless.mkiv}

\setupbodyfont[dejavu] % smaller sizes also look ok

% printer (oce)  : > 3000 W startup (900 W idle, 2000 W printing)
% coffeemaker    :   1500 W when heating

% baseline day   :   2250 W (servers, airco, workstations, routers, switches, heating, etc)
% baseline night :   1750 W

\starttext

    \startluacode

     -- os.execute([[mtxrun --script youless --collect --watt "c:/data/system/youless/data/youless-watt.lua"]])
     -- os.execute([[mtxrun --script youless --collect --watt --nobackup "c:/data/system/youless/data/youless-watt.lua"]])
     -- moduledata.youless.watt { year = 2013, filename = "c:/data/system/youless/data/youless-watt.lua" }

        moduledata.youless.watt { year = 2013, filename = "youless-watt.lua" }

    \stopluacode

\stoptext
