-- 킨텍스 — F099 API·웹훅 게이트웨이(인바운드 한정) + F052 리드 팔로업 EDM 자동 트리거 (멱등)
-- 리스크 G4 정합(FEATURE_GAP §7-2·§보안 불변): 외부 API 금지 원칙 —
--   ① 아웃바운드 발송은 스텁(발송 큐 레코드 기록까지 · 실 HTTP 콜 disabled)
--   ② 인바운드 수신만 실동작(토큰 + HMAC-SHA256 서명 이중 검증 후 저장).
-- 시크릿은 응답 미노출. 아웃바운드 구독 시크릿은 SHA-256 해시 저장(발송 disabled → 원문 불필요),
--   인바운드 시크릿은 AES-256-GCM 봉인 저장(SecretCipher) — HMAC 검증은 원문이 필요하기 때문(가역).
-- 보안 불변: 본 마이그레이션은 V35 단독. V1~V34 및 타 팀 마이그레이션(visitor/cms/marketing)을 변경하지 않는다.
-- 멀티테넌시 표준(소유자 지시 2026-07-12): tenant_id = PK 선두 복합키 + DEFAULT 'KINTEX'.

-- ── ① 아웃바운드 웹훅 구독 등록(관리자 CRUD, @Audited) ─────────────────────────
-- event_type(lead.hot·invoice.paid·auction.awarded 등)별 콜백 URL + 시크릿(해시) 등록.
-- 실 발송은 disabled(스텁) — webhook_delivery 에 큐 레코드만 남긴다.
CREATE TABLE IF NOT EXISTS webhook_subscription (
    tenant_id     varchar(40)  NOT NULL DEFAULT 'KINTEX',
    id            varchar(40)  NOT NULL,
    event_type    varchar(60)  NOT NULL,                     -- lead.hot|invoice.paid|auction.awarded ...
    callback_url  varchar(500) NOT NULL,                     -- 표시/전달용(발송 disabled — 실 콜 없음)
    secret_hash   varchar(120) NOT NULL,                     -- SHA-256(secret) hex — 원문 미저장·미노출
    description   varchar(300),
    active        boolean      NOT NULL DEFAULT true,
    created_by    varchar(40),
    created_at    timestamptz  NOT NULL DEFAULT now(),
    updated_at    timestamptz  NOT NULL DEFAULT now(),
    UNIQUE (id),
    PRIMARY KEY (tenant_id, id)                              -- ★표준: tenant_id 선두 복합 PK
);
CREATE INDEX IF NOT EXISTS idx_webhook_sub_type ON webhook_subscription (tenant_id, event_type, active);

COMMENT ON TABLE  webhook_subscription             IS 'F099 아웃바운드 웹훅 구독 — 발송은 스텁(disabled). event_type별 콜백 등록';
COMMENT ON COLUMN webhook_subscription.secret_hash IS 'SHA-256(secret) hex — 원문 미저장. 발송 disabled 이므로 재계산 불요';

-- ── 아웃바운드 발송 큐(스텁 — 실 HTTP 콜 없음, disabled 레코드만) ───────────────
CREATE TABLE IF NOT EXISTS webhook_delivery (
    tenant_id       varchar(40)  NOT NULL DEFAULT 'KINTEX',
    id              varchar(40)  NOT NULL,
    subscription_id varchar(40)  NOT NULL,                   -- webhook_subscription.id 소프트 참조
    event_type      varchar(60)  NOT NULL,
    payload_json    text         NOT NULL DEFAULT '{}',      -- 발송 예정 페이로드(민감정보 제외 계약)
    status          varchar(20)  NOT NULL DEFAULT 'disabled',-- disabled(스텁) — 실발송 시 queued|sent|failed
    note            varchar(300),
    created_at      timestamptz  NOT NULL DEFAULT now(),
    UNIQUE (id),
    PRIMARY KEY (tenant_id, id)
);
CREATE INDEX IF NOT EXISTS idx_webhook_delivery_sub ON webhook_delivery (tenant_id, subscription_id, created_at);

COMMENT ON TABLE webhook_delivery IS 'F099 아웃바운드 발송 큐(스텁) — status=disabled 는 기록만·실 HTTP 콜 미수행';

