"use server";

import { revalidatePath } from "next/cache";
import {
  settingsFormValues,
  validateSettings,
  type SettingsFieldErrors,
  type SettingsFormValues,
} from "@/lib/validation/settings";
import { canEdit, VIEW_ONLY_ERROR } from "@/lib/auth/roles";
import { requireUser } from "@/server/auth/session";
import { logger } from "@/server/logger";
import { updateMonitoringSettings } from "@/server/settings/service";

export type SettingsFormState = {
  values?: SettingsFormValues;
  fieldErrors?: SettingsFieldErrors;
  error?: string;
  saved?: boolean;
};

export async function updateSettingsAction(_prev: SettingsFormState, formData: FormData): Promise<SettingsFormState> {
  const user = await requireUser();
  if (!canEdit(user)) return { error: VIEW_ONLY_ERROR };
  const values = settingsFormValues(formData);

  const validated = validateSettings(values);
  if (!validated.ok) return { values, fieldErrors: validated.fieldErrors };

  try {
    const { changed } = await updateMonitoringSettings(validated.data);
    if (changed) logger.info("settings.updated", { ...validated.data, by: user.username });
  } catch (error) {
    logger.error("settings.update.failed", { error });
    return { values, error: "Something went wrong while saving. Please try again." };
  }

  // The timezone changes how every date in the app is displayed.
  revalidatePath("/", "layout");
  return { values, saved: true };
}
