CREATE TABLE resources (
  id           uuid PRIMARY KEY DEFAULT gen_random_uuid(),
  space_id     uuid NOT NULL REFERENCES spaces(id) ON DELETE CASCADE,
  slug         text NOT NULL,
  name         text NOT NULL,
  runtime_type text NOT NULL
               CHECK (runtime_type IN ('lxc','vm','docker','bare-metal')),
  host         text,
  url          text,
  version      text,
  status       text NOT NULL DEFAULT 'unknown'
               CHECK (status IN ('running','stopped','down','unknown')),
  monitoring   jsonb NOT NULL DEFAULT '{}'::jsonb,
  metadata     jsonb NOT NULL DEFAULT '{}'::jsonb,
  last_check   timestamptz,
  maintenance_until timestamptz,
  created_at   timestamptz NOT NULL DEFAULT now(),
  updated_at   timestamptz NOT NULL DEFAULT now(),
  UNIQUE (space_id, slug)
);

CREATE TABLE resource_dependencies (
  resource_id uuid NOT NULL REFERENCES resources(id) ON DELETE CASCADE,
  depends_on  uuid NOT NULL REFERENCES resources(id) ON DELETE CASCADE,
  kind        text,
  PRIMARY KEY (resource_id, depends_on),
  CHECK (resource_id <> depends_on)
);

CREATE TABLE resource_credentials (
  id          uuid PRIMARY KEY DEFAULT gen_random_uuid(),
  resource_id uuid NOT NULL REFERENCES resources(id) ON DELETE CASCADE,
  label       text NOT NULL,
  vault_path  text NOT NULL,
  kind        text,
  notes       text,
  created_at  timestamptz NOT NULL DEFAULT now()
);

CREATE TABLE source_docs (
  id           uuid PRIMARY KEY DEFAULT gen_random_uuid(),
  resource_id  uuid REFERENCES resources(id) ON DELETE CASCADE,
  name         text NOT NULL,
  upstream_url text NOT NULL,
  version      text,
  format       text,
  sync_source  text,
  local_path   text,
  body_text    text,
  embedding    vector(1024),
  last_synced  timestamptz,
  metadata     jsonb NOT NULL DEFAULT '{}'::jsonb,
  created_at   timestamptz NOT NULL DEFAULT now(),
  updated_at   timestamptz NOT NULL DEFAULT now()
);

CREATE INDEX idx_resources_space ON resources(space_id);
CREATE INDEX idx_source_docs_resource ON source_docs(resource_id);
CREATE INDEX idx_source_docs_fts ON source_docs
  USING GIN (to_tsvector('english', coalesce(body_text,'')));
CREATE INDEX idx_source_docs_embed ON source_docs
  USING hnsw (embedding vector_cosine_ops);
