"use server";

import { db } from "@/lib/db";
import { {{tableObj.pluralCamelCase}} } from "@/schema/{{tableObj.pluralKebabCase}}";
import { redirect } from "next/navigation";
import { revalidatePath } from "next/cache";
import { createInsertSchema } 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 insert{{tableObj.singularPascalCase}}Schema = createInsertSchema({{tableObj.pluralCamelCase}}, {
  {{#each decimalColumns}}
  {{this.originalCamelCase}}: z.number(),
  {{/each}}
});
{{else}}
const insert{{tableObj.singularPascalCase}}Schema = createInsertSchema({{tableObj.pluralCamelCase}});
{{/if}}

export interface Create{{tableObj.singularPascalCase}}State extends BaseActionState {
  errors?: {
    {{#each columns}}
    {{this}}?: string[];
    {{/each}}
  };
}

export async function create{{tableObj.singularPascalCase}}(
  prevState: Create{{tableObj.singularPascalCase}}State,
  formData: FormData
): Promise<Create{{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 = insert{{tableObj.singularPascalCase}}Schema.safeParse({
{{formDataKeyVal}}
    });

    if (!validatedFields.success) {
      return {
        errors: validatedFields.error.flatten().fieldErrors,
        status: "invalid",
      };
    }

    await db.insert({{tableObj.pluralCamelCase}}).values(validatedFields.data);
    
    revalidatePath("{{#if isAdmin}}/admin{{/if}}/{{tableObj.pluralKebabCase}}");
  } catch (error) {
    console.error(error);
    return {
      status: "error",
    }
  }

  redirect("{{#if isAdmin}}/admin{{/if}}/{{tableObj.pluralKebabCase}}");
}
