<?php

require_once "utils.php";

class Queue {
    public $name;
    public $endpoint_url;

    function toPlainText($url_generator) {
        return "Name: " . $this->name . "\n" .
            "Queue URL: " . $url_generator->queue($this->name) . "\n" .
            "Endpoint URL: " . (isset($this->endpoint_url) ? $this->endpoint_url : "Not set") . "\n" .
            "Enqueue: " . $url_generator->enqueue($this->name) . "\n" .
            "Items: " . $url_generator->queue_items($this->name) . "\n";
    }

    function toHtml($url_generator, $detail) {
        $queue_url = url_to_a($url_generator->queue($this->name));
        $endpoint = !isset($this->endpoint_url) ? "Not set" : htmlspecialchars($this->endpoint_url);
        $enqueue_url = url_to_a($url_generator->enqueue($this->name));
        $items_url = url_to_a($url_generator->queue_items($this->name));
        $html =
            "<h2>Queue: $this->name</h2>" .
            "<table>" . 
            "<tr><td>Queue URL</td><td>$queue_url</td></tr>";
        if($detail) $html .= 
            "<tr><td>Endpoint URL</td><td>$endpoint</td></tr>" .
            "<tr><td>Enqueue</td><td>$enqueue_url</td></tr>" .
            "<tr><td>Items</td><td>$items_url</td></tr>";
        $html .=
            "</table>";
        return $html;
    }

    static function valid_name($str) {
        return preg_match('/^[a-zA-Z0-9]+$/', $str);
    }
}

function item_from_db($id, $queue_name, $created, $headers) {
//    echo("headers=$headers");
    return new Item($id, $queue_name, $created, json_decode($headers, true));
}

class Item {
    public $id;
    public $queue_name;
    public $created;
    public $headers;

    function __construct($id, $queue_name, $created, $headers) {
        $this->id = $id;
        $this->queue_name = $queue_name;
        $this->created = $created;
        $this->headers = $headers;
    }

    function toPlainText($url_generator) {
        $headers = "";
        foreach($this->headers as $k => $v) {
            $headers = $headers . " " . $k . ": " . $v . "\n";
        }
        return "Headers:\n" . $headers;
    }

    function toHtml($url_generator) {
        $item_url = url_to_a($url_generator->item($this->queue_name, $this->id));
        $download_url = url_to_a($url_generator->item_blob($this->queue_name, $this->id), "Raw file");
        $download_as_text_url = url_to_a($url_generator->item_blob_as_text($this->queue_name, $this->id), "As plain text");
        $html = 
            "<h2>Item</h2>" .
            "<h3>Meta</h3>" .
            "<ul>" .
            "<li>Id: $this->id</li>" .
            "<li>Created: $this->created</li>" .
            "<li>Link: $item_url</li>" .
            "<li>Download: $download_url $download_as_text_url</li>" .
            "</ul>" .
            "<h3>Headers</h3>" .
            "<ul>\n";
        foreach($this->headers as $k => $v) {
            $html .= "<li>" . $k . ": " . $v . "</li>\n";
        }
        return $html . "</ul>\n";
    }
}

class DB {
    var $db;

    function __construct() {
        $this->db = new PDO("sqlite:/tmp/mq/mq.db");
        $this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $this->db->exec("PRAGMA foreign_keys = ON;");
        $this->db->beginTransaction();
    }

    function commit() {
        $this->db->commit();
    }

    function delete_queue_and_items($name) {
        $stmt = $this->db->prepare("DELETE FROM item WHERE queue_name = :name");
        $stmt->bindParam(":name", $name);
        $stmt->execute();

        $stmt = $this->db->prepare("DELETE FROM queue WHERE name = :name");
        $stmt->bindParam(":name", $name);
        $stmt->execute();
    }

    function insert_queue($name, $endpoint_url) {
        $stmt = $this->db->prepare("INSERT INTO queue(name, endpoint_url) VALUES(:name, :endpoint_url)");
        $stmt->bindParam(":name", $name);
        $stmt->bindParam(":endpoint_url", $endpoint_url);
        $stmt->execute();
    }

    function update_queue($name, $endpoint_url) {
        $stmt = $this->db->prepare("UPDATE queue SET endpoint_url = :endpoint_url WHERE name = :name");
        $stmt->bindParam(":endpoint_url", $endpoint_url);
        $stmt->bindParam(":name", $name);
        $stmt->execute();
    }

    function insert_item($id, array $headers, array $queues) {
        foreach($queues as $queue) {
            $stmt = $this->db->prepare("INSERT INTO item(id, queue_name, created, headers) VALUES(:id, :queue_name, datetime('now'), :headers)");
            $stmt->bindParam(":id", $id);
            $stmt->bindParam(":queue_name", $queue);
            $stmt->bindParam(":headers", json_encode($headers));
            $stmt->execute();
        }
    }

    function select_queues() {
        $stmt = $this->db->prepare("SELECT name, endpoint_url FROM queue ORDER BY name");
        $stmt->execute();
        return $stmt->fetchAll(PDO::FETCH_CLASS, "Queue");
    }

    function select_queue($queue) {
        $stmt = $this->db->prepare("SELECT name, endpoint_url FROM queue WHERE name = :name");
        $stmt->setFetchMode(PDO::FETCH_CLASS, "Queue");
        $stmt->bindParam(":name", $queue);
        $stmt->execute();
        $x = $stmt->fetch(PDO::FETCH_CLASS);
        return $x === FALSE ? NULL : $x;
    }

    function delete_item($queue_name, $id) {
        $stmt = $this->db->prepare("DELETE FROM item WHERE queue_name = :queue_name AND id = :id");
        $stmt->bindParam(":queue_name", $queue_name);
        $stmt->bindParam(":id", $id);
        $stmt->execute();
    }

    function select_item($queue_name, $id) {
        $stmt = $this->db->prepare("SELECT id, queue_name, created, headers FROM item WHERE queue_name = :queue_name AND id = :id");
        $stmt->bindParam(":queue_name", $queue_name);
        $stmt->bindParam(":id", $id);
        $stmt->execute();
        $x = $stmt->fetchAll(PDO::FETCH_FUNC, 'item_from_db');
        return count($x) > 0 ? $x[0] : NULL;
    }

    function select_items($queue_name, $limit = 10, $offset = 0) {
        $stmt = $this->db->prepare("SELECT id, queue_name, created, headers FROM item WHERE queue_name = :queue_name LIMIT :limit OFFSET :offset");
        $stmt->bindParam(":queue_name", $queue_name);
        $stmt->bindParam(":limit", $limit);
        $stmt->bindParam(":offset", $offset);
        $stmt->execute();
        $x = $stmt->fetchAll(PDO::FETCH_FUNC, 'item_from_db');
        return $x;
    }
}

?>
