-- =====================================================================================
-- 模拟第三方“推送到平台”的数据（直接写入数据库）
--
-- 适用场景：
-- - 你暂时没有后端 webhook 接收服务，但希望在测试/预发环境快速伪造第三方推送效果。
-- - 通过写入：
--   1) platform_express_event_raw  （原始请求留痕/验签结果/排障信息）
--   2) platform_express_tracking_events（解析后的轨迹事件，用于时间线展示）
--   3) platform_express_waybills（运单摘要）
--
-- 注意：
-- - 这是“绕过后端解析与验签”的直写方案，仅用于测试/演示。
-- - 生产环境不建议这样做。
-- - 执行前请确保已跑过 express_tracking_platform_upgrade.sql 创建三表。
--
-- 使用方式：
-- - Supabase SQL Editor：把下面的【参数区】内容改成你要的值，然后整段执行。
-- =====================================================================================

BEGIN;

-- =========================
-- 参数区（手工修改这里）
-- =========================
-- 承运商编码：建议与平台枚举一致（YTO/YUNDA/ZTO/STO...）
-- 运单号：建议用 TEST_ 前缀，便于清理
-- 事件码/状态码：按你的平台约定（IN_TRANSIT/OUT_FOR_DELIVERY/DELIVERED/EXCEPTION...）

DO $$
DECLARE
  v_order_no TEXT := 'ORD_TEST_20260206099';
  v_carrier TEXT := 'YTO';
  v_tracking_no TEXT := 'TEST_YT_20260206_0099';

  v_event_id TEXT := NULL; -- 可为空
  v_event_time TIMESTAMPTZ := NOW();
  v_event_code TEXT := 'OUT_FOR_DELIVERY';
  v_event_text TEXT := '派送员正在派件（伪造推送，直写数据库）';
  v_status_code TEXT := 'OUT_FOR_DELIVERY';
  v_status_code_normalized TEXT;
  v_node_name TEXT := '广州天河网点';
  v_location TEXT := '广州市 天河区';

  v_source TEXT := 'webhook'; -- webhook/poll/manual
  v_client_id TEXT := 'test_client';
  v_signature_valid BOOLEAN := TRUE;
  v_signature TEXT := 'fake-signature';
  v_remote_ip INET := '127.0.0.1';

  v_waybill_id UUID;
  v_dedupe_key TEXT;
BEGIN
  -- 兼容旧值：不再使用 ARRIVED_HUB，统一归类为 IN_TRANSIT（运输中）
  v_status_code_normalized := CASE
    WHEN v_status_code = 'ARRIVED_HUB' THEN 'IN_TRANSIT'
    WHEN v_status_code = 'PENDING' THEN 'ORDER_PLACED'
    ELSE v_status_code
  END;

  -- 1) Upsert 运单主表（保证 waybill 存在）
  INSERT INTO public.platform_express_waybills (
    order_id,
    order_no,
    carrier,
    tracking_no,
    source,
    current_status_code,
    current_status_text,
    last_synced_at
  )
  VALUES (
    NULL,
    v_order_no,
    v_carrier,
    v_tracking_no,
    'mock',
    v_status_code_normalized,
    CASE
      WHEN v_status_code = 'PENDING' THEN '已下单'
      WHEN v_status_code = 'SHIPPED' THEN '已发货'
      WHEN v_status_code = 'IN_TRANSIT' THEN '运输中'
      WHEN v_status_code = 'ARRIVED_HUB' THEN '运输中'
      WHEN v_status_code = 'OUT_FOR_DELIVERY' THEN '派送中'
      WHEN v_status_code = 'DELIVERED' THEN '已签收'
      WHEN v_status_code = 'EXCEPTION' THEN '异常'
      ELSE v_status_code
    END,
    NOW()
  )
  ON CONFLICT (carrier, tracking_no)
  DO UPDATE SET
    order_no = COALESCE(EXCLUDED.order_no, public.platform_express_waybills.order_no),
    current_status_code = EXCLUDED.current_status_code,
    current_status_text = EXCLUDED.current_status_text,
    last_synced_at = EXCLUDED.last_synced_at
  RETURNING id INTO v_waybill_id;

  -- 2) 计算幂等键（优先 event_id；否则用运单+事件码+事件时间）
  v_dedupe_key := COALESCE(
    v_event_id,
    v_tracking_no || '|' || v_event_code || '|' || to_char(v_event_time, 'YYYY-MM-DD"T"HH24:MI:SSOF')
  );

  -- 3) 写入原始接收留痕（模拟第三方请求）
  INSERT INTO public.platform_express_event_raw (
    received_at,
    source,
    client_id,
    carrier,
    tracking_no,
    signature_valid,
    signature,
    ts_header,
    request_id,
    remote_ip,
    headers,
    body,
    parse_error,
    dedupe_key
  )
  VALUES (
    NOW(),
    v_source,
    v_client_id,
    v_carrier,
    v_tracking_no,
    v_signature_valid,
    v_signature,
    EXTRACT(EPOCH FROM NOW())::text,
    'req_fake_' || replace(v_dedupe_key, '|', '_'),
    v_remote_ip,
    '{"content-type":"application/json"}'::jsonb,
    jsonb_build_object(
      'order_no', v_order_no,
      'carrier', v_carrier,
      'tracking_no', v_tracking_no,
      'event_id', v_event_id,
      'event_time', v_event_time,
      'event_code', v_event_code,
      'event_text', v_event_text,
      'status_code', v_status_code_normalized,
      'node_name', v_node_name,
      'location', v_location
    ),
    NULL,
    'raw|' || v_dedupe_key
  );

  -- 4) 写入解析后的轨迹事件（用于时间线展示）
  INSERT INTO public.platform_express_tracking_events (
    waybill_id,
    carrier,
    tracking_no,
    event_id,
    event_time,
    event_code,
    event_text,
    status_code,
    node_name,
    location,
    description,
    evidence_urls,
    raw_payload,
    received_at,
    source,
    dedupe_key
  )
  VALUES (
    v_waybill_id,
    v_carrier,
    v_tracking_no,
    v_event_id,
    v_event_time,
    v_event_code,
    v_event_text,
    v_status_code_normalized,
    v_node_name,
    v_location,
    NULL,
    '[]'::jsonb,
    NULL,
    NOW(),
    v_source,
    v_dedupe_key
  )
  ON CONFLICT (waybill_id, dedupe_key) DO NOTHING;

END $$;

COMMIT;

-- =====================================================================================
-- 清理示例（需要时手工执行）
-- =====================================================================================
-- BEGIN;
-- DELETE FROM public.platform_express_event_raw WHERE tracking_no LIKE 'TEST_%';
-- DELETE FROM public.platform_express_tracking_events WHERE tracking_no LIKE 'TEST_%';
-- DELETE FROM public.platform_express_waybills WHERE tracking_no LIKE 'TEST_%';
-- COMMIT;
