import { and, eq } from "drizzle-orm";
import { merkmalValues } from "@/db/schema";
import type { Tx } from "@/lib/audit";
import type { MerkmalValueInput } from "@/lib/merkmale/types";

/**
 * Schreibt die Merkmal-Werte einer Entity (Fahrzeug/Gerät) in `merkmal_values`
 * per delete-then-insert: pro Merkmal wird der bestehende Wert gelöscht und —
 * sofern nicht leer — neu eingefügt. So bleibt pro (entity, merkmal) genau eine
 * Zeile; ein geleerter Wert hinterlässt KEINE Zeile.
 *
 * Läuft IMMER innerhalb der aufrufenden Transaktion (`Tx` aus @/lib/audit,
 * kein `any` — Querschnittsstandard 12), damit Insert/Audit atomar sind.
 *
 * `boolean false` und `num 0` gelten als gesetzt; nur `null`/leerer String
 * zählen als leer.
 */
export async function upsertMerkmalValues(
  tx: Tx,
  entityTyp: "vehicle" | "equipment",
  entityId: string,
  werte: MerkmalValueInput[],
): Promise<void> {
  for (const w of werte) {
    await tx
      .delete(merkmalValues)
      .where(
        and(
          eq(merkmalValues.entityTyp, entityTyp),
          eq(merkmalValues.entityId, entityId),
          eq(merkmalValues.merkmalId, w.merkmalId),
        ),
      );

    const empty =
      w.num == null &&
      (w.text == null || w.text === "") &&
      w.bool == null;
    if (empty) continue;

    await tx.insert(merkmalValues).values({
      merkmalId: w.merkmalId,
      entityTyp,
      entityId,
      valueNum: w.num ?? null,
      valueText: w.text ?? null,
      valueBool: w.bool ?? null,
    });
  }
}
