import store from '@/store/index'
import generateID from '@/components/canvas/utils/generateID'
import eventBus from '@/components/canvas/utils/eventBus'
import decomposeComponent from '@/components/canvas/utils/decomposeComponent'
import { $ } from '@/components/canvas/utils/utils'
import { commonStyle, commonAttr } from '@/components/canvas/custom-component/component-list'

export default {
  state: {
    areaData: { // 选中区域包含的组件以及区域位移信息
      style: {
        top: 0,
        left: 0,
        width: 0,
        height: 0
      },
      components: []
    },
    editor: null
  },
  mutations: {
    getEditor(state) {
      state.editor = $('#editor')
    },

    setAreaData(state, data) {
      state.areaData = data
    },

    compose({ componentData, areaData, editor }) {
      const components = []
      areaData.components.forEach(component => {
        if (component.component !== 'Group') {
          components.push(component)
        } else {
          // 如果要组合的组件中，已经存在组合数据，则需要提前拆分
          const parentStyle = { ...component.style }
          const subComponents = component.propValue
          const editorRect = editor.getBoundingClientRect()

          store.commit('deleteComponent')
          subComponents.forEach(component => {
            decomposeComponent(component, editorRect, parentStyle)
            store.commit('addComponent', { component })
          })

          components.push(...component.propValue)
          store.commit('batchDeleteComponent', component.propValue)
        }
      })

      store.commit('addComponent', {
        component: {
          id: generateID(),
          component: 'Group',
          ...commonAttr,
          style: {
            ...commonStyle,
            ...areaData.style
          },
          propValue: components
        }
      })

      eventBus.$emit('hideArea')

      store.commit('batchDeleteComponent', areaData.components)
      store.commit('setCurComponent', {
        component: componentData[componentData.length - 1],
        index: componentData.length - 1
      })

      areaData.components = []
    },

    // 将已经放到 Group 组件数据删除，也就是在 componentData 中删除，因为它们已经放到 Group 组件中了
    batchDeleteComponent({ componentData }, deleteData) {
      deleteData.forEach(component => {
        for (let i = 0, len = componentData.length; i < len; i++) {
          if (component.id === componentData[i].id) {
            componentData.splice(i, 1)
            break
          }
        }
      })
    },

    decompose({ curComponent, editor }) {
      const parentStyle = { ...curComponent.style }
      const components = curComponent.propValue
      const editorRect = editor.getBoundingClientRect()

      store.commit('deleteComponent')
      components.forEach(component => {
        decomposeComponent(component, editorRect, parentStyle)
        store.commit('addComponent', { component })
      })
    }
  }
}
