import { describe, expect, it } from "vitest";
import { listBundledPluginMetadata } from "../plugins/bundled-plugin-metadata.js";
import {
  CHAT_CHANNEL_ALIASES,
  CHAT_CHANNEL_ORDER,
  normalizeChatChannelId,
  type ChatChannelId,
} from "./ids.js";

function collectBundledChatChannelAliases(): Record<string, ChatChannelId> {
  const aliases = new Map<string, ChatChannelId>();

  for (const entry of listBundledPluginMetadata({
    includeChannelConfigs: true,
    includeSyntheticChannelConfigs: false,
  })) {
    const channel =
      entry.packageManifest && "channel" in entry.packageManifest
        ? entry.packageManifest.channel
        : undefined;
    const rawId = channel?.id?.trim();
    if (!rawId || !CHAT_CHANNEL_ORDER.includes(rawId as ChatChannelId)) {
      continue;
    }
    const channelId = rawId as ChatChannelId;
    if (!channel) {
      continue;
    }
    for (const alias of channel.aliases ?? []) {
      const normalizedAlias = alias.trim().toLowerCase();
      if (!normalizedAlias) {
        continue;
      }
      aliases.set(normalizedAlias, channelId);
    }
  }

  return Object.fromEntries(
    [...aliases.entries()].toSorted(([left], [right]) => left.localeCompare(right)),
  ) as Record<string, ChatChannelId>;
}

describe("channel ids", () => {
  it("normalizes built-in aliases + trims whitespace", () => {
    expect(normalizeChatChannelId(" imsg ")).toBe("imessage");
    expect(normalizeChatChannelId("gchat")).toBe("googlechat");
    expect(normalizeChatChannelId("google-chat")).toBe("googlechat");
    expect(normalizeChatChannelId("internet-relay-chat")).toBe("irc");
    expect(normalizeChatChannelId("telegram")).toBe("telegram");
    expect(normalizeChatChannelId("web")).toBeNull();
    expect(normalizeChatChannelId("nope")).toBeNull();
  });

  it("matches bundled built-in channel alias metadata", () => {
    expect(CHAT_CHANNEL_ALIASES).toEqual(collectBundledChatChannelAliases());
  });
});
