#!/usr/bin/env raku


use Cro::HTTP::Router;
use Cro::HTTP::Server;

use EventSource::Server;
use RPi::Device::DS18B20;
use JSON::Class;

class TemperatureEvent does JSON::Class {
    has Str         $.name;
    has Str         $.id;
    has Numeric     $.temperature;
    has DateTime    $.when is marshalled-by('Str');
}

my %id-name-lookup = (
    '28-012113620c31'   => 'Upstairs',
    '28-03213194ea4f'   => 'Downstairs'
);


my $ds18b2 = RPi::Device::DS18B20.new(supply-interval => 10);
my $supply = $ds18b2.Supply.map( -> $r { TemperatureEvent.new( id => $r.name, name => %id-name-lookup{$r.name}, temperature => $r.temperature, when => $r.when ) }).map( -> $te { EventSource::Server::Event.new(type => 'reading', data => $te.to-json(:!pretty)) } );

my $es = EventSource::Server.new(:$supply, :keepalive, keepalive-interval => 1 );

my $app = route {
    get -> {
        static $*PROGRAM.parent, 'index.html';
    }
    get -> 'readings' {
        content 'text/event-stream', $es.out-supply;
    }
};

my Cro::Service $temps = Cro::HTTP::Server.new(:host<0.0.0.0>, :port<7798>, application => $app);

$temps.start;

react whenever signal(SIGINT) { $temps.stop; exit; }