import { defineComponent, onMounted, onUnmounted, reactive } from 'vue'
import styles from './index.module.less'
import { api_uploadFile } from '@/plugins/uploadFile'
import { useMessage } from 'naive-ui'

export default defineComponent({
  name: 'music-create-img',
  props: {
    xmlFileUrl: {
      type: String,
      default: ''
    }
  },
  emits: ['close', 'confirm'],
  setup(props, { emit }) {
    const message = useMessage()
    const state = reactive({
      productOpen: false,
      productIfameSrc: ''
    })
    /** 自动生成图片 */
    const forms = reactive({
      musicImg: '', // 五线谱图片
      musicSvg: '', //首调图片
      musicJianSvg: '' // 简谱固定调
    })
    const handleAutoProduct = () => {
      if (!props.xmlFileUrl) {
        message.error('请先上传XML')
        return
      }
      const apiUrls = {
        dev: 'https://dev.kt.colexiu.com',
        test: 'https://test.lexiaoya.cn',
        online: 'https://kt.colexiu.com'
      }

      const environment = location.origin.includes('//dev')
        ? 'dev'
        : location.origin.includes('//test')
        ? 'test'
        : location.origin.includes('//online')
        ? 'online'
        : 'dev'
      const apiUrl = apiUrls[environment]
      const prefix = /(localhost|192)/.test(location.host) ? 'https://dev.kt.colexiu.com' : apiUrl
      const xmlFileUrl = encodeURIComponent(props.xmlFileUrl)
      state.productIfameSrc =
        prefix + `/instrument/#/product-img?xmlUrl=${xmlFileUrl}&isCreateImg=true&isCbs=true`
      // state.productOpen = true
    }
    const handleProductResult = (res: MessageEvent) => {
      const data = res.data
      if (data?.api === 'webApi_renderSvg') {
        let imgs: any = []
        try {
          imgs = JSON.parse(data.product)
        } catch (error) {
          console.log('🚀 ~ error:', error)
        }
        imgs = imgs.filter((item: any) => item.base64)
        if (imgs.length === 3) {
          message.success('生成成功')
          handleUploadImg(imgs)
        } else {
          message.error('生成失败')
        }
        // console.log('🚀 ~ 上传之前', [...imgs])
      }
    }
    const handleUploadImg = async (imgs: any[]) => {
      for (let i = 0; i < imgs.length; i++) {
        const file = dataURLtoFile(imgs[i].base64, `${Date.now()}p${i}.png`)
        imgs[i].url = await api_uploadFile(file, () => {})
      }
      forms.musicImg = imgs[0]?.url || ''
      forms.musicSvg = imgs[1]?.url || ''
      forms.musicJianSvg = imgs[2]?.url || ''
      // state.productOpen = false
      imgs = []

      emit('close')
      emit('confirm', forms)
    }
    /** base64转file */
    const dataURLtoFile = (dataurl: string, filename: string) => {
      let arr = dataurl.split(',') || [],
        mime = arr[0].match(/:(.*?);/)?.[1],
        bstr = atob(arr[1]),
        n = bstr.length,
        u8arr = new Uint8Array(n)
      while (n--) {
        u8arr[n] = bstr.charCodeAt(n)
      }
      return new File([u8arr], filename, { type: mime })
    }

    onMounted(() => {
      handleAutoProduct()
      window.addEventListener('message', handleProductResult)
    })

    onUnmounted(() => {
      window.removeEventListener('message', handleProductResult)
    })
    return () => <iframe class={styles.productIframe} src={state.productIfameSrc}></iframe>
  }
})
