import { expect, test } from "bun:test";
import {
  parseSearchAnalytics,
  parseSearchAnalyticsPages,
  topByImpressions,
} from "./parse";

test("parseSearchAnalytics maps rows and drops malformed", () => {
  const body = {
    rows: [
      {
        keys: ["lustre lab"],
        clicks: 10,
        impressions: 100,
        ctr: 0.1,
        position: 4.2,
      },
      {
        keys: ["best lustre"],
        clicks: 5,
        impressions: 200,
        ctr: 0.025,
        position: 7.1,
      },
      { clicks: 1, impressions: 1, ctr: 1, position: 1 }, // no keys → dropped
    ],
  };
  expect(parseSearchAnalytics(body)).toEqual([
    {
      query: "lustre lab",
      clicks: 10,
      impressions: 100,
      ctr: 0.1,
      position: 4.2,
    },
    {
      query: "best lustre",
      clicks: 5,
      impressions: 200,
      ctr: 0.025,
      position: 7.1,
    },
  ]);
  expect(parseSearchAnalytics({})).toEqual([]);
});

test("parseSearchAnalyticsPages: keys [query, page], lignes malformées sautées", () => {
  const body = {
    rows: [
      {
        keys: ["audit", "https://a.fr/p"],
        clicks: 3,
        impressions: 40,
        ctr: 0.075,
        position: 6.2,
      },
      { keys: ["sans-page"], clicks: 1 },
      { clicks: 2 },
    ],
  };
  const rows = parseSearchAnalyticsPages(body);
  expect(rows).toHaveLength(1);
  expect(rows[0]).toEqual({
    query: "audit",
    page: "https://a.fr/p",
    clicks: 3,
    impressions: 40,
    ctr: 0.075,
    position: 6.2,
  });
});

test("topByImpressions sorts desc and caps", () => {
  const rows = [
    { query: "a", clicks: 0, impressions: 50, ctr: 0, position: 9 },
    { query: "b", clicks: 0, impressions: 300, ctr: 0, position: 3 },
    { query: "c", clicks: 0, impressions: 120, ctr: 0, position: 5 },
  ];
  expect(topByImpressions(rows, 2).map((r) => r.query)).toEqual(["b", "c"]);
});
