// src/lib/keywords/import/serp-filename.test.ts
import { describe, expect, test } from "bun:test";
import { extractSerpFilenameHint } from "./serp-filename";

describe("extractSerpFilenameHint", () => {
  test("real Mangools SERPChecker export name", () => {
    expect(
      extractSerpFilenameHint("serpchecker_jewelry_manufacturers_export.csv"),
    ).toEqual({
      provider: "mangools-serpchecker",
      term: "jewelry manufacturers",
    });
  });

  test("browser duplicate-download suffix: ' (1)' before the extension", () => {
    expect(
      extractSerpFilenameHint(
        "serpchecker_jewelry_manufacturers_export (1).csv",
      ),
    ).toEqual({
      provider: "mangools-serpchecker",
      term: "jewelry manufacturers",
    });
  });

  test("browser duplicate-download suffix: '-2' before the extension", () => {
    expect(
      extractSerpFilenameHint("serpchecker_jewelry_manufacturers_export-2.csv"),
    ).toEqual({
      provider: "mangools-serpchecker",
      term: "jewelry manufacturers",
    });
  });

  test("higher duplicate counts also strip ('(12)')", () => {
    expect(
      extractSerpFilenameHint(
        "serpchecker_jewelry_manufacturers_export (12).csv",
      ),
    ).toEqual({
      provider: "mangools-serpchecker",
      term: "jewelry manufacturers",
    });
  });

  test("case-insensitive on the provider/extension tokens", () => {
    expect(
      extractSerpFilenameHint("SERPChecker_jewelry_manufacturers_EXPORT.CSV"),
    ).toEqual({
      provider: "mangools-serpchecker",
      term: "jewelry manufacturers",
    });
  });

  test("multiple underscores collapse to single spaces", () => {
    expect(
      extractSerpFilenameHint("serpchecker_best__running___shoes_export.csv"),
    ).toEqual({ provider: "mangools-serpchecker", term: "best running shoes" });
  });

  test("single-word term", () => {
    expect(extractSerpFilenameHint("serpchecker_jewelry_export.csv")).toEqual({
      provider: "mangools-serpchecker",
      term: "jewelry",
    });
  });

  test("leading/trailing whitespace on the filename is tolerated", () => {
    expect(
      extractSerpFilenameHint(
        "  serpchecker_jewelry_manufacturers_export.csv  ",
      ),
    ).toEqual({
      provider: "mangools-serpchecker",
      term: "jewelry manufacturers",
    });
  });

  test("non-match: fictional SE Ranking export name", () => {
    expect(
      extractSerpFilenameHint("se-ranking_jewelry_manufacturers_serp.csv"),
    ).toBeNull();
  });

  test("non-match: unrelated filename", () => {
    expect(extractSerpFilenameHint("keywords.csv")).toBeNull();
  });

  test("non-match: right prefix, wrong extension (.txt)", () => {
    expect(
      extractSerpFilenameHint("serpchecker_jewelry_manufacturers_export.txt"),
    ).toBeNull();
  });

  test("non-match: missing the _export suffix", () => {
    expect(
      extractSerpFilenameHint("serpchecker_jewelry_manufacturers.csv"),
    ).toBeNull();
  });
});
