"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 { createSelectSchema } from "drizzle-zod";
import { BaseActionState } from "@/lib/types";
{{#if importFileUtils}}
import { uploadFile } from "@/lib/file-utils";
{{/if}}
{{#if isNotPublic}}
import { auth } from "@/lib/auth";
{{/if}}
{{#if hasDecimalColumn}}
import { z } from "zod";
{{/if}}

{{#if hasDecimalColumn}}
const update{{tableObj.singularPascalCase}}Schema = createSelectSchema({{tableObj.pluralCamelCase}}, {
  {{#each decimalColumns}}
  {{this.originalCamelCase}}: z.number(),
  {{/each}}
})
  .partial()
  .required({ id: true });
{{else}}
const update{{tableObj.singularPascalCase}}Schema = createSelectSchema({{tableObj.pluralCamelCase}}).partial().required({ id: true });
{{/if}}

export interface Update{{tableObj.singularPascalCase}}State extends BaseActionState {
  errors?: {
    {{#each columns}}
    {{this}}?: string[];
    {{/each}}
  };
}

export async function update{{tableObj.singularPascalCase}}(
  prevState: Update{{tableObj.singularPascalCase}}State,
  formData: FormData
): Promise<Update{{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}}

  {{#each uploadColumnNames}}
    const {{this.singularCamelCase}}File = formData.get("{{this.originalCamelCase}}") as File;

    let {{this.singularCamelCase}}Uri;

    if ({{this.singularCamelCase}}File.size) {
      {{this.singularCamelCase}}Uri = await uploadFile({
        file: {{this.singularCamelCase}}File,
        dir: "{{../tableObj.pluralKebabCase}}"
      })
    }
  {{/each}}

    const validatedFields = update{{tableObj.singularPascalCase}}Schema.safeParse({
{{formDataKeyVal}}
    });

    if (!validatedFields.success) {
      return {
        errors: validatedFields.error.flatten().fieldErrors,
        status: "invalid",
      };
    }

    await db
      .update({{tableObj.pluralCamelCase}})
      .set(validatedFields.data)
      .where(eq({{tableObj.pluralCamelCase}}.id, validatedFields.data.id));

    revalidatePath("{{#if isAdmin}}/admin{{/if}}/{{tableObj.pluralKebabCase}}");
    revalidatePath("{{#if isAdmin}}/admin{{/if}}/{{tableObj.pluralKebabCase}}/" + validatedFields.data.id);
    revalidatePath("{{#if isAdmin}}/admin{{/if}}/{{tableObj.pluralKebabCase}}/" + validatedFields.data.id + "/edit");

    return {
      status: "success",
    };
  } catch (error) {
    console.error(error);
    return {
      status: "error",
    }
  }
}
