import { isPlainObject } from "@/lib/contentFormUtils";

export type ApiQueryFilter = {
  key: string;
  value: string;
};

export function createEmptyApiQueryFilter(): ApiQueryFilter {
  return { key: "", value: "" };
}

function readFilterField(item: Record<string, unknown>, ...keys: string[]): string {
  for (const key of keys) {
    const value = item[key];
    if (typeof value === "string") return value;
  }
  return "";
}

/** Drop blank rows; never return placeholder-only arrays like [{}]. */
export function normalizeApiQueryFilters(filters: unknown): ApiQueryFilter[] {
  if (!Array.isArray(filters)) return [];

  return filters
    .map((item) => {
      if (!isPlainObject(item)) return null;
      const key = readFilterField(item, "key", "field", "name", "param");
      const value = readFilterField(item, "value");
      if (!key.trim() && !value.trim()) return null;
      return { key, value };
    })
    .filter((item): item is ApiQueryFilter => item !== null);
}

export function appendApiQueryFilters(url: string, filters: unknown): string {
  const normalized = normalizeApiQueryFilters(filters);
  if (!normalized.length || !url.trim()) return url;

  const [base, hash = ""] = url.split("#");
  const [path, query = ""] = base.split("?");
  const params = new URLSearchParams(query);

  for (const filter of normalized) {
    const key = filter.key.trim();
    if (!key) continue;
    params.set(key, filter.value);
  }

  const queryString = params.toString();
  const withQuery = queryString ? `${path}?${queryString}` : path;
  return hash ? `${withQuery}#${hash}` : withQuery;
}
