/*eslint-disable*/
import Vue, { VNode } from 'vue'
import { VMenuA, VListA, VListItemTitleA, VIconA, VDividerA, } from '../../shims-vuetify'
import { ContextMenuCommand } from '../mixin/contextmenu'
import { consoleError } from '../../vuetify-import'

interface MenuItemsMap {
  [id: string]: ContextMenuCommand
}

export default Vue.extend({
  name: 'context-menu',
  data: () => ({
    isContextMenuActive: false,
    commands: ([] as ContextMenuCommand[]),
    positionX: 0,
    positionY: 0,
    positionXSubmenu: 0,
    positionYSubmenu: 0,
    menuItemsMap: ({} as MenuItemsMap)
  }),
  mounted () {
    this.$root.$on('context-menu-call', this.activateContextMenu)
  },
  methods: {
    genTileText (text: string): VNode {
      return this.$createElement('div',{
        staticClass: 'v-list__tile__title',
        domProps: {
          innerText: text
        }
      })
    },
     genContextMenuItem (cmd: ContextMenuCommand, indexes: any): VNode[] {
      indexes.submenuIndex++
      const divider = this.$createElement(VDividerA)
      const children: VNode[] = []
      if (cmd.text) {
        const title = this.genTileText(cmd.text)
        children.push(title)
      }
      if (cmd.icon) {
        children.push(this.$createElement(VIconA, cmd.icon))
      }
      if (cmd.submenu) {
        children.push(this.$createElement(VIconA,'$vuetify.icons.subgroup'))
      }
      if (!cmd.submenu) {
        const cMenuRef = 'CMenuItem'+ indexes.itemindex
        indexes.itemindex++
        indexes.menuItemsMap[cMenuRef] = cmd
        let cmdCanBeExecuted = true
        if (typeof cmd.disabled === 'boolean') {
          cmdCanBeExecuted = cmd.disabled
        } else if (typeof cmd.disabled === 'function') {
          //cmdCanBeExecuted = cmd.disabled()
        }
        return [this.$createElement(VListItemTitleA, {
          ref: cMenuRef,
          props: {
            title: cmd.text,
            disabled: !cmdCanBeExecuted
          },
          on: {
            click: (e: Event) => {
              e.stopPropagation()
              e.preventDefault()
              this.executeAction(e, cMenuRef)
              this.deactivateContextMenu()
            },
            contextmenu: (e: Event) => {
              e.preventDefault()
              e.stopPropagation()
            }
          }
        }, children), divider]
      } else {
        const cmdSub = (cmd.submenu instanceof Array ? cmd.submenu : (cmd.submenu as () => ContextMenuCommand[]).call(this) as ContextMenuCommand[])
        const submenuItems: VNode[] = []
        cmdSub.forEach((v: any)  => {
          const subm = this.genContextMenuItem(v, indexes)
          submenuItems.push(...subm)
        })
        const submenuContent = this.$createElement(VListA,{
          ref: 'content'
        },submenuItems)

        const submenuTile = this.$createElement(VListItemTitleA, {
          ref: 'activator' + indexes.submenuIndex,
          props: {
            title: cmd.text
          },
          on: {
            click: (e: Event) => {
              e.stopPropagation()
              this.activateSubmenu('submenu' + indexes.submenuIndex, e)
            },
            contextmenu: (e: Event) => {
              e.preventDefault()
            }
          }
        }, [children])
        return [submenuTile, this.$createElement(VMenuA, {
          ref: 'submenu' + indexes.submenuIndex,
          props: {
            absolute: true,
            positionX: this.positionXSubmenu,
            positionY: this.positionYSubmenu
          }
        }, [submenuContent, divider])]
      }
    },
    genContextMenu (): VNode {
      this.menuItemsMap =  ({} as MenuItemsMap)
      let idxMenu = {
        submenuIndex: 0,
        itemindex: 0,
        menuItemsMap: ({} as MenuItemsMap)
      }
      const children: VNode[] = []
      const datacmd = this.$data.commands as ContextMenuCommand[]
      datacmd.forEach(cmd => {
        const chItem = this.genContextMenuItem(cmd, idxMenu )
        children.push(...chItem)
      })
      this.menuItemsMap = idxMenu.menuItemsMap;
      return this.$createElement(VListA, {
        ref: 'content'
      }, children)
    },
    activateSubmenu ( refSub: string, e: Event) {
      if (e instanceof MouseEvent) {
        this.positionXSubmenu = e.clientX + 2;
        this.positionYSubmenu = e.clientY + 2
      }
      (this.$refs[refSub] as any).$data.isActive = true
    },
    activateContextMenu (e: any) {
      this.commands = e.commands
      this.isContextMenuActive = true
      if (e.event instanceof MouseEvent) {
          this.positionX = e.event.x
          this.positionY = e.event.y
      }
      (this.$refs.contextmenu as any).$data.isActive = true;
      (e.event as Event).stopPropagation()
    },
    deactivateContextMenu () {
      (this.$refs.contextmenu as any).$data.isActive = false;
    },
    executeAction (e: any, c: string) {
      // const cmd = this.menuItemsMap[c]
      // if (typeof cmd.action === 'string') {
      //   if (cmd.target) {
      //     if (cmd.target[cmd.action]) {
      //       cmd.container[cmd.action](cmd.target)
      //     } else {
      //       consoleError(`container not have a method ` + cmd.action, cmd)
      //     }
      //   } else {
      //     consoleError(`container property must be defined if action  type is string`, cmd)
      //   }
      // } else if (typeof cmd.action === 'function') {
      //   cmd.action(cmd.target)
      // }
    },
  },
  render (h): VNode {
    return h(VMenuA, {
      ref: 'contextmenu',
      props: {
        absolute: true,
        positionX: this.positionX,
        positionY: this.positionY,
        isActive: this.isContextMenuActive
      },
      on: {
        contextmenu: (e: Event) => {
          e.preventDefault()
        }
      }
    }, [this.genContextMenu()])
  }
})

