import * as nip27 from '@nostr/tools/nip27'
import { naddrEncode, neventEncode, nprofileEncode, npubEncode } from '@nostr/tools/nip19'

import { nostrLink, relayLink, shorten, shortenURL } from './utils.js'
import { fetchNostrUser } from './nostr.js'

export function renderText(wrapper: HTMLElement, content: string) {
  for (const block of nip27.parse(content)) {
    switch (block.type) {
      case 'text':
        let span = document.createElement('span')
        span.setAttribute('part', 'text')
        span.textContent = block.text
        wrapper.appendChild(span)
        break
      case 'reference': {
        let a = document.createElement('a')
        a.setAttribute('part', 'reference')
        a.target = '_blank'
        if ('id' in block.pointer) {
          // nevent
          a.setAttribute('part', 'nevent')
          let code = neventEncode(block.pointer)
          a.href = nostrLink(code)
          a.target = '_blank'
          a.textContent = shorten(code)
        } else if ('identifier' in block.pointer) {
          // naddr
          a.setAttribute('part', 'naddr')
          let code = naddrEncode(block.pointer)
          a.href = nostrLink(code)
          a.target = '_blank'
          a.textContent = shorten(code)
        } else {
          // npub/nprofile
          a.setAttribute('part', 'npub reference')
          let nprofile = nprofileEncode(block.pointer)
          a.href = nostrLink(nprofile)
          a.target = '_blank'
          let npub = npubEncode(block.pointer.pubkey)
          a.textContent = shorten(npub)
          let pp = block.pointer
          setTimeout(async () => {
            let nu = await fetchNostrUser(pp.pubkey, pp.relays || [])
            a.textContent = nu.shortName
          }, 10)
        }
        wrapper.appendChild(a)
        break
      }
      case 'url': {
        let a = document.createElement('a')
        a.href = block.url
        a.textContent = shortenURL(block.url)
        a.setAttribute('part', 'url')
        a.target = '_blank'
        wrapper.appendChild(a)
        break
      }
      case 'image': {
        let a = document.createElement('a')
        a.href = block.url
        a.setAttribute('part', 'image')
        let img = document.createElement('img')
        img.style.width = '100%'
        img.src = block.url
        img.loading = 'lazy'
        a.appendChild(img)
        wrapper.appendChild(a)
        break
      }
      case 'video': {
        let video = document.createElement('video')
        video.setAttribute('part', 'video')
        video.style.width = '100%'
        video.src = block.url
        video.controls = true
        video.muted = true
        video.playsInline = true
        wrapper.appendChild(video)
        break
      }
      case 'audio': {
        let audio = document.createElement('audio')
        audio.setAttribute('part', 'audio')
        audio.style.width = '100%'
        audio.src = block.url
        audio.controls = true
        wrapper.appendChild(audio)
        break
      }
      case 'relay': {
        let a = document.createElement('a')
        a.href = relayLink(block.url)
        a.setAttribute('part', 'relay')
        a.target = '_blank'
        wrapper.appendChild(a)
        break
      }
      default:
        break
    }
  }
}
