DROP TABLE IF EXISTS notes;
DROP TABLE IF EXISTS note_relationships;
DROP TABLE IF EXISTS note_page_relationships;
DROP TABLE IF EXISTS favorites;

CREATE TABLE notes (
    id TEXT NOT NULL PRIMARY KEY,
    content TEXT NOT NULL,
    kind TEXT NOT NULL,
	creation_date DATETIME NOT NULL,
	updated_date DATETIME NOT NULL,
	lastview_date DATETIME NOT NULL,
	deleted_date DATETIME NULL
);

CREATE INDEX note_ids ON notes (id);

CREATE TABLE favorites (
	id TEXT NOT NULL UNIQUE,
    location INTEGER NOT NULL,
    FOREIGN KEY (id) REFERENCES notes (id) ON DELETE CASCADE
);

-- This table represents the forest of data relating a page to its
-- collections of notes.  The root is itself "a note," but the content
-- of that note will always be just the title of the page.
--
CREATE TABLE note_relationships (
    note_id TEXT NOT NULL,
    parent_id TEXT NOT NULL,
    location INTEGER NOT NULL,
    kind TEXT NOT NULL,
	-- If either note disappears, we want all the edges to disappear as well.
    FOREIGN KEY (note_id) REFERENCES notes (id) ON DELETE CASCADE,
    FOREIGN KEY (parent_id) REFERENCES notes (id) ON DELETE CASCADE,
	UNIQUE (note_id, parent_id),
	CHECK (note_id <> parent_id)
);

-- This table represents the graph of data relating notes to pages.
--
CREATE TABLE note_page_relationships (
    note_id TEXT NOT NULL,
    page_id TEXT NOT NULL,
    kind TEXT NOT NULL,
	-- If either note disappears, we want all the edges to disappear as well.
    FOREIGN KEY (note_id) REFERENCES notes (id) ON DELETE CASCADE,
    FOREIGN KEY (page_id) REFERENCES notes (id) ON DELETE CASCADE,
	UNIQUE (note_id, page_id),
	CHECK (note_id <> page_id)
);

-- A fabulous constraint. This index prevents us from saying that
-- if a note points to a page, the page may not point to a
-- note.  Now, it's absolutely required that a page_id point to
-- a PageType note; the content should be a title only.
CREATE UNIQUE INDEX note_page_unique_idx 
  ON note_page_relationships (MIN(note_id, page_id), MAX(note_id, page_id));