-- ── ③ 인바운드 수신 엔드포인트 설정(토큰 + 봉인 시크릿) ────────────────────────
-- POST /api/webhooks/in/{token} 가 조회할 설정. token 은 공개 식별자, secret_enc 는 HMAC 검증용(봉인 저장).
CREATE TABLE IF NOT EXISTS webhook_inbound_endpoint (
    tenant_id     varchar(40)  NOT NULL DEFAULT 'KINTEX',
    id            varchar(40)  NOT NULL,
    token         varchar(80)  NOT NULL,                     -- 공개 경로 토큰(추측 불가·랜덤)
    secret_enc    varchar(400) NOT NULL,                     -- AES-256-GCM 봉인(enc:v1:...) — 응답 미노출
    source_label  varchar(120),                              -- 발신 시스템 표시명(민감정보 아님)
    active        boolean      NOT NULL DEFAULT true,
    created_by    varchar(40),
    created_at    timestamptz  NOT NULL DEFAULT now(),
    UNIQUE (id),
    UNIQUE (token),
    PRIMARY KEY (tenant_id, id)
);
CREATE INDEX IF NOT EXISTS idx_webhook_in_token ON webhook_inbound_endpoint (token, active);

COMMENT ON TABLE  webhook_inbound_endpoint            IS 'F099 인바운드 수신 엔드포인트 — token(공개) + secret_enc(봉인) 이중 검증';
COMMENT ON COLUMN webhook_inbound_endpoint.secret_enc IS 'AES-256-GCM 봉인 HMAC 시크릿 — 응답 미노출. 검증에 원문 필요하여 가역 저장';

-- ── 인바운드 수신 이벤트 로그(서명 검증 결과 포함) ───────────────────────────
CREATE TABLE IF NOT EXISTS webhook_inbound_event (
    tenant_id       varchar(40)  NOT NULL DEFAULT 'KINTEX',
    id              varchar(40)  NOT NULL,
    endpoint_token  varchar(80)  NOT NULL,
    event_type      varchar(60),                             -- 페이로드 declared 유형(신뢰 전 검증됨)
    payload_json    text         NOT NULL DEFAULT '{}',
    signature_valid boolean      NOT NULL DEFAULT false,
    received_at     timestamptz  NOT NULL DEFAULT now(),
    UNIQUE (id),
    PRIMARY KEY (tenant_id, id)
);
CREATE INDEX IF NOT EXISTS idx_webhook_in_event ON webhook_inbound_event (tenant_id, endpoint_token, received_at);

COMMENT ON TABLE webhook_inbound_event IS 'F099 인바운드 수신 이벤트 로그 — 토큰·HMAC 검증 후 저장(source IP 등 민감정보 미저장)';

-- ── ② F052 리드 팔로업 EDM 자동 트리거 멱등 로그 ─────────────────────────────
-- hot 리드(score>=80) 1건당 팔로업 캠페인 초안(edm_campaign, status=draft) 1건 자동 생성.
-- UNIQUE(event_id, lead_id) 가 스케줄 스윕 중복 생성을 차단하는 멱등 키.
CREATE TABLE IF NOT EXISTS edm_followup_log (
    tenant_id    varchar(40)  NOT NULL DEFAULT 'KINTEX',
    id           varchar(40)  NOT NULL,
    event_id     varchar(40)  NOT NULL,                      -- lead.event_id (soft ref)
    lead_id      varchar(40)  NOT NULL,                      -- lead.id (soft ref)
    campaign_id  varchar(40),                                -- 생성된 edm_campaign.id
    hot_score    integer      NOT NULL DEFAULT 0,
    body_draft   text,                                       -- lead.followup_draft 스냅샷(추적용)
    created_at   timestamptz  NOT NULL DEFAULT now(),
    UNIQUE (id),
    UNIQUE (event_id, lead_id),                              -- ★멱등 키: 리드당 팔로업 1회
    PRIMARY KEY (tenant_id, id)
);
CREATE INDEX IF NOT EXISTS idx_edm_followup_event ON edm_followup_log (tenant_id, event_id, created_at);

COMMENT ON TABLE edm_followup_log IS 'F052 리드 팔로업 EDM 자동 트리거 멱등 로그 — hot 리드당 캠페인 초안 1회(발송 없음)';

-- ── 시드: 인바운드 데모 엔드포인트(봉인 시크릿은 애플리케이션이 최초 기동 시 채움) ──
-- 봉인은 SecretCipher(런타임 키) 필요 → SQL 로 평문 저장 금지. 데모 토큰만 예약하고 secret 은
-- 부팅 시 WebhookInboundSeeder 가 미봉인('') 엔드포인트에 한해 채운다. 여기선 레코드 미삽입(안전).
