// Deterministisches Mischen mit Seed - damit jeder Teilnehmer eine stabile,
// aber personenabhaengige Kartenreihenfolge bekommt (siehe Restaurants-Endpoint).
// Kein externes Paket: FNV-1a-Hash + mulberry32-PRNG + Fisher-Yates.

/** FNV-1a: wandelt einen beliebigen String in einen 32-Bit-Seed um. */
export function hashStringSeed(input: string): number {
  let h = 2166136261 >>> 0;
  for (let i = 0; i < input.length; i++) {
    h ^= input.charCodeAt(i);
    h = Math.imul(h, 16777619);
  }
  return h >>> 0;
}

/** Kleiner, deterministischer 32-Bit-PRNG (mulberry32) aus einem Seed. */
export function mulberry32(seed: number): () => number {
  let a = seed >>> 0;
  return () => {
    a = (a + 0x6d2b79f5) | 0;
    let t = Math.imul(a ^ (a >>> 15), 1 | a);
    t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;
    return ((t ^ (t >>> 14)) >>> 0) / 4294967296;
  };
}

/** Liefert eine neue, seeded-gemischte Kopie des Arrays (Original bleibt unveraendert). */
export function seededShuffle<T>(arr: readonly T[], seed: number): T[] {
  const rng = mulberry32(seed);
  const out = arr.slice();
  for (let i = out.length - 1; i > 0; i--) {
    const j = Math.floor(rng() * (i + 1));
    [out[i], out[j]] = [out[j], out[i]];
  }
  return out;
}
