-- Creates the initial schema required by finito-postgres.

CREATE TABLE machines (
  id UUID PRIMARY KEY,
  created TIMESTAMPTZ NOT NULL DEFAULT NOW(),
  fsm TEXT NOT NULL,
  state JSONB NOT NULL
);

CREATE TABLE events (
  id UUID PRIMARY KEY,
  created TIMESTAMPTZ NOT NULL DEFAULT NOW(),
  fsm TEXT NOT NULL,
  fsm_id UUID NOT NULL REFERENCES machines(id),
  event JSONB NOT NULL
);
CREATE INDEX idx_events_machines ON events(fsm_id);

CREATE TYPE ActionStatus AS ENUM (
  'Pending',
  'Completed',
  'Failed'
);

CREATE TABLE actions (
  id UUID PRIMARY KEY,
  created TIMESTAMPTZ NOT NULL DEFAULT NOW(),
  fsm TEXT NOT NULL,
  fsm_id UUID NOT NULL REFERENCES machines(id),
  event_id UUID NOT NULL REFERENCES events(id),
  content JSONB NOT NULL,
  status ActionStatus NOT NULL,
  error TEXT
);

CREATE INDEX idx_actions_machines ON actions(fsm_id);
CREATE INDEX idx_actions_events ON actions(event_id);
