<template>
  <div class="plugin-page">
    <plugin-panel
      :title="title"
      :fixed-name="PLUGIN_NAME.AppManage"
      :fixedPanels="fixedPanels"
      @close="pluginPanelClosed"
      :docsUrl="docsUrl"
      :docsContent="docsContent"
      :isShowDocsIcon="true"
    >
      <template #header>
        <svg-button
          class="add-folder-icon"
          name="add-folder"
          placement="bottom"
          tips="新建文件夹"
          @click="createNewFolder()"
        ></svg-button>
        <svg-button
          class="new-page-icon"
          name="new-page"
          placement="bottom"
          tips="新建页面"
          @click="createNewPage('staticPages')"
        ></svg-button>
      </template>
      <template #content>
        <page-tree
          ref="pageTreeRef"
          :isFolder="state.isFolder"
          @add="createNewPage('publicPages')"
          @openSettingPanel="openSettingPanel"
          @createPage="createNewPage"
          @createFolder="createNewFolder"
          @settingHome="settingHome"
        ></page-tree>
      </template>
    </plugin-panel>
    <page-setting :isFolder="state.isFolder" @openNewPage="openNewPage"></page-setting>
    <page-folder-setting :isFolder="state.isFolder"></page-folder-setting>
  </div>
</template>

<script lang="tsx">
/* metaService: engine.plugins.appmanage.Main */
import { reactive, ref, watchEffect, provide } from 'vue'
import { useCanvas, usePage, useHelp, useModal, useNotify, useLayout } from '@opentiny/tiny-engine-meta-register'
import { PluginPanel, SvgButton } from '@opentiny/tiny-engine-common'
import { extend } from '@opentiny/vue-renderless/common/object'
import PageSetting, { openPageSettingPanel, closePageSettingPanel } from './PageSetting.vue'
import PageFolderSetting, { openFolderSettingPanel, closeFolderSettingPanel } from './PageFolderSetting.vue'
import PageTree from './PageTree.vue'
import { fetchPageDetail, handleRouteHomeUpdate } from './http'

export const api = {
  getPageById: async (id) => {
    if (id) {
      return fetchPageDetail(id)
    }

    return undefined
  },
  openPageSettingPanel
}

/* metaComponent: engine.plugins.page */
export default {
  components: {
    PageSetting,
    PluginPanel,
    SvgButton,
    PageFolderSetting,
    PageTree
  },
  props: {
    title: {
      type: String,
      default: '页面'
    },
    fixedPanels: {
      type: Array
    }
  },
  emits: ['close'],
  setup(props, { emit }) {
    const { confirm } = useModal()
    const { pageState } = useCanvas()
    const { pageSettingState, getDefaultPage, isTemporaryPage, initCurrentPageData } = usePage()

    const { PLUGIN_NAME } = useLayout()

    const panelState = reactive({
      emitEvent: emit
    })

    provide('panelState', panelState)

    const pageTreeRef = ref(null)
    const ROOT_ID = pageSettingState.ROOT_ID
    const docsUrl = useHelp().getDocsUrl('page')
    const docsContent = '在这里新增页面/文件夹,还可以对已有的页面进行生命周期管理。'

    const state = reactive({
      isFolder: false
    })

    const createNewPage = (group, parentId = ROOT_ID) => {
      closeFolderSettingPanel()
      pageSettingState.isNew = true
      try {
        const defaultPage = getDefaultPage()
        if (!defaultPage) {
          throw new Error('Failed to get default page configuration')
        }
        pageSettingState.currentPageData = {
          ...getDefaultPage(),
          ...defaultPage,
          parentId,
          route: '',
          name: 'Untitled',
          page_content: {
            lifeCycles: {}
          },
          group
        }
      } catch (error) {
        throw new Error(error)
        // console.error('Failed to create new page:', error)
      }
      pageSettingState.currentPageDataCopy = extend(true, {}, pageSettingState.currentPageData)
      state.isFolder = false
      openPageSettingPanel()
    }

    const createNewFolder = (parentId = ROOT_ID) => {
      closePageSettingPanel()
      pageSettingState.isNew = true
      pageSettingState.currentPageData = { parentId, route: '', name: 'untitled' }
      pageSettingState.currentPageDataCopy = extend(true, {}, pageSettingState.currentPageData)
      state.isFolder = true
      openFolderSettingPanel()
    }

    const settingHome = (node) => {
      confirm({
        title: '提示',
        type: 'warning ',
        message: '是否确定要将此页面设置为主页?',
        exec: () => {
          const params = { ...node.rawData, isHome: true }

          handleRouteHomeUpdate(node.id, params)
            .then(() => {
              pageSettingState.updateTreeData()
              pageSettingState.isNew = false
              useNotify({ message: '主页设置成功!', type: 'success' })
            })
            .catch(() => {
              useNotify({ message: '主页设置失败!', type: 'error' })
            })
        }
      })
    }

    watchEffect(() => {
      if (isTemporaryPage.saved) {
        openPageSettingPanel()
      }
    })

    const openSettingPanel = async (pageData) => {
      state.isFolder = !pageData.isPage
      pageSettingState.isNew = false

      const isPageChange = pageData.id !== pageSettingState.currentPageData.id

      if (state.isFolder) {
        if (isPageChange) {
          closePageSettingPanel()
        }
        openFolderSettingPanel()
      } else {
        if (isPageChange) {
          closeFolderSettingPanel()
        }
        openPageSettingPanel()
      }
      const pageDetail = await fetchPageDetail(pageData?.id)
      initCurrentPageData(pageDetail)
    }

    provide('openSettingPanel', openSettingPanel)

    const pluginPanelClosed = () => {
      emit('close')
      closePageSettingPanel()
      closeFolderSettingPanel()
    }

    const openNewPage = (data) => {
      pageTreeRef.value.switchPage(data)
    }

    return {
      PLUGIN_NAME,
      state,
      pageState,
      openNewPage,
      pageTreeRef,
      pluginPanelClosed,
      openSettingPanel,
      createNewFolder,
      createNewPage,
      docsUrl,
      docsContent,
      settingHome
    }
  }
}
</script>

<style lang="less" scoped>
:deep(.tiny-button) {
  border-radius: 4px;
  height: 24px;
  line-height: 24px;
}
.plugin-page {
  height: 100%;
}
</style>