import type { Editor } from "@tiptap/core"
import type { MinimalTiptapProps } from "./minimal-tiptap"

let isMac: boolean | undefined

interface Navigator {
  userAgentData?: {
    brands: { brand: string; version: string }[]
    mobile: boolean
    platform: string
    getHighEntropyValues: (hints: string[]) => Promise<{
      platform: string
      platformVersion: string
      uaFullVersion: string
    }>
  }
}

function getPlatform(): string {
  const nav = navigator as Navigator

  if (nav.userAgentData) {
    if (nav.userAgentData.platform) {
      return nav.userAgentData.platform
    }

    nav.userAgentData
      .getHighEntropyValues(["platform"])
      .then((highEntropyValues) => {
        if (highEntropyValues.platform) {
          return highEntropyValues.platform
        }
      })
  }

  if (typeof navigator.platform === "string") {
    return navigator.platform
  }

  return ""
}

export function isMacOS() {
  if (isMac === undefined) {
    isMac = getPlatform().toLowerCase().includes("mac")
  }

  return isMac
}

interface ShortcutKeyResult {
  symbol: string
  readable: string
}

export function getShortcutKey(key: string): ShortcutKeyResult {
  const lowercaseKey = key.toLowerCase()
  if (lowercaseKey === "mod") {
    return isMacOS()
      ? { symbol: "⌘", readable: "Command" }
      : { symbol: "Ctrl", readable: "Control" }
  } else if (lowercaseKey === "alt") {
    return isMacOS()
      ? { symbol: "⌥", readable: "Option" }
      : { symbol: "Alt", readable: "Alt" }
  } else if (lowercaseKey === "shift") {
    return isMacOS()
      ? { symbol: "⇧", readable: "Shift" }
      : { symbol: "Shift", readable: "Shift" }
  } else {
    return { symbol: key, readable: key }
  }
}

export function getShortcutKeys(keys: string[]): ShortcutKeyResult[] {
  return keys.map((key) => getShortcutKey(key))
}

export function getOutput(
  editor: Editor,
  format: MinimalTiptapProps["output"],
) {
  if (format === "json") {
    return editor.getJSON()
  }

  if (format === "html") {
    return editor.getText() ? editor.getHTML() : ""
  }

  return editor.getText()
}
