import { NextResponse } from "next/server";
import prisma from "@/lib/prisma";
import { registerSchema } from "@/lib/validation/auth";
import { hashPassword } from "@/lib/password";

export async function POST(req: Request) {
  const body = await req.json();
  const parsed = registerSchema.safeParse(body);
  if (!parsed.success)
    return NextResponse.json({ error: parsed.error.flatten() }, { status: 400 });
  const { nickname, name, password, profileImage } = parsed.data as {
    nickname: string;
    name: string;
    password: string;
    profileImage?: string;
  };
  // 아이디(닉네임 필드와 구분)를 우선 검사
  const nicknameExists = await prisma.user.findFirst({ where: { nickname } });
  if (nicknameExists) {
    return NextResponse.json(
      { error: { fieldErrors: { nickname: ["이미 사용 중인 아이디입니다"] } } },
      { status: 409 }
    );
  }
  // 표시용 닉네임(name)도 유일해야 함
  const nameExists = await prisma.user.findFirst({ where: { name } });
  if (nameExists) {
    return NextResponse.json(
      { error: { fieldErrors: { name: ["이미 사용 중인 닉네임입니다"] } } },
      { status: 409 }
    );
  }
  const user = await prisma.user.create({
    data: {
      userId: nickname,
      nickname,
      name,
      passwordHash: hashPassword(password),
      agreementTermsAt: new Date(),
      // 일부 환경에서 birth 컬럼이 NOT NULL 제약으로 남아있는 경우가 있어 안전 기본값을 기록
      birth: new Date(0),
      // 일부 환경에서 phone 컬럼이 NOT NULL+UNIQUE 제약으로 남아있는 경우가 있어
      // 임시 유니크 플레이스홀더를 기록합니다. (후속 마이그레이션으로 NULL 허용 권장)
      phone: `ph_${Date.now()}_${Math.random().toString(36).slice(2, 10)}`,
      profileImage: profileImage || null,
    },
    select: { userId: true, nickname: true },
  });
  return NextResponse.json({ user }, { status: 201 });
}


