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

export async function POST(req: Request, context: { params: Promise<{ id: string }> }) {
  const { id } = await context.params;
  const userId = getUserIdFromRequest(req);
  // x-forwarded-for는 다중 IP가 올 수 있음 -> 첫 번째(실제 클라이언트)만 사용
  const forwardedFor = req.headers.get("x-forwarded-for") || undefined;
  const ip = forwardedFor ? forwardedFor.split(",")[0]?.trim() || undefined : undefined;
  const userAgent = req.headers.get("user-agent") || undefined;

  // 중복 방지: 로그인 사용자는 userId로, 비로그인은 (ip + userAgent) 조합으로 1회만 카운트
  const orConditions: any[] = [];
  if (userId) {
    orConditions.push({ userId });
  }
  // 비로그인 식별: 가능한 한 많은 신호를 사용 (ip+UA 우선, 단일 ip 또는 단일 UA로도 보수적으로 차단)
  if (!userId) {
    if (ip && userAgent) {
      orConditions.push({ userId: null, ip, userAgent });
    } else if (ip) {
      orConditions.push({ userId: null, ip, userAgent: null });
    } else if (userAgent) {
      orConditions.push({ userId: null, ip: null, userAgent });
    }
  }

  let counted = false;
  await prisma.$transaction(async (tx) => {
    if (orConditions.length > 0) {
      const exists = await tx.postViewLog.findFirst({
        where: {
          postId: id,
          OR: orConditions,
        },
        select: { id: true },
      });
      if (exists) {
        return;
      }
    } else {
      // 식별 정보가 전혀 없을 때는 안전을 위해 카운트하지 않음
      return;
    }

    await tx.postViewLog.create({
      data: {
        postId: id,
        userId: userId ?? null,
        ip: ip ?? null,
        userAgent: userAgent ?? null,
      },
    });
    await tx.postStat.upsert({
      where: { postId: id },
      update: { views: { increment: 1 } },
      create: { postId: id, views: 1 },
    });
    counted = true;
  });

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


