import { NextResponse } from "next/server";
import prisma from "@/lib/prisma";
import { z } from "zod";
import { hashPassword } from "@/lib/password";
import { getUserIdOrAdmin } from "@/lib/auth";

const createCommentSchema = z.object({
  postId: z.string().min(1),
  parentId: z.string().nullable().optional(), // 부모 댓글 ID (대댓글). 최상위 댓글은 null 허용
  authorId: z.string().optional(),
  content: z.string().min(1),
  isAnonymous: z.boolean().optional(),
  isSecret: z.boolean().optional(),
  secretPassword: z.string().min(1).optional(), // 비회원 비밀번호(옵션)
});

export async function POST(req: Request) {
  const body = await req.json();
  const parsed = createCommentSchema.safeParse(body);
  if (!parsed.success) {
    return NextResponse.json({ error: parsed.error.flatten() }, { status: 400 });
  }
  const { postId, parentId, authorId, content, isAnonymous, isSecret, secretPassword } = parsed.data;
  // 개발 편의: 인증 미설정 시 admin 계정으로 댓글 작성 처리
  const effectiveAuthorId = authorId ?? (await getUserIdOrAdmin(req));
  
  // 대댓글인 경우 부모 댓글 확인 및 depth 계산
  let depth = 0;
  if (parentId) {
    const parent = await prisma.comment.findUnique({
      where: { id: parentId },
      select: { depth: true, postId: true },
    });
    if (!parent) {
      return NextResponse.json({ error: "부모 댓글을 찾을 수 없습니다." }, { status: 404 });
    }
    if (parent.postId !== postId) {
      return NextResponse.json({ error: "게시글이 일치하지 않습니다." }, { status: 400 });
    }
    depth = parent.depth + 1;
    if (depth > 2) {
      return NextResponse.json({ error: "최대 3단계까지 대댓글을 작성할 수 있습니다." }, { status: 400 });
    }
  }
  
  const secretPasswordHash = secretPassword ? hashPassword(secretPassword) : null;
  const comment = await prisma.comment.create({
    data: {
      postId,
      parentId: parentId ?? null,
      depth,
      authorId: effectiveAuthorId ?? null,
      content,
      isAnonymous: !!isAnonymous,
      isSecret: !!isSecret,
      secretPasswordHash,
    },
    include: {
      author: { select: { userId: true, nickname: true, profileImage: true } },
    },
  });

  // 통계 업데이트: 댓글 수 증가
  await prisma.postStat.upsert({
    where: { postId },
    update: { commentsCount: { increment: 1 } },
    create: { postId, commentsCount: 1 },
  });
  return NextResponse.json({ comment }, { status: 201 });
}


