import { Node, Fragment } from "prosemirror-model";
import { parser, schema } from "rich-markdown-editor";
import { prosemirrorToYDoc } from "y-prosemirror";
import * as Y from "yjs";
import embeds from "@shared/embeds";

export default function markdownToYDoc(
  markdown: string,
  fieldName = "default"
): Y.Doc {
  let node = parser.parse(markdown);

  // in rich-markdown-editor embeds were created at runtime by converting links
  // into embeds where they match. Because we're converting to a CRDT structure
  // on the server we need to mimic this behavior.
  function urlsToEmbeds(node: Node): Node {
    if (node.type.name === "paragraph") {
      // @ts-expect-error ts-migrate(2339) FIXME: Property 'content' does not exist on type 'Fragmen... Remove this comment to see the full error message
      for (const textNode of node.content.content) {
        for (const embed of embeds) {
          if (textNode.text && embed.matcher(textNode.text)) {
            // @ts-expect-error ts-migrate(2322) FIXME: Type 'ProsemirrorNode<Schema<never, never>> | null... Remove this comment to see the full error message
            return schema.nodes.embed.createAndFill({
              href: textNode.text,
            });
          }
        }
      }
    }

    if (node.content) {
      const contentAsArray =
        // @ts-expect-error ts-migrate(2339) FIXME: Property 'content' does not exist on type 'Fragmen... Remove this comment to see the full error message
        node.content instanceof Fragment ? node.content.content : node.content;
      node.content = Fragment.fromArray(contentAsArray.map(urlsToEmbeds));
    }

    return node;
  }

  node = urlsToEmbeds(node);
  return prosemirrorToYDoc(node, fieldName);
}
