CREATE TABLE controllers
(
    id
        INTEGER
        PRIMARY KEY
        AUTOINCREMENT
        NOT NULL,
    uid
        BLOB
        NOT NULL
        UNIQUE,
    name
        VARCHAR(128)
        NOT NULL,
    relay_count
        INTEGER
        NOT NULL,
    active
        BOOLEAN
        NOT NULL
        DEFAULT false
);

CREATE TABLE relays
(
    id
        INTEGER
        PRIMARY KEY
        AUTOINCREMENT
        NOT NULL,
    name
        VARCHAR(128)
        NOT NULL,
    number
        INTEGER
        NOT NULL,
    controller_id
        INTEGER
        NOT NULL
        REFERENCES controllers (id)
            ON DELETE CASCADE
);

CREATE TABLE schedules
(
    id
        INTEGER
        PRIMARY KEY
        AUTOINCREMENT
        NOT NULL,
    uid
        BLOB
        NOT NULL
        UNIQUE,
    name
        VARCHAR(128)
        NOT NULL,
    periods
        BLOB
        NOT NULL
);

CREATE TABLE tags
(
    id
        INTEGER
        PRIMARY KEY
        AUTOINCREMENT
        NOT NULL,
    tag
        VARCHAR(128)
        NOT NULL
        UNIQUE
);

CREATE TABLE junction_tag
(
    id
        INTEGER
        PRIMARY KEY
        AUTOINCREMENT
        NOT NULL,
    tag_id
        INTEGER
        NOT NULL
        REFERENCES tags (id)
            ON DELETE CASCADE,
    relay_id
        INTEGER
        REFERENCES relays (id)
            ON DELETE CASCADE,
    schedule_id
        INTEGER
        REFERENCES schedules (id)
            ON DELETE CASCADE
);

CREATE TABLE junction_relay_schedule
(
    id
        INTEGER
        PRIMARY KEY
        AUTOINCREMENT
        NOT NULL,
    weekday
        SMALLINT
        NOT NULL,
    relay_id
        INTEGER
        REFERENCES relays (id)
            ON DELETE CASCADE,
    schedule_id
        INTEGER
        DEFAULT 1
        REFERENCES schedules (id)
            ON DELETE SET DEFAULT
);

CREATE TABLE macros
(
    id
        INTEGER
        PRIMARY KEY
        AUTOINCREMENT
        NOT NULL,
    uid
        VARCHAR(36)
        NOT NULL
        UNIQUE,
    name
        VARCHAR(128)
        NOT NULL
);

CREATE TABLE macro_actions
(
    id
        INTEGER
        PRIMARY KEY
        AUTOINCREMENT
        NOT NULL,
    macro_id
        INTEGER
        NOT NULL
        REFERENCES macros (id)
            ON DELETE CASCADE,
    relay_id
        INTEGER
        NOT NULL
        REFERENCES relays (id)
            ON DELETE CASCADE,
    schedule_id
        INTEGER
        NOT NULL
        REFERENCES schedules (id)
            ON DELETE CASCADE,
    weekday
        SMALLINT
        NOT NULL
);