"use server";

import { eq } from "drizzle-orm";
import { revalidatePath } from "next/cache";
import { db } from "@/db";
import { brigades } from "@/db/schema";
import { requireWehrAdmin } from "@/lib/auth/guards";
import { brigadeProfileSchema } from "@/lib/validation/brigade";
import { geocodeAddress } from "@/lib/geo/nominatim";
import { writeAudit } from "@/lib/audit";

export type ProfileActionResult =
  | { ok: true; geocodeWarnung: boolean }
  | { ok: false; error: string };

/**
 * Aktualisiert das Profil der EIGENEN Wehr (Default-deny: Guard zuerst).
 * `brigadeId` kommt IMMER aus der Session. Geocoding inline via `geocodeAddress`
 * (lat/lng selbst geschrieben; kein zweiter Geo-Pfad). Audit
 * `brigade.profile_update`. Nicht geokodierbar => Speichern trotzdem, Warnung
 * an den Aufrufer (Querschnittsstandard 4/6).
 */
export async function updateBrigadeProfile(
  input: unknown,
): Promise<ProfileActionResult> {
  const s = await requireWehrAdmin();
  const parsed = brigadeProfileSchema.safeParse(input);
  if (!parsed.success) {
    return {
      ok: false,
      error: parsed.error.issues[0]?.message ?? "Ungültige Eingabe.",
    };
  }
  const d = parsed.data;
  const query = `${d.strasse}, ${d.plz} ${d.ort}, Österreich`;
  const geo = await geocodeAddress(query);
  const geocodeWarnung = geo.status !== "ok";

  await db
    .update(brigades)
    .set({
      strasse: d.strasse,
      plz: d.plz,
      ort: d.ort,
      telefon: d.telefon ?? null,
      email: d.email ?? null,
      wehrfuehrer: d.wehrfuehrer ?? null,
      funkrufnameSchema: d.funkrufnameSchema ?? null,
      geocodeQuery: query,
      geocodedAt: new Date(),
      ...(geo.status === "ok"
        ? { lat: geo.coords.lat, lng: geo.coords.lng, geocodeStatus: "ok" }
        : { lat: null, lng: null, geocodeStatus: geo.status }),
    })
    .where(eq(brigades.id, s.user.brigadeId));

  await writeAudit(
    s.user.id,
    "brigade.profile_update",
    "brigade",
    s.user.brigadeId,
    { geocodeWarnung },
  );
  revalidatePath("/verwaltung/profil");
  return { ok: true, geocodeWarnung };
}
