// 현재 로그인 사용자의 푸시 구독 정보 저장 (endpoint 기준 upsert)
import { NextRequest, NextResponse } from "next/server";
import { pool } from "@/lib/db";
import { createObjectId } from "@/lib/utils";
import { requireMomoUser } from "@/lib/momo-guard";
import { ensurePushTable, sendPush } from "@/lib/push";

export async function POST(req: NextRequest) {
  const r = await requireMomoUser();
  if (r instanceof NextResponse) return r;
  await ensurePushTable();

  const userId = r.user.objid || r.user.userId;
  const body = await req.json().catch(() => ({}));
  const sub = body?.subscription as
    | { endpoint?: string; keys?: { p256dh?: string; auth?: string } }
    | undefined;
  const endpoint = sub?.endpoint;
  const p256dh = sub?.keys?.p256dh;
  const auth = sub?.keys?.auth;
  const userAgent = String(body?.userAgent ?? req.headers.get("user-agent") ?? "");

  if (!endpoint || !p256dh || !auth) {
    return NextResponse.json({ success: false, message: "구독 정보가 올바르지 않습니다." }, { status: 400 });
  }

  await pool.query(
    `INSERT INTO momo_push_subscriptions (objid, user_id, endpoint, p256dh, auth, user_agent, regdate, last_seen)
     VALUES ($1, $2, $3, $4, $5, $6, NOW(), NOW())
     ON CONFLICT (endpoint) DO UPDATE
       SET user_id = EXCLUDED.user_id, p256dh = EXCLUDED.p256dh, auth = EXCLUDED.auth,
           user_agent = EXCLUDED.user_agent, last_seen = NOW()`,
    [createObjectId(), userId, endpoint, p256dh, auth, userAgent]
  );

  // 같은 사용자의 이전 구독은 정리 — 마지막에 구독한 기기/앱 하나만 유지.
  //   브라우저(삼성 인터넷 등)로 먼저 구독해 둔 게 남아 앱이 아닌 브라우저 알림으로
  //   오던 문제 방지. (앱에서 다시 켜면 옛 브라우저 구독이 제거됨)
  await pool.query(
    `DELETE FROM momo_push_subscriptions WHERE user_id = $1 AND endpoint <> $2`,
    [userId, endpoint]
  ).catch(() => {});

  // 구독 직후 환영 푸시 — 전체 파이프라인(서버→푸시서비스→기기) 동작 즉시 확인용
  const welcome = await sendPush(
    { title: "알림이 켜졌어요 🔔", body: "새 품목이 판매되면 여기로 알려드릴게요.", url: "/m/orders/new" },
    [userId]
  ).catch((e) => { console.error("[push/subscribe welcome]", e); return { sent: 0, failed: 0 }; });

  return NextResponse.json({ success: true, welcomeSent: welcome.sent });
}
