"use server";

import { eq, inArray } from "drizzle-orm";
import { db } from "@/lib/db";
import { BaseActionState } from "@/lib/types";
import { {{joinCaseVariants.pluralCamelCase}} } from "@/schema/{{joinCaseVariants.pluralKebabCase}}";

export async function update{{joinCaseVariants.pluralPascalCase}}(
  prevState: BaseActionState,
  formData: FormData
): Promise<BaseActionState> {
  try {
    const id = formData.get("id") as string;
    const new{{rightCaseVariants.singularPascalCase}}Ids = formData.getAll("{{rightCaseVariants.singularCamelCase}}Ids") as string[];

    const current{{rightCaseVariants.pluralPascalCase}} = await db.query.{{joinCaseVariants.pluralCamelCase}}.findMany({
      where: eq({{joinCaseVariants.pluralCamelCase}}.{{leftCaseVariants.singularCamelCase}}Id, id),
      columns: {
        {{rightCaseVariants.singularCamelCase}}Id: true,
      },
    });

    const current{{rightCaseVariants.singularPascalCase}}Ids = current{{rightCaseVariants.pluralPascalCase}}.map(({{rightCaseVariants.singularCamelCase}}) => {{rightCaseVariants.singularCamelCase}}.{{rightCaseVariants.singularCamelCase}}Id);

    const {{rightCaseVariants.singularCamelCase}}IdsToAdd = new{{rightCaseVariants.singularPascalCase}}Ids.filter(
      ({{rightCaseVariants.singularCamelCase}}Id) => !current{{rightCaseVariants.singularPascalCase}}Ids.includes({{rightCaseVariants.singularCamelCase}}Id)
    );

    const {{rightCaseVariants.singularCamelCase}}IdsToRemove = current{{rightCaseVariants.singularPascalCase}}Ids
      .filter(({{rightCaseVariants.singularCamelCase}}Id) => !new{{rightCaseVariants.singularPascalCase}}Ids.includes({{rightCaseVariants.singularCamelCase}}Id!))
      .filter(({{rightCaseVariants.singularCamelCase}}Id) => {{rightCaseVariants.singularCamelCase}}Id !== null);;

    if ({{rightCaseVariants.singularCamelCase}}IdsToAdd.length > 0) {
      const data = {{rightCaseVariants.singularCamelCase}}IdsToAdd.map(({{rightCaseVariants.singularCamelCase}}Id) => {
        return {
          {{leftCaseVariants.singularCamelCase}}Id: id,
          {{rightCaseVariants.singularCamelCase}}Id: {{rightCaseVariants.singularCamelCase}}Id,
        };
      });
      await db.insert({{joinCaseVariants.pluralCamelCase}}).values(data);
    }

    if ({{rightCaseVariants.singularCamelCase}}IdsToRemove.length > 0) {
      await db
        .delete({{joinCaseVariants.pluralCamelCase}})
        .where(inArray({{joinCaseVariants.pluralCamelCase}}.{{rightCaseVariants.singularCamelCase}}Id, {{rightCaseVariants.singularCamelCase}}IdsToRemove));
    }

    return {
      status: "success",
    };
  } catch (error) {
    console.error(error);
    return {
      status: "error",
    };
  }
}
