"use server";

// Manuel liste + sihirbaz profilinin sunucu kaydı (İP-C). Upsert deseni
// reports ile aynıdır (bkz. sonuc/actions.ts): userId unique, tek satır.
//
// Senkron kuralları (PRD C1):
// - Giriş anında listeSenkronla: çakışmada CLIENT kazanır (lokal sıra başa,
//   sunucudaki eksik id'ler sona), 24 sınırı korunur; idempotent — aynı
//   girdiyle tekrar çağrı aynı sonucu üretir, çift kayıt imkânsız.
// - Girişliyken listeyiKaydet: localStorage tek kaynaktır, sunucu kaydının
//   üzerine yazılır (son yazan cihaz kazanır).

import { eq } from "drizzle-orm";
import { getSession } from "@/lib/session";
import { appDb, schema } from "@/lib/appdb";
import { tercihProfiliDogrula, type TercihProfili } from "@/features/sihirbaz/sihirbaz-sabitler";
import {
  MANUEL_LISTE_MAX,
  dogrula,
  type ManuelTercih,
} from "@/features/liste/liste-dogrula";

export type ListeSenkronSonucu =
  | { ok: true; items: ManuelTercih[]; profil: TercihProfili | null }
  | { ok: false };

async function kaydiYaz(
  userId: string,
  items: ManuelTercih[],
  profil: TercihProfili | null,
): Promise<void> {
  const now = new Date();
  await appDb
    .insert(schema.savedLists)
    .values({
      id: crypto.randomUUID(),
      userId,
      items,
      profil,
      createdAt: now,
      updatedAt: now,
    })
    .onConflictDoUpdate({
      target: schema.savedLists.userId,
      set: { items, profil, updatedAt: now },
    });
}

/** Giriş anı merge'i: lokal + sunucu birleşir, kanonik sonuç döner. */
export async function listeSenkronla(girdi: {
  items: unknown;
  profil: unknown;
}): Promise<ListeSenkronSonucu> {
  const session = await getSession();
  if (!session) return { ok: false };
  const userId = session.user.id;

  const clientItems = dogrula(girdi.items);
  const clientProfil = tercihProfiliDogrula(girdi.profil);

  const mevcut = await appDb.query.savedLists.findFirst({
    where: eq(schema.savedLists.userId, userId),
  });
  const sunucuItems = dogrula(mevcut?.items);
  const sunucuProfil = tercihProfiliDogrula(mevcut?.profil);

  const clientIdler = new Set(clientItems.map((t) => t.id));
  const items = [
    ...clientItems,
    ...sunucuItems.filter((t) => !clientIdler.has(t.id)),
  ].slice(0, MANUEL_LISTE_MAX);
  const profil = clientProfil ?? sunucuProfil;

  await kaydiYaz(userId, items, profil);
  return { ok: true, items, profil };
}

/** Girişliyken süregelen senkron: lokal durum sunucunun üzerine yazılır. */
export async function listeyiKaydet(girdi: {
  items: unknown;
  profil: unknown;
}): Promise<{ ok: boolean }> {
  const session = await getSession();
  if (!session) return { ok: false };
  await kaydiYaz(
    session.user.id,
    dogrula(girdi.items),
    tercihProfiliDogrula(girdi.profil),
  );
  return { ok: true };
}
