"use server";

import { revalidatePath } from "next/cache";
import { redirect } from "next/navigation";
import { isRedirectError } from "next/dist/client/components/redirect-error";

import { getAdminAppPath, toInternalAdminPath } from "@/lib/admin-routing";
import { clearAdminSessionCookie, isAdminAuthenticated } from "@/lib/admin-auth";
import { updateMarqueeSettings } from "@/lib/app-config";
import { routing } from "@/i18n/routing";
import { getLocalizedPath } from "@/lib/locale";

async function ensureAdmin() {
  if (!(await isAdminAuthenticated())) {
    await clearAdminSessionCookie();
    redirect(getAdminAppPath("/"));
  }
}

function withMessage(pathname: string, type: "success" | "error", message: string) {
  const params = new URLSearchParams();
  params.set(type, message);

  return `${pathname}?${params.toString()}`;
}

async function revalidateMarqueePages() {
  revalidatePath(toInternalAdminPath("/"));
  revalidatePath(toInternalAdminPath("/marquee"));

  for (const locale of routing.locales) {
    revalidatePath(getLocalizedPath(locale), "layout");
    revalidatePath(getLocalizedPath(locale));
  }
}

export async function saveMarqueeSettingsAction(formData: FormData) {
  await ensureAdmin();

  try {
    const germanSettings = {
      row1: String(formData.get("row1-de") ?? "").trim(),
      row2: String(formData.get("row2-de") ?? "").trim(),
      row3: String(formData.get("row3-de") ?? "").trim(),
      row4: String(formData.get("row4-de") ?? "").trim(),
    };

    const settings = {
      locales: {
        ar: { ...germanSettings },
        en: { ...germanSettings },
        de: germanSettings,
      },
    };

    if (!germanSettings.row1) {
      throw new Error("Row 1 fuer de ist erforderlich.");
    }

    if (!germanSettings.row2) {
      throw new Error("Row 2 fuer de ist erforderlich.");
    }

    if (!germanSettings.row3) {
      throw new Error("Row 3 fuer de ist erforderlich.");
    }

    if (!germanSettings.row4) {
      throw new Error("Row 4 fuer de ist erforderlich.");
    }

    await updateMarqueeSettings(settings);
    await revalidateMarqueePages();

    redirect(withMessage(getAdminAppPath("/marquee"), "success", "Marquee gespeichert."));
  } catch (error) {
    if (isRedirectError(error)) {
      throw error;
    }

    const message = error instanceof Error ? error.message : "Marquee konnte nicht gespeichert werden.";
    redirect(withMessage(getAdminAppPath("/marquee"), "error", message));
  }
}
