import type { Emoji } from 'masto'
import type { CustomEmojisInfo } from './push-notifications/types'
import { STORAGE_KEY_CUSTOM_EMOJIS } from '~/constants'

const TTL = 1000 * 60 * 60 * 24 // 1 day

function getDefault(): CustomEmojisInfo {
  return {
    lastUpdate: 0,
    emojis: [],
  }
}

export const currentCustomEmojis = process.server
  ? computed(getDefault)
  : useUserLocalStorage(STORAGE_KEY_CUSTOM_EMOJIS, getDefault)

export async function updateCustomEmojis() {
  if (Date.now() - currentCustomEmojis.value.lastUpdate < TTL)
    return

  const masto = useMasto()
  const emojis = await masto.customEmojis.fetchAll()
  Object.assign(currentCustomEmojis.value, {
    lastUpdate: Date.now(),
    emojis,
  })
}

function transformEmojiData(emojis: Emoji[]) {
  const result = []

  for (const emoji of emojis) {
    if (!emoji.visibleInPicker)
      continue
    result.push({
      id: emoji.shortcode,
      native: ':emoji.shortcode:',
      name: emoji.shortcode,
      skins: [{ src: emoji.url || emoji.staticUrl }],
    })
  }

  return result
}

export const customEmojisData = computed(() => currentCustomEmojis.value.emojis.length
  ? [{
      id: 'custom',
      name: `Custom emojis on ${currentServer.value}`,
      emojis: transformEmojiData(currentCustomEmojis.value.emojis),
    }]
  : undefined)
