<template>
  <ui-group-option class="sign-guide">
    <div class="info">
      <div class="guide-cover">
        <img :src="getResource(getFileUrl(guide.cover))" />
        <ui-icon 
          type="preview" 
          class="icon" 
          ctrl 
          @click="playSceneGuide(paths, undefined, true)" 
          v-if="paths.length" 
        />
      </div>
      <div>
        <p>{{ guide.title }}</p>
      </div>
    </div>
    <div class="actions" v-if="edit">
      <ui-more 
        :options="menus" 
        style="margin-left: 20px" 
        @click="(action: keyof typeof actions) => actions[action]()" 
      />
    </div>
  </ui-group-option>
</template>

<script setup lang="ts">
import { Guide, getGuidePaths } from '@/store'
import { getFileUrl, saveAs } from '@/utils'
import { getResource } from '@/env'
import { computed, watchEffect, nextTick } from 'vue';
import { playSceneGuide, isScenePlayIng, pauseSceneGuide } from '@/sdk'
import { VideoRecorder } from '@simaq/core';

const props = withDefaults(
  defineProps<{ guide: Guide, edit?: boolean }>(),
  { edit: true }
)

const emit = defineEmits<{ 
  (e: 'delete'): void 
  (e: 'play'): void 
  (e: 'edit'): void 
}>()

const menus = [
  { label: '编辑', value: 'edit' },
  { label: '下载', value: 'download' },
  { label: '删除', value: 'delete' },
]
const actions = {
  edit: () => emit('edit'),
  delete: () => emit('delete'),
  download: () => {
    const config: any = {
      uploadUrl: '',
      resolution: '4k',
      autoDownload: false,
      debug: false,
    }
  
    const videoRecorder = new VideoRecorder(config);
    videoRecorder.startRecord()

    let stopWatch: () => void
    const stopRecord = () => {
      stopWatch && stopWatch()
      pauseSceneGuide()
    }

    videoRecorder.on('record', blob => {
      saveAs(new File([blob], '录屏.mp4', { type: 'video/mp4; codecs=h264' }), props.guide.title + ".mp4")
    })

    videoRecorder.off('*')
    videoRecorder.on('startRecord', () => {
      playSceneGuide(paths.value, undefined, true)
      stopWatch = watchEffect(() => {
      if (!isScenePlayIng.value) {
        videoRecorder.endRecord()
        nextTick(stopWatch)
      }
    })
    })
    videoRecorder.on('cancelRecord', stopRecord)
    videoRecorder.on('endRecord', stopRecord)
  }
}
const paths = computed(() => getGuidePaths(props.guide))

</script>

<style lang="scss" scoped>
.sign-guide {
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: 20px 0;
  border-bottom: 1px solid var(--colors-border-color);
  &:first-child {
    border-top: 1px solid var(--colors-border-color);
  }

  .info {
    flex: 1;

    display: flex;
    align-items: center;

    .guide-cover {
      position: relative;
      &::after {
        content: '';
        position: absolute;
        inset: 0;
        background: rgba(0,0,0,.2)
      }

      .icon {
        position: absolute;
        z-index: 1;
        left: 50%;
        top: 50%;
        transform: translate(-50%, -50%);
        font-size: 16px;
      }

      img {
        width: 48px;
        height: 48px;
        object-fit: cover;
        border-radius: 4px;
        overflow: hidden;
        background-color: rgba(255,255,255,.6);
        display: block;
      }
    }

    div {
      margin-left: 10px;

      p {
        color: #fff;
        font-size: 14px;
        margin-bottom: 6px;
      }
    }
  }
  
  .actions {
    flex: none;
  }  
}


</style>