import { NextResponse } from "next/server";
import { getAdminAuth } from "@/lib/firebase-admin";
import { getAdminDoc, addUserDoc } from "@/lib/firestore-rest";

export async function POST(request: Request) {
  try {
    const body = (await request.json()) as {
      email?: string;
      password?: string;
      name?: string;
      idToken?: string;
    };
    const { email, password, name, idToken } = body;

    if (!idToken) {
      return NextResponse.json(
        { error: "Unauthorized. idToken required." },
        { status: 401 }
      );
    }

    const decoded = await getAdminAuth().verifyIdToken(idToken);
    const isAdmin = await getAdminDoc(decoded.uid);
    if (!isAdmin) {
      return NextResponse.json({ error: "Admin access required" }, { status: 403 });
    }

    if (!email?.trim() || !password?.trim()) {
      return NextResponse.json(
        { error: "Email and password required" },
        { status: 400 }
      );
    }

    if (password.length < 6) {
      return NextResponse.json(
        { error: "Password must be at least 6 characters" },
        { status: 400 }
      );
    }

    const auth = getAdminAuth();
    const userRecord = await auth.createUser({
      email: email.trim(),
      password: password.trim(),
      displayName: name?.trim() || email.split("@")[0],
    });

    const uid = userRecord.uid;
    await addUserDoc(uid, {
      email: userRecord.email ?? "",
      name: name?.trim() || userRecord.displayName || email.split("@")[0] || "",
    });

    return NextResponse.json({
      success: true,
      uid,
      email: userRecord.email,
    });
  } catch (error: unknown) {
    console.error("create user error:", error);
    const msg =
      error && typeof error === "object" && "code" in error
        ? (error as { code: string }).code === "auth/email-already-exists"
          ? "Email already in use"
          : (error as { code: string }).code === "auth/invalid-email"
            ? "Invalid email"
            : (error as { code: string }).code === "auth/invalid-password"
              ? "Password must be at least 6 characters"
              : "Failed to create user"
        : "Failed to create user";
    return NextResponse.json({ error: msg }, { status: 400 });
  }
}
