import { NextResponse } from "next/server";
import prisma from "@/lib/prisma";
import { getUserIdFromRequest } from "@/lib/auth";
import crypto from "crypto";

export async function POST(req: Request, context: { params: Promise<{ id: string }> }) {
  const { id } = await context.params;
  // 1) 사용자 식별 시도: 쿠키/헤더에서 userId 우선
  let userId = getUserIdFromRequest(req);

  // 2) 바디에서 clientHash 수용(클라이언트가 보낼 수 있음)
  let clientHash: string | null = null;
  // JSON 우선
  const jsonBody = await req
    .json()
    .catch(() => null);
  if (jsonBody && typeof jsonBody === "object") {
    if (!userId && typeof jsonBody.userId === "string" && jsonBody.userId.length > 0) {
      userId = jsonBody.userId;
    }
    if (typeof jsonBody.clientHash === "string" && jsonBody.clientHash.length > 0) {
      clientHash = jsonBody.clientHash;
    }
  } else {
    // form 제출도 허용 (빈 폼일 수 있음)
    const form = await req
      .formData()
      .catch(() => null);
    if (form) {
      const formUserId = form.get("userId");
      const formClientHash = form.get("clientHash");
      if (!userId && typeof formUserId === "string" && formUserId.length > 0) {
        userId = formUserId;
      }
      if (typeof formClientHash === "string" && formClientHash.length > 0) {
        clientHash = formClientHash;
      }
    }
  }

  // 3) 둘 다 없으면 서버에서 익명 고유 clientHash 생성(IP + UA 기반)
  if (!userId && !clientHash) {
    const ua = req.headers.get("user-agent") || "";
    // x-forwarded-for 첫번째가 원 IP 가정
    const ip =
      (req.headers.get("x-forwarded-for") || "")
        .split(",")
        .map((s) => s.trim())[0] ||
      req.headers.get("x-real-ip") ||
      "";
    const raw = `${ip}::${ua}`;
    clientHash = crypto.createHash("sha256").update(raw).digest("hex").slice(0, 32);
  }

  const existing = await prisma.reaction.findFirst({
    where: { postId: id, type: "RECOMMEND", userId: userId ?? null, clientHash: clientHash ?? null },
    select: { id: true },
  });
  if (!existing) {
    await prisma.reaction.create({ data: { postId: id, type: "RECOMMEND", userId: userId ?? null, clientHash: clientHash ?? null } });
    await prisma.postStat.upsert({
      where: { postId: id },
      update: { recommendCount: { increment: 1 } },
      create: { postId: id, recommendCount: 1 },
    });
  }

  // 폼 제출의 경우, JSON 대신 원래 페이지로 리다이렉트
  // jsonBody가 없고(formData 경로였거나 파싱 실패), 브라우저에서 온 요청으로 가정
  if (!jsonBody) {
    const referer = req.headers.get("referer");
    if (referer) {
      return NextResponse.redirect(referer);
    }
    const baseUrl = new URL(req.url);
    baseUrl.pathname = `/posts/${id}`;
    baseUrl.search = "";
    return NextResponse.redirect(baseUrl.toString());
  }

  return NextResponse.json({ ok: true });
}


