import { describe, expect, it } from "vitest";
import { refreshOffer } from "../src/core/offerRefresh.js";
import type { FetchContext, Offer, StoreAdapter } from "../src/core/types.js";

const offer: Offer = {
  store: "fake", brand: "MANN-FILTER", partNumber: "W 712/52", title: "Filter",
  priceEur: 5.42, inStock: true, availability: "In stock", deliveryNote: null,
  url: "https://fake.example/item", imageUrl: null, attributes: [], sourceRef: null,
};
const target = { url: offer.url, sourceRef: null, expectedBrand: "Mann Filter", expectedPartNumber: "W71252" };
const ctx = {} as FetchContext;

function adapter(refresh: StoreAdapter["refreshOffer"]): StoreAdapter {
  return {
    id: "fake", displayName: "Fake", storeHomepage: "https://fake.example", enabled: true,
    timeoutMs: 30, fetchRaw: async () => { throw new Error("search must not run"); }, parse: () => [],
    refreshOffer: refresh,
  };
}

describe("offer refresh", () => {
  it("returns a freshly checked exact offer without invoking search", async () => {
    const result = await refreshOffer(adapter(async () => ({ status: "found", offer })), target, ctx);
    expect(result).toMatchObject({ ok: true, status: "found", offer });
    expect(result.checkedAt).toEqual(expect.any(Number));
  });

  it("rejects a different product identity", async () => {
    const result = await refreshOffer(
      adapter(async () => ({ status: "found", offer: { ...offer, partNumber: "OTHER" } })),
      target,
      ctx,
    );
    expect(result).toMatchObject({ ok: false, status: "error", errorCode: "identity_mismatch", checkedAt: null });
  });

  it("keeps confirmed product-level not found distinct from failures", async () => {
    const result = await refreshOffer(adapter(async () => ({ status: "not_found" })), target, ctx);
    expect(result).toMatchObject({ ok: true, status: "not_found" });
    const failure = await refreshOffer(adapter(async () => { throw new Error("network"); }), target, ctx);
    expect(failure).toMatchObject({ ok: false, status: "error", errorCode: "fetch_failed", checkedAt: null });
  });
});
