-- API Pública e Webhooks

-- ============================================
-- API KEYS
-- ============================================

CREATE TABLE IF NOT EXISTS api_keys (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    tenant_id VARCHAR(100) NOT NULL,
    
    -- Dados da chave
    nome VARCHAR(255) NOT NULL,
    api_key VARCHAR(64) NOT NULL,
    api_secret VARCHAR(64) NOT NULL,
    
    -- Permissões
    permissoes_json TEXT NULL, -- JSON com lista de permissões
    
    -- Status
    ativo BOOLEAN DEFAULT TRUE,
    
    -- Rate limiting
    rate_limit_por_minuto INT DEFAULT 60,
    rate_limit_por_hora INT DEFAULT 1000,
    
    -- Metadados
    ultimo_uso DATETIME NULL,
    created_by INT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    
    INDEX idx_tenant (tenant_id),
    INDEX idx_api_key (api_key),
    INDEX idx_ativo (ativo),
    UNIQUE KEY uk_api_key (api_key)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Log de uso da API
CREATE TABLE IF NOT EXISTS api_usage_logs (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    tenant_id VARCHAR(100) NOT NULL,
    api_key_id BIGINT UNSIGNED NULL,
    
    -- Dados da requisição
    endpoint VARCHAR(255) NOT NULL,
    metodo VARCHAR(10) NOT NULL,
    status_code INT NOT NULL,
    tempo_resposta_ms INT NULL,
    
    -- Rate limiting
    ip_address VARCHAR(45) NULL,
    user_agent TEXT NULL,
    
    -- Metadados
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    
    INDEX idx_tenant (tenant_id),
    INDEX idx_api_key (api_key_id),
    INDEX idx_endpoint (endpoint),
    INDEX idx_created (created_at),
    INDEX idx_status (status_code),
    FOREIGN KEY (api_key_id) REFERENCES api_keys(id) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ============================================
-- WEBHOOKS
-- ============================================

CREATE TABLE IF NOT EXISTS webhooks (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    tenant_id VARCHAR(100) NOT NULL,
    
    -- Dados do webhook
    nome VARCHAR(255) NOT NULL,
    url VARCHAR(500) NOT NULL,
    
    -- Eventos
    eventos_json TEXT NOT NULL, -- JSON com lista de eventos
    
    -- Configurações
    metodo_http ENUM('POST', 'PUT', 'PATCH') DEFAULT 'POST',
    headers_json TEXT NULL, -- JSON com headers customizados
    secret VARCHAR(255) NULL, -- Secret para assinatura
    
    -- Status
    ativo BOOLEAN DEFAULT TRUE,
    
    -- Retry
    max_tentativas INT DEFAULT 3,
    intervalo_retry_segundos INT DEFAULT 60,
    
    -- Estatísticas
    total_envios INT DEFAULT 0,
    total_sucessos INT DEFAULT 0,
    total_falhas INT DEFAULT 0,
    ultimo_envio DATETIME NULL,
    
    -- Metadados
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    
    INDEX idx_tenant (tenant_id),
    INDEX idx_ativo (ativo),
    INDEX idx_eventos (eventos_json(255))
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Log de execuções de webhooks
CREATE TABLE IF NOT EXISTS webhook_executions (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    tenant_id VARCHAR(100) NOT NULL,
    webhook_id BIGINT UNSIGNED NOT NULL,
    
    -- Dados da execução
    evento VARCHAR(100) NOT NULL,
    payload_json TEXT NOT NULL,
    
    -- Status
    status ENUM('pendente', 'enviando', 'sucesso', 'falha', 'cancelado') DEFAULT 'pendente',
    status_code INT NULL,
    resposta TEXT NULL,
    
    -- Retry
    tentativa_atual INT DEFAULT 1,
    proxima_tentativa DATETIME NULL,
    
    -- Metadados
    iniciado_em DATETIME NULL,
    finalizado_em DATETIME NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    
    INDEX idx_tenant (tenant_id),
    INDEX idx_webhook (webhook_id),
    INDEX idx_status (status),
    INDEX idx_evento (evento),
    INDEX idx_proxima_tentativa (proxima_tentativa),
    FOREIGN KEY (webhook_id) REFERENCES webhooks(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ============================================
-- RATE LIMITING
-- ============================================

CREATE TABLE IF NOT EXISTS api_rate_limits (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    tenant_id VARCHAR(100) NOT NULL,
    api_key_id BIGINT UNSIGNED NULL,
    
    -- Identificador
    identificador VARCHAR(255) NOT NULL, -- IP ou API key
    
    -- Contadores
    requests_minuto INT DEFAULT 0,
    requests_hora INT DEFAULT 0,
    requests_dia INT DEFAULT 0,
    
    -- Timestamps
    reset_minuto TIMESTAMP NULL,
    reset_hora TIMESTAMP NULL,
    reset_dia TIMESTAMP NULL,
    
    -- Metadados
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    
    INDEX idx_tenant (tenant_id),
    INDEX idx_identificador (identificador),
    INDEX idx_reset_minuto (reset_minuto),
    INDEX idx_reset_hora (reset_hora),
    INDEX idx_reset_dia (reset_dia),
    UNIQUE KEY uk_tenant_identificador (tenant_id, identificador),
    FOREIGN KEY (api_key_id) REFERENCES api_keys(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

