-- DNS Shield ISP 1.3.0 - Estrutura do banco SQLite
-- Desenvolvedor: Euquias Junior <junior@jbinfo.com.br>

PRAGMA journal_mode = WAL;
PRAGMA foreign_keys = ON;

CREATE TABLE IF NOT EXISTS schema_version (
    id          INTEGER PRIMARY KEY CHECK (id = 1),
    version     INTEGER NOT NULL,
    updated_at  TEXT    NOT NULL DEFAULT (datetime('now'))
);

CREATE TABLE IF NOT EXISTS users (
    id            INTEGER PRIMARY KEY AUTOINCREMENT,
    username      TEXT    NOT NULL UNIQUE,
    password_hash TEXT    NOT NULL,
    role          TEXT    NOT NULL DEFAULT 'admin',
    active        INTEGER NOT NULL DEFAULT 1,
    created_at    TEXT    NOT NULL DEFAULT (datetime('now')),
    last_login    TEXT
);

CREATE TABLE IF NOT EXISTS blocked_domains (
    id          INTEGER PRIMARY KEY AUTOINCREMENT,
    domain      TEXT    NOT NULL UNIQUE,
    process_no  TEXT    NOT NULL,
    notes       TEXT,
    created_by  TEXT    NOT NULL,
    created_at  TEXT    NOT NULL DEFAULT (datetime('now')),
    active      INTEGER NOT NULL DEFAULT 1,
    origem      TEXT    NOT NULL DEFAULT 'manual'
);

CREATE INDEX IF NOT EXISTS idx_blocked_active  ON blocked_domains(active);
CREATE INDEX IF NOT EXISTS idx_blocked_process ON blocked_domains(process_no);
CREATE INDEX IF NOT EXISTS idx_blocked_origem  ON blocked_domains(origem);

-- Liberacoes / excecoes judiciais (passthrough RPZ). Tem prioridade sobre
-- qualquer bloqueio, inclusive os importados do AnaBlock.
CREATE TABLE IF NOT EXISTS liberacoes (
    id              INTEGER PRIMARY KEY AUTOINCREMENT,
    domain          TEXT    NOT NULL UNIQUE,
    processo        TEXT    NOT NULL,
    data_liberacao  TEXT    NOT NULL DEFAULT (datetime('now')),
    usuario         TEXT    NOT NULL DEFAULT '-',
    notes           TEXT,
    active          INTEGER NOT NULL DEFAULT 1
);

CREATE INDEX IF NOT EXISTS idx_liberacoes_active ON liberacoes(active);

-- Configuracao da integracao com a API do AnaBlock (anablock.net.br)
CREATE TABLE IF NOT EXISTS config_anablock (
    id                    INTEGER PRIMARY KEY CHECK (id = 1),
    enabled               INTEGER NOT NULL DEFAULT 0,
    token                 TEXT    NOT NULL DEFAULT '',
    api_url               TEXT    NOT NULL DEFAULT 'https://api.anablock.net.br/api/domain/all',
    frequencia            INTEGER NOT NULL DEFAULT 360,
    remover_ausentes      INTEGER NOT NULL DEFAULT 1,
    ultima_sincronizacao  TEXT,
    ultimo_status         TEXT    NOT NULL DEFAULT '',
    total_importados      INTEGER NOT NULL DEFAULT 0
);

-- Federacao DNS Shield ISP: publicacao das proprias listas para outros
-- provedores e consumo das listas de instalacoes parceiras.
CREATE TABLE IF NOT EXISTS federacao_publicacao (
    id                    INTEGER PRIMARY KEY CHECK (id = 1),
    publicar              INTEGER NOT NULL DEFAULT 0,
    token_publicacao      TEXT    NOT NULL DEFAULT '',
    publicar_liberacoes   INTEGER NOT NULL DEFAULT 1,
    consumir              INTEGER NOT NULL DEFAULT 0,
    frequencia            INTEGER NOT NULL DEFAULT 360,
    remover_ausentes      INTEGER NOT NULL DEFAULT 0,
    ultima_sincronizacao  TEXT,
    ultimo_status         TEXT    NOT NULL DEFAULT ''
);

CREATE TABLE IF NOT EXISTS federacao_peers (
    id                    INTEGER PRIMARY KEY AUTOINCREMENT,
    nome                  TEXT    NOT NULL,
    url                   TEXT    NOT NULL UNIQUE,
    token                 TEXT    NOT NULL DEFAULT '',
    enabled               INTEGER NOT NULL DEFAULT 1,
    importar_liberacoes   INTEGER NOT NULL DEFAULT 1,
    ultima_sincronizacao  TEXT,
    ultimo_status         TEXT    NOT NULL DEFAULT '',
    total_importados      INTEGER NOT NULL DEFAULT 0,
    created_at            TEXT    NOT NULL DEFAULT (datetime('now'))
);

CREATE INDEX IF NOT EXISTS idx_peers_enabled ON federacao_peers(enabled);

-- Licenciamento: veredito do contrato do provedor no ERP do desenvolvedor (IXC).
-- Controla apenas os modulos AnaBlock e Federacao; bloqueios e liberacoes
-- manuais nunca dependem de licenca.
CREATE TABLE IF NOT EXISTS licenca (
    id                     INTEGER PRIMARY KEY CHECK (id = 1),
    cnpj                   TEXT    NOT NULL DEFAULT '',
    chave                  TEXT    NOT NULL DEFAULT '',
    url                    TEXT    NOT NULL DEFAULT 'https://licenca.jbinfo.com.br',
    status                 TEXT    NOT NULL DEFAULT 'nao_configurado',
    modulos                TEXT    NOT NULL DEFAULT '',
    contrato               TEXT    NOT NULL DEFAULT '',
    validade               TEXT    NOT NULL DEFAULT '',
    mensagem               TEXT    NOT NULL DEFAULT '',
    ultima_verificacao     TEXT,
    ultima_verificacao_ok  TEXT
);

CREATE TABLE IF NOT EXISTS provider_settings (
    id            INTEGER PRIMARY KEY CHECK (id = 1),
    trade_name    TEXT NOT NULL DEFAULT '',
    legal_name    TEXT NOT NULL DEFAULT '',
    cnpj          TEXT NOT NULL DEFAULT '',
    support_email TEXT NOT NULL DEFAULT '',
    return_url    TEXT NOT NULL DEFAULT 'https://example.com.br',
    updated_at    TEXT NOT NULL DEFAULT (datetime('now'))
);

CREATE TABLE IF NOT EXISTS audit_log (
    id         INTEGER PRIMARY KEY AUTOINCREMENT,
    username   TEXT NOT NULL,
    action     TEXT NOT NULL,
    detail     TEXT,
    ip_address TEXT,
    created_at TEXT NOT NULL DEFAULT (datetime('now'))
);

CREATE INDEX IF NOT EXISTS idx_audit_created ON audit_log(created_at DESC);
CREATE INDEX IF NOT EXISTS idx_audit_user    ON audit_log(username);

INSERT OR IGNORE INTO provider_settings (id) VALUES (1);
INSERT OR IGNORE INTO config_anablock (id) VALUES (1);
INSERT OR IGNORE INTO federacao_publicacao (id) VALUES (1);
INSERT OR IGNORE INTO licenca (id) VALUES (1);
INSERT OR IGNORE INTO schema_version (id, version) VALUES (1, 4);
