CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
CREATE TYPE JobType AS ENUM ('shell', 'init', 'python');
CREATE TYPE JobState AS ENUM ('queued', 'running', 'finished');
CREATE TYPE AgentState AS ENUM ('new', 'active', 'banned');

CREATE TABLE IF NOT EXISTS agents (
    alias TEXT,
    hostname TEXT NOT NULL,
    id UUID NOT NULL DEFAULT uuid_generate_v4(),
    ip_gray TEXT,
    ip_white TEXT,
    is_root BOOLEAN NOT NULL DEFAULT false,
    is_root_allowed BOOLEAN NOT NULL DEFAULT false,
    last_active TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    platform TEXT NOT NULL,
    regtime TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    state AgentState NOT NULL DEFAULT 'new',
    token TEXT,
    username TEXT NOT NULL,

    PRIMARY KEY(id)
);

CREATE TABLE IF NOT EXISTS jobs (
    alias TEXT,
    argv TEXT NOT NULL,
    id UUID NOT NULL DEFAULT uuid_generate_v4(),
    exec_type JobType NOT NULL DEFAULT 'shell',
    platform TEXT NOT NULL,
    payload BYTEA,
    payload_path TEXT,
    schedule TEXT,

    PRIMARY KEY(id)
);

CREATE TABLE IF NOT EXISTS results (
    agent_id UUID NOT NULL,
    alias TEXT,
    created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    id UUID NOT NULL DEFAULT uuid_generate_v4(),
    job_id UUID NOT NULL,
    result BYTEA,
    state JobState NOT NULL DEFAULT 'queued',
    exec_type JobType NOT NULL DEFAULT 'shell',
    retcode INTEGER,
    updated TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,

    FOREIGN KEY(agent_id) REFERENCES agents(id) ON DELETE CASCADE,
    FOREIGN KEY(job_id) REFERENCES jobs(id) ON DELETE CASCADE,
    PRIMARY KEY(id)
);

CREATE TABLE IF NOT EXISTS certificates (
    agent_id UUID NOT NULL,
    id UUID NOT NULL DEFAULT uuid_generate_v4(),
    is_revoked BOOLEAN NOT NULL DEFAULT FALSE,

    PRIMARY KEY(id),
    FOREIGN KEY(agent_id) REFERENCES agents(id)
);