"use server";

import { db } from "@/lib/db";
import { {{tableObj.pluralCamelCase}} } from "@/schema/{{tableObj.pluralKebabCase}}";
import { eq } from "drizzle-orm";
import { revalidatePath } from "next/cache";
import { redirect } from "next/navigation";
import { createSelectSchema } from "drizzle-zod";
import { BaseActionState } from "@/lib/types";
{{#if isNotPublic}}
import { auth } from "@/lib/auth";
{{/if}}

const delete{{tableObj.singularPascalCase}}Schema = createSelectSchema({{tableObj.pluralCamelCase}}).pick({ id: true });

export interface Delete{{tableObj.singularPascalCase}}State extends BaseActionState {
  errors?: {
    id?: string[];
  };
}

export async function delete{{tableObj.singularPascalCase}}(
  prevState: Delete{{tableObj.singularPascalCase}}State,
  formData: FormData
): Promise<Delete{{tableObj.singularPascalCase}}State> {
  try {
  {{#if isNotPublic}}
    const session = await auth();

    if (!session?.user?.id) {
      throw new Error("unauthenticated");
    }
  {{/if}}

  {{#if isAdmin}}
    if (session?.user?.role !== "admin") {
      throw new Error("unauthorized");
    }
  {{/if}}

    const validatedFields = delete{{tableObj.singularPascalCase}}Schema.safeParse({
      id: formData.get("id") as string,
    });

    if (!validatedFields.success) {
      return {
        errors: validatedFields.error.flatten().fieldErrors,
        status: "invalid",
      };
    }

    await db.delete({{tableObj.pluralCamelCase}}).where(eq({{tableObj.pluralCamelCase}}.id, validatedFields.data.id));
    
    revalidatePath("{{#if isAdmin}}/admin{{/if}}/{{tableObj.pluralKebabCase}}");
  } catch (error) {
    console.log(error);
    return {
      status: "error",
    }
  }

  redirect("{{#if isAdmin}}/admin{{/if}}/{{tableObj.pluralKebabCase}}");
}
