import "@johnlindquist/kit";
export interface Agents {
  [browser: string]: Agent;
}
export interface Agent {
  browser: string;
  long_name: string;
  abbr: string;
  prefix: string;
  type: string;
  usage_global?: {
    string: number;
  };
  versions: Array<null | string>;
}
export interface Data {
  [browser: string]: Feature;
}
export interface Feature {
  title: string;
  description: string;
  spec: string;
  status: string;
  links: Link[];
  categories: string[];
  stats: Stats[];
  notes?: string;
  notes_by_num?: { [num: string]: string };
}
export interface Link {
  url: string;
  title: string;
}
export interface Stats {
  [browser: string]: null | string;
}
const TABLE_HEADER = `
| Browser (Latest version) | Can I Use? |
| ------------------------ | ---------- |`;
const PRETTY_SUPPORT = new Map([
  ["y", "Yes"],
  ["n", "No"],
]);
const GLOBAL_BROWSER_USAGE_CUT_OFF = 0.5;
const pretty_formatted_support = (caniuse: string) => {
  const support = PRETTY_SUPPORT.get(caniuse);
  return support ? support : "Caveats";
};
const get_latest_browser_version = (browser_versions: Stats) => {
  const latest_browser = Object.keys(browser_versions)
    .sort((a, b) => Number(a) - Number(b))
    .pop();
  return [latest_browser, browser_versions[latest_browser]];
};
const create_table_row = (browser, version, support) =>
  `| ${pretty_browser_agents.get(
    browser
  )} *(${version})* | ${pretty_formatted_support(support)} |`;
const create_browser_support_rows = (feature: Stats[]) =>
  Object.entries(feature)
    .reduce((rows, [browser, browser_versions]) => {
      const [version, support] = get_latest_browser_version(browser_versions);
      if (pretty_browser_agents.has(browser)) {
        rows.push(create_table_row(browser, version, support));
      }
      return rows;
    }, [])
    .join("\n");
const create_browser_support_table = (stats: Stats[]) =>
  [TABLE_HEADER, create_browser_support_rows(stats)].join("\n");
const create_preview = (feature: Feature) =>
  md(
    [
      `## ${feature.title}`,
      "",
      `${feature.description}`,
      `${create_browser_support_table(feature.stats)}`,
    ].join("\n")
  );
const { agents, data } = await get<{ agents: Agents; data: Data }>(
  `https://raw.githubusercontent.com/Fyrd/caniuse/master/data.json`
).then((response) => response.data);
const pretty_browser_agents = new Map(
  Object.entries(agents).reduce((acc, [browser, data]) => {
    const total_usage = Object.values(data.usage_global).reduce(
      (sum, value) => sum + value || 0,
      0
    );
    if (total_usage >= GLOBAL_BROWSER_USAGE_CUT_OFF) {
      acc.push([browser, data.browser]);
    }
    return acc;
  }, [])
);
const choices = Object.entries(data).map(([feature, feature_value]) => ({
  name: feature_value.title,
  description: feature_value.description,
  value: feature,
  preview: () => create_preview(feature_value),
}));
const query = await arg("Search for browser feature", choices);
browse(`https://caniuse.com/?search=${query}`);