"use server";

import { revalidatePath } from "next/cache";
import { getServerSession } from "next-auth";
import { authOptions } from "@/lib/auth/auth-options";
import { initDb } from "@/lib/db";
import { onboardingSchema } from "@/lib/validation/onboarding";
import type { OnboardingInput } from "@/lib/validation/onboarding";
import type { ActionResult } from "@/lib/actions/auth";

/** Complete onboarding: create workspace and link to user. */
export async function completeOnboarding(
  input: OnboardingInput
): Promise<ActionResult<{ workspaceId: string }>> {
  const session = await getServerSession(authOptions);
  if (!session?.user?.id) {
    return { success: false, error: "Not authenticated" };
  }

  if (session.user.workspaceId) {
    return { success: false, error: "Workspace already exists" };
  }

  const parsed = onboardingSchema.safeParse(input);
  if (!parsed.success) {
    return {
      success: false,
      error: parsed.error.issues[0]?.message ?? "Invalid input",
    };
  }

  const { sequelize, Workspace, User, AuditLog } = initDb();

  try {
    const result = await sequelize.transaction(async (t) => {
      const user = await User.findByPk(session.user.id, {
        transaction: t,
        lock: t.LOCK.UPDATE,
      });

      if (!user) {
        throw new Error("USER_NOT_FOUND");
      }

      if (user.workspaceId) {
        throw new Error("WORKSPACE_EXISTS");
      }

      const workspace = await Workspace.create(
        {
          name: parsed.data.companyName,
          planTier: "free",
          responseQuotaLimit: 100,
        },
        { transaction: t }
      );

      await user.update({ workspaceId: workspace.id }, { transaction: t });

      await AuditLog.create(
        {
          actorUserId: session.user.id,
          workspaceId: workspace.id,
          action: "workspace.created",
          metadata: {
            teamSize: parsed.data.teamSize,
            goals: parsed.data.goals,
          },
        },
        { transaction: t }
      );

      return workspace.id;
    });

    revalidatePath("/app");
    revalidatePath("/onboarding");

    return { success: true, data: { workspaceId: result } };
  } catch (err) {
    if (err instanceof Error && err.message === "WORKSPACE_EXISTS") {
      return { success: false, error: "Workspace already exists" };
    }
    return { success: false, error: "Failed to create workspace" };
  }
}
