<template>
  <plugin-setting
    v-if="isShow"
    :fixed-name="PLUGIN_NAME.AppManage"
    :align="align"
    :title="state.title"
    class="pageFolder-plugin-setting"
  >
    <template #header>
      <button-group>
        <tiny-button type="primary" @click="saveFolderSetting">保存</tiny-button>
        <svg-button
          v-if="!pageSettingState.isNew"
          name="delete"
          placement="bottom"
          tips="删除"
          @click="deleteFolder"
        ></svg-button>
        <svg-button class="close-plugin-setting-icon" name="close" @click="closeFolderSetting"></svg-button>
      </button-group>
    </template>

    <template #content>
      <div class="page-setting-content">
        <tiny-collapse v-model="state.activeName">
          <tiny-collapse-item title="基本设置" name="folderGeneralRef">
            <component :is="pageGeneral" ref="folderGeneralRef" :isFolder="isFolder"></component>
          </tiny-collapse-item>
        </tiny-collapse>
      </div>
    </template>
  </plugin-setting>
</template>

<script lang="ts">
/* metaService: engine.plugins.appmanage.PageFolderSetting */
import { reactive, ref, computed } from 'vue'
import { Button, Collapse, CollapseItem } from '@opentiny/vue'
import { PluginSetting, SvgButton, ButtonGroup } from '@opentiny/tiny-engine-common'
import {
  usePage,
  useLayout,
  useModal,
  useNotify,
  getMergeMeta,
  getMetaApi,
  META_SERVICE
} from '@opentiny/tiny-engine-meta-register'
import { isEqual } from '@opentiny/vue-renderless/common/object'
import throttle from '@opentiny/vue-renderless/common/deps/throttle'
import meta from '../meta'
import http from './http'

const isShow = ref(false)
export const openFolderSettingPanel = () => {
  isShow.value = true
}

export const closeFolderSettingPanel = () => {
  isShow.value = false

  const { resetPageData } = usePage()

  resetPageData()
}

export default {
  components: {
    TinyButton: Button,
    TinyCollapse: Collapse,
    TinyCollapseItem: CollapseItem,
    PluginSetting,
    SvgButton,
    ButtonGroup
  },
  props: {
    isFolder: {
      type: Boolean,
      default: false
    }
  },
  setup() {
    const state = reactive({
      activeName: ['folderGeneralRef'],
      title: '文件夹设置'
    })
    const { requestCreatePage, requestUpdatePage, requestDeletePage } = http
    const { pageSettingState, changeTreeData } = usePage()
    const { confirm } = useModal()
    const registry = getMergeMeta(meta.id)
    const pageGeneral = registry.components.PageGeneral
    const folderGeneralRef = ref(null)

    const { PLUGIN_NAME, getPluginByLayout } = useLayout()
    const align = computed(() => getPluginByLayout(PLUGIN_NAME.AppManage))

    const closeFolderSetting = () => {
      if (isEqual(pageSettingState.currentPageData, pageSettingState.currentPageDataCopy)) {
        closeFolderSettingPanel()
      } else {
        confirm({
          title: '提示',
          message: '您即将使用未保存的更改关闭此页。是否要在关闭之前放弃这些更改?',
          exec: () => {
            if (!pageSettingState.isNew) {
              changeTreeData(pageSettingState.oldParentId, pageSettingState.currentPageData.parentId)
              Object.assign(pageSettingState.currentPageData, pageSettingState.currentPageDataCopy)
            }
            closeFolderSettingPanel()
          }
        })
      }
    }

    const createFolder = () => {
      const data = pageSettingState.currentPageData
      const createParams = {
        ...data,
        app: getMetaApi(META_SERVICE.GlobalService).getBaseInfo().id,
        isPage: false
      }

      requestCreatePage(createParams)
        .then(() => {
          pageSettingState.updateTreeData()
          pageSettingState.isNew = false
          closeFolderSettingPanel()
          useNotify({
            type: 'success',
            message: '新建文件夹成功!'
          })
        })
        .catch((error) => {
          useNotify({
            type: 'error',
            title: '新建文件夹失败',
            message: JSON.stringify(error?.message || error)
          })
        })
    }

    const updateFolder = () => {
      const { id } = pageSettingState.currentPageData

      requestUpdatePage(id, { ...pageSettingState.currentPageData, page_content: null })
        .then(() => {
          pageSettingState.updateTreeData()
          pageSettingState.isNew = false
          closeFolderSettingPanel()
          useNotify({
            type: 'success',
            message: '更新文件夹成功!'
          })
        })
        .catch((error) => {
          useNotify({
            type: 'error',
            title: '更新文件夹失败',
            message: JSON.stringify(error?.message || error)
          })
        })
    }

    const saveFolderSetting = () => {
      folderGeneralRef.value.validGeneralForm().then(() => {
        if (pageSettingState.isNew) {
          createFolder()
        } else {
          updateFolder()
        }
      })
    }

    const deleteFolder = () => {
      if (pageSettingState.treeDataMapping[pageSettingState.currentPageData.id]?.children?.length) {
        useNotify({
          type: 'error',
          message: '此文件夹不是空文件夹,不能删除!'
        })

        return
      }

      confirm({
        title: '提示',
        message: '您是否要删除文件夹?',
        exec: () => {
          const id = pageSettingState.currentPageData?.id || ''

          requestDeletePage(id)
            .then(() => {
              pageSettingState.updateTreeData()
              closeFolderSettingPanel()
              useNotify({
                type: 'success',
                message: '删除文件夹成功!'
              })
            })
            .catch((error) => {
              useNotify({
                type: 'success',
                title: '删除文件夹失败!',
                message: JSON.stringify(error?.message || error)
              })
            })
        }
      })
    }

    return {
      align,
      PLUGIN_NAME,
      saveFolderSetting,
      deleteFolder: throttle(5000, true, deleteFolder),
      pageGeneral,
      folderGeneralRef,
      closeFolderSettingPanel,
      isShow,
      state,
      pageSettingState,
      closeFolderSetting
    }
  }
}
</script>

<style lang="less" scoped>
.pageFolder-plugin-setting {
  :deep(.plugin-setting-header) {
    border: 0;
  }
  :deep(.plugin-setting-content) {
    padding: 0 0 16px 0;
  }

  :deep(.tiny-collapse) {
    border-bottom: 0;
  }
}
</style>