// Store en memoire pour tester le vrai round-trip (le mock global de
// jest.setup renvoie undefined, ce qui ne teste pas la persistance).
const mockStore: Record<string, string> = {};
jest.mock("expo-secure-store", () => ({
  getItemAsync: jest.fn(async (k: string) => mockStore[k] ?? null),
  setItemAsync: jest.fn(async (k: string, v: string) => {
    mockStore[k] = v;
  }),
  deleteItemAsync: jest.fn(async (k: string) => {
    delete mockStore[k];
  }),
}));

import { listInstances, removeInstance, upsertInstance } from "../../src/core/instancesService";

const A = {
  base_url: "https://a.test",
  app_name: "Alpha Mobile",
  primary_color: "#111111",
  logo_url: null,
  tenant_id: "a",
  saved_at: "2026-01-01T00:00:00.000Z",
};

describe("instancesService persistence", () => {
  beforeEach(() => {
    for (const k of Object.keys(mockStore)) {
      delete mockStore[k];
    }
    jest.clearAllMocks();
  });

  it("liste vide au depart", async () => {
    expect(await listInstances()).toEqual([]);
  });

  it("upsert puis list : round-trip", async () => {
    await upsertInstance(A);
    const list = await listInstances();
    expect(list).toHaveLength(1);
    expect(list[0].app_name).toBe("Alpha Mobile");
    expect(list[0].base_url).toBe("https://a.test");
  });

  it("upsert d'une 2e instance : 2 entrees, la plus recente en tete", async () => {
    await upsertInstance(A);
    await upsertInstance({ ...A, base_url: "https://b.test", app_name: "Beta Mobile" });
    const list = await listInstances();
    expect(list.map((i) => i.base_url)).toEqual(["https://b.test", "https://a.test"]);
  });

  it("merge par base_url + preserve last_email existant sur upsert partiel", async () => {
    await upsertInstance({ ...A, last_email: "tech@a.fr" });
    await upsertInstance({ base_url: A.base_url, app_name: "Alpha 2" });
    const list = await listInstances();
    expect(list).toHaveLength(1);
    expect(list[0].app_name).toBe("Alpha 2");
    expect(list[0].last_email).toBe("tech@a.fr");
  });

  it("remove retire l'instance", async () => {
    await upsertInstance(A);
    const after = await removeInstance(A.base_url);
    expect(after).toEqual([]);
    expect(await listInstances()).toEqual([]);
  });
});
