-- v1.1.3: dep graph between scripts and the modules they `import`.
--
-- Populated at script save-time. The validator extracts literal-path
-- `import "<name>"` declarations from the AST; the script repo writes
-- one row per resolved (importer, imported) pair inside the same
-- transaction as the INSERT/UPDATE on `scripts`. Unresolved names
-- (imported module doesn't exist yet) are silently skipped — the
-- resolver returns ErrorModuleNotFound at runtime, and a later save
-- of either script re-resolves and writes the edge.
--
-- Dynamic imports (`import some_var as alias;`) are not tracked
-- here — the resolver still honors them at runtime, but the graph
-- only captures names known at compile time. Document as a known
-- v1.1.3 limitation.
--
-- Purpose: drives a future "Used by" panel on a module's detail page
-- (v1.2+) and is the foundation for cluster-mode eager cache
-- invalidation (v1.3+). v1.1.3 only persists the rows; no admin
-- endpoint surfaces them yet.
CREATE TABLE script_imports (
    app_id              UUID NOT NULL REFERENCES apps(id) ON DELETE CASCADE,
    importer_script_id  UUID NOT NULL REFERENCES scripts(id) ON DELETE CASCADE,
    imported_script_id  UUID NOT NULL REFERENCES scripts(id) ON DELETE CASCADE,
    created_at          TIMESTAMPTZ NOT NULL DEFAULT NOW(),
    PRIMARY KEY (importer_script_id, imported_script_id)
);

-- Reverse-edge index: "list scripts that import module X". The PK
-- covers (importer, imported) so forward lookups by importer are
-- already free; the reverse direction needs its own index.
CREATE INDEX idx_script_imports_imported ON script_imports (imported_script_id);

-- App-scoped scan ("all imports in this app") — used by the schema
-- snapshot tests and (eventually) the admin "audit" view.
CREATE INDEX idx_script_imports_app ON script_imports (app_id);
