<?php

require_once dirname(dirname(__DIR__)) . implode(DIRECTORY_SEPARATOR, ['', 'inc', 'include.php']);

header('Content-Type: application/json');
$door = new \pvv\side\Door($pdo);

if($_SERVER['REQUEST_METHOD'] === 'POST') {
    if (isset($_SERVER["HTTP_AUTHORIZATION"])) {
        list($type, $data) = explode(" ", $_SERVER["HTTP_AUTHORIZATION"], 2);
        if (strcasecmp($type, "Bearer") == 0) {
            if (hash_equals($data, $doorSensorSecret)) {
                handleSetState();
            } else {
                echo '{"status": "error", "message": "Invalid authentication key"}';
                die();
            }
        } else {
            echo '{"status": "error", "message": "Invalid authentication method"}';
            die();
        }
    } else {
        echo '{"status": "error", "message": "Missing authentication"}';
        die();
    }
} elseif ($_SERVER['REQUEST_METHOD'] === 'GET') {

    if (isset($_GET["period"])) {
        $period = (string)htmlspecialchars($_GET["period"]);
        
        if ($period == "day") {
            $startTime = time() - (60*60*24);
        } else if ($period == "week") {
            $startTime = time() - (60*60*24*7);
        } else {
            echo '{"status": "error", "message": "Invalid period"}';
            die();
        }

        $lines = $door->getEntriesAfter($startTime);
        if (isset($_GET["edgeonly"]) && (bool)htmlspecialchars($_GET["edgeonly"])) {
            //Ignore repeats
            $lines = getChanges($lines);
        }
        
        echo json_encode([
            'status'        => "OK",
            'entries'       => $lines
        ]);
    } else {
        //Only last entry
        $line = (object)$door->getCurrent();
        echo json_encode([
            'status'        => "OK",
            'time'          => $line->time,
            'open'          => $line->open
        ]);
    }
}


function handleSetState() {
    global $door;

    $jsonobj = file_get_contents('php://input');
    $event = json_decode($jsonobj);

    if ((!isset($event->time)) || (!is_numeric($event->time))) {
        echo '{"status": "error", "message": "Invalid timestamp"}';
        die();
    }
    if ((!isset($event->isDoorOpen)) || (!is_bool($event->isDoorOpen))) {
        echo '{"status": "error", "message": "Invalid door state"}';
        die();
    }

    $door->createEvent((int)($event->time), (bool)($event->isDoorOpen));
    echo '{"status": "OK"}';
} 

function getChanges($items) {
    $prevState = 2;
    $res = [];

    foreach($items as $item) {
        if ($item["open"] !== $prevState) {
            array_push($res, $item);
            $prevState = $item["open"];
        }
    }

    return $res;
}