-- INVENTARIO AUTOMATIZADO DE COMPUTADORES WINDOWS
-- Seguro para executar mais de uma vez. Nao remove dados existentes.

CREATE TABLE IF NOT EXISTS ti_pc_config (
    id TINYINT UNSIGNED NOT NULL PRIMARY KEY,
    enrollment_hash CHAR(64) NULL,
    enrollment_expires_at DATETIME NULL,
    enrollment_uses_remaining SMALLINT UNSIGNED NOT NULL DEFAULT 0,
    sync_interval_min SMALLINT UNSIGNED NOT NULL DEFAULT 30,
    recent_hours SMALLINT UNSIGNED NOT NULL DEFAULT 2,
    silent_hours SMALLINT UNSIGNED NOT NULL DEFAULT 24,
    offline_hours SMALLINT UNSIGNED NOT NULL DEFAULT 168,
    storage_critical_percent TINYINT UNSIGNED NOT NULL DEFAULT 10,
    current_agent_version VARCHAR(40) NOT NULL DEFAULT '1.0.1',
    current_agent_version_code INT UNSIGNED NOT NULL DEFAULT 2,
    api_enabled TINYINT(1) NOT NULL DEFAULT 1,
    updated_by VARCHAR(150) NULL,
    updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

INSERT INTO ti_pc_config(id) VALUES(1) ON DUPLICATE KEY UPDATE id=VALUES(id);

CREATE TABLE IF NOT EXISTS ti_pc_agentes (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    agent_id VARCHAR(32) NULL,
    token_hash CHAR(64) NOT NULL,
    token_issued_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    fingerprint_hash CHAR(64) NOT NULL,
    machine_guid_hash CHAR(64) NULL,
    computador_id INT UNSIGNED NULL,
    tipo VARCHAR(30) NOT NULL DEFAULT 'DESKTOP',
    patrimonio VARCHAR(50) NULL,
    responsavel_nome VARCHAR(150) NULL,
    setor VARCHAR(150) NULL,
    hostname VARCHAR(100) NULL,
    dominio VARCHAR(120) NULL,
    ultimo_usuario VARCHAR(180) NULL,
    fabricante VARCHAR(120) NULL,
    modelo VARCHAR(180) NULL,
    numero_serie VARCHAR(120) NULL,
    bios_version VARCHAR(120) NULL,
    sistema_operacional VARCHAR(180) NULL,
    os_version VARCHAR(80) NULL,
    os_build VARCHAR(80) NULL,
    arquitetura VARCHAR(30) NULL,
    instalado_em DATETIME NULL,
    ultimo_boot DATETIME NULL,
    uptime_seconds BIGINT UNSIGNED NULL,
    processador VARCHAR(220) NULL,
    cpu_cores SMALLINT UNSIGNED NULL,
    cpu_logical SMALLINT UNSIGNED NULL,
    ram_total_mb INT UNSIGNED NULL,
    ram_livre_mb INT UNSIGNED NULL,
    armazenamento_total_mb BIGINT UNSIGNED NULL,
    armazenamento_livre_mb BIGINT UNSIGNED NULL,
    armazenamento_tipo VARCHAR(100) NULL,
    gpu VARCHAR(220) NULL,
    ipv4 VARCHAR(45) NULL,
    mac_address VARCHAR(30) NULL,
    rede_tipo VARCHAR(60) NULL,
    bitlocker_status VARCHAR(80) NULL,
    antivirus VARCHAR(220) NULL,
    agent_version VARCHAR(40) NULL,
    agent_version_code INT UNSIGNED NULL,
    status VARCHAR(20) NOT NULL DEFAULT 'ATIVO',
    ultima_comunicacao DATETIME NULL,
    ultima_coleta DATETIME NULL,
    ultimo_ip_remoto VARCHAR(45) NULL,
    ultimo_erro VARCHAR(500) NULL,
    revogado_em DATETIME NULL,
    revogado_por VARCHAR(150) NULL,
    criado_em DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    atualizado_em DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    UNIQUE KEY uk_pc_agent_id (agent_id),
    UNIQUE KEY uk_pc_fingerprint (fingerprint_hash),
    UNIQUE KEY uk_pc_computador (computador_id),
    INDEX idx_pc_status_comunicacao (status, ultima_comunicacao),
    INDEX idx_pc_patrimonio (patrimonio),
    INDEX idx_pc_hostname (hostname),
    INDEX idx_pc_serial (numero_serie),
    CONSTRAINT fk_pc_computador FOREIGN KEY (computador_id)
        REFERENCES ti_computadores(id) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS ti_pc_sincronizacoes (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    agente_id BIGINT UNSIGNED NOT NULL,
    resumo_hash CHAR(64) NOT NULL,
    payload_json LONGTEXT NOT NULL,
    coletado_em DATETIME NULL,
    recebido_em DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    ip_remoto VARCHAR(45) NULL,
    INDEX idx_pc_sync_agente_data (agente_id, recebido_em),
    CONSTRAINT fk_pc_sync_agente FOREIGN KEY (agente_id)
        REFERENCES ti_pc_agentes(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS ti_pc_eventos (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    agente_id BIGINT UNSIGNED NOT NULL,
    tipo VARCHAR(80) NOT NULL,
    severidade VARCHAR(20) NOT NULL DEFAULT 'INFO',
    titulo VARCHAR(220) NOT NULL,
    valor_anterior TEXT NULL,
    valor_novo TEXT NULL,
    detalhes TEXT NULL,
    origem VARCHAR(30) NOT NULL DEFAULT 'AGENTE',
    status_revisao VARCHAR(20) NOT NULL DEFAULT 'PENDENTE',
    reconhecido_por VARCHAR(150) NULL,
    reconhecido_em DATETIME NULL,
    resolvido TINYINT(1) NOT NULL DEFAULT 0,
    resolvido_por VARCHAR(150) NULL,
    resolvido_em DATETIME NULL,
    observacao TEXT NULL,
    criado_em DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    INDEX idx_pc_evento_agente_data (agente_id, criado_em),
    INDEX idx_pc_evento_aberto (resolvido, severidade, criado_em),
    CONSTRAINT fk_pc_evento_agente FOREIGN KEY (agente_id)
        REFERENCES ti_pc_agentes(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS ti_pc_nonces (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    agente_id BIGINT UNSIGNED NOT NULL,
    nonce CHAR(64) NOT NULL,
    criado_em DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    UNIQUE KEY uk_pc_nonce (agente_id, nonce),
    INDEX idx_pc_nonce_data (criado_em),
    CONSTRAINT fk_pc_nonce_agente FOREIGN KEY (agente_id)
        REFERENCES ti_pc_agentes(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS ti_pc_rate_limits (
    chave_hash CHAR(64) PRIMARY KEY,
    janela_inicio DATETIME NOT NULL,
    tentativas SMALLINT UNSIGNED NOT NULL DEFAULT 1,
    INDEX idx_pc_rate_data (janela_inicio)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS ti_pc_auditoria (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    agente_id BIGINT UNSIGNED NULL,
    acao VARCHAR(100) NOT NULL,
    ator VARCHAR(150) NULL,
    ip_remoto VARCHAR(45) NULL,
    detalhes VARCHAR(500) NULL,
    criado_em DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    INDEX idx_pc_auditoria_agente_data (agente_id, criado_em),
    INDEX idx_pc_auditoria_acao_data (acao, criado_em),
    CONSTRAINT fk_pc_audit_agente FOREIGN KEY (agente_id)
        REFERENCES ti_pc_agentes(id) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
