import {
  editor,
  events,
  markdown,
} from "@silverbulletmd/silverbullet/syscalls";
import { extractFrontmatter } from "@silverbulletmd/silverbullet/lib/frontmatter";
import type { PublishEvent } from "../../plug-api/types.ts";

export async function publishShareOptions() {
  const text = await editor.getText();
  const tree = await markdown.parseMarkdown(text);
  let { $share } = await extractFrontmatter(tree);
  if (!$share) {
    return [];
  }
  if (!Array.isArray($share)) {
    $share = [$share];
  }
  return [{
    id: "publish",
    name: `Publish to ${$share.map((s: string) => s.split(":")[0]).join(", ")}`,
  }];
}

export async function publishShare() {
  const pageName = await editor.getCurrentPage();
  const text = await editor.getText();
  const tree = await markdown.parseMarkdown(text);
  let { $share } = await extractFrontmatter(tree);
  if (!Array.isArray($share)) {
    $share = [$share];
  }
  await editor.flashNotification("Sharing...");
  try {
    await publish(pageName, $share);
    await editor.flashNotification("Done!");
  } catch (e: any) {
    await editor.flashNotification(e.message, "error");
  }
}

async function publish(pageName: string, uris: string[]) {
  const broadcastResults = await events.dispatchEvent(`share:_`, {
    name: pageName,
  } as PublishEvent);
  for (const uri of uris) {
    const publisher = uri.split(":")[0];
    const results = await events.dispatchEvent(
      `share:${publisher}`,
      {
        uri: uri,
        name: pageName,
      } as PublishEvent,
    );
    if (broadcastResults.length === 0 && results.length === 0) {
      throw new Error(`Unsupported publisher: ${publisher} for URI: ${uri}`);
    }
  }
}