-- =====================================================================
-- Tabela: tb_api
-- Projeto: f19 — banco w19_clikil41_eleicao
--
-- Pool de instâncias/tokens de serviços externos (Z-API, Claude, ChatGPT,
-- RapidAPI, Meta, Sendflow, gateways de pagamento, etc).
--
-- Vínculo com campanha vai por tb_campaign_api (N:M com priority).
-- Permite: 1 instância usada por N campanhas (token Claude global) OU
-- 1 instância dedicada a 1 campanha (Z-API do apoiador).
--
-- CRIPTOGRAFIA dos tokens (decisão 2026-05-27): api_token_primary e
-- api_token_secondary armazenam o ciphertext AES-256-GCM produzido por
-- helper PHP fn_api_secret.php (usa APP_CRYPT_KEY do bootstrap). NUNCA
-- gravar plaintext nem fazer SELECT direto destes campos no app —
-- sempre via fn_api_get_token(id_api, 'primary'|'secondary').
-- =====================================================================

CREATE TABLE IF NOT EXISTS `tb_api` (
  `id_api`               BIGINT UNSIGNED  NOT NULL AUTO_INCREMENT,
  `id_adm_user_owner`    BIGINT UNSIGNED  DEFAULT NULL,                 -- FK -> tb_adm_user. Apoiador dono da instância (ex: Z-API dedicada).
                                                                        -- NULL = instância GLOBAL (token Claude compartilhado).

  -- Identidade
  `api_service`          VARCHAR(40)      NOT NULL,                     -- 'zapi','claude','chatgpt','rapid','meta','sendflow','stripe',...
  `api_label`            VARCHAR(150)     NOT NULL,                     -- "Z-API Apoiador #123 principal", "Claude Sonnet 4.7 global"
  `api_environment`      VARCHAR(20)      NOT NULL DEFAULT 'prod',       -- 'dev','staging','prod'

  -- Credenciais (CRIPTOGRAFADAS — ver header). Comprimento sobrado pro
  -- ciphertext + IV + tag base64 caber.
  `api_instance_id`      VARCHAR(150)     DEFAULT NULL,                  -- ID externo da instância (Z-API entrega esse). Sem criptografia (é ID, não segredo).
  `api_token_primary`    VARCHAR(800)     NOT NULL,                     -- ciphertext: token principal (z-api: instance_token)
  `api_token_secondary`  VARCHAR(800)     DEFAULT NULL,                  -- ciphertext: token secundário (z-api: client_token)
  `api_endpoint_url`     VARCHAR(500)     DEFAULT NULL,                  -- URL base custom
  `api_webhook_url`      VARCHAR(500)     DEFAULT NULL,                  -- URL pra qual o serviço envia callbacks (ex: hook.w19.com.br/zapi/enviar.php)

  -- Metadados livres (campos específicos do serviço)
  `api_meta`             JSON             DEFAULT NULL,                  -- ex: {phone:"+5511...", connected:true, account_id:"..."}

  -- Operação
  `api_status`           TINYINT(1)       NOT NULL DEFAULT 1,            -- 1 ativa, 0 pausada, -1 expirada/revogada
  `api_health`           ENUM('ok','warn','down','unknown') NOT NULL DEFAULT 'unknown',
  `api_last_used_at`     DATETIME         DEFAULT NULL,
  `api_last_check_at`    DATETIME         DEFAULT NULL,
  `api_created_at`       DATETIME         NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `api_updated_at`       DATETIME         NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,

  PRIMARY KEY (`id_api`),
  KEY `ix_api_service` (`api_service`),
  KEY `ix_api_owner`   (`id_adm_user_owner`),
  KEY `ix_api_status`  (`api_status`),
  CONSTRAINT `fk_api_adm_user_owner` FOREIGN KEY (`id_adm_user_owner`) REFERENCES `tb_adm_user` (`id_adm_user`) ON DELETE SET NULL ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
