CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
CREATE TYPE JobType AS ENUM ('shell', 'manage', '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 UNIQUE
    , hostname TEXT NOT NULL
    , id UUID NOT NULL DEFAULT uuid_generate_v4()
    , is_root BOOLEAN NOT NULL DEFAULT false
    , is_root_allowed BOOLEAN NOT NULL DEFAULT false
    , last_active TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
    -- target triplet
    , platform TEXT NOT NULL
    , regtime TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
    , state AgentState NOT NULL DEFAULT 'new'
    -- is needed to processing requests
    , token TEXT
    , username TEXT NOT NULL
    , PRIMARY KEY(id)
);

CREATE TABLE IF NOT EXISTS ip_addrs (
      agent_id UUID NOT NULL
    , check_ts TIMESTAMP NOT NULL
    , gateway TEXT
    , id UUID NOT NULL DEFAULT uuid_generate_v4()
    , iface TEXT NOT NULL
    , ip_addr TEXT NOT NULL
    , is_gray BOOLEAN NOT NULL DEFAULT true
    , netmask TEXT NOT NULL
    , PRIMARY KEY(id)
    , FOREIGN KEY(agent_id) REFERENCES agents(id)
);

CREATE TABLE IF NOT EXISTS jobs (
      alias TEXT UNIQUE
    , argv TEXT NOT NULL
    , id UUID NOT NULL DEFAULT uuid_generate_v4()
    -- Shell, Binary (with program download),
    -- Python (with program and python download if not exist), Management
    , exec_type JobType NOT NULL DEFAULT 'shell'
    , platform TEXT NOT NULL
    , payload BYTEA
    , PRIMARY KEY(id)
);

CREATE TABLE IF NOT EXISTS results (
      agent_id UUID NOT NULL
    , alias TEXT UNIQUE
    , 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'
    , 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)
);