/*
    panel
*/

import $ from '../util/dom-core.js'
import replaceLang from '../util/replace-lang.js'

const emptyFn = () => {}

// 记录已经显示 panel 的菜单
let _isCreatedPanelMenus = []

// 构造函数
function Panel(menu, opt) {
    this.menu = menu
    this.opt = opt
}

// 原型
Panel.prototype = {
    constructor: Panel,

    // 显示（插入DOM）
    show: function () {
        const menu = this.menu
        if (_isCreatedPanelMenus.indexOf(menu) >= 0) {
            // 该菜单已经创建了 panel 不能再创建
            return
        }

        const editor = menu.editor
        const $body = $('body')
        const $textContainerElem = editor.$textContainerElem
        const opt = this.opt

        // panel 的容器
        const $container = $('<div class="w-e-panel-container"></div>')
        const width = opt.width || 300 // 默认 300px
        $container.css('width', width + 'px')
                .css('margin-left', (0 - width)/2 + 'px')

        // 添加关闭按钮
        const $closeBtn = $('<i class="w-e-icon-close w-e-panel-close"></i>')
        $container.append($closeBtn)
        $closeBtn.on('click', () => {
            this.hide()
        })

        // 准备 tabs 容器
        const $tabTitleContainer = $('<ul class="w-e-panel-tab-title"></ul>')
        const $tabContentContainer = $('<div class="w-e-panel-tab-content"></div>')
        $container.append($tabTitleContainer).append($tabContentContainer)

        // 设置高度
        const height = opt.height
        if (height) {
            $tabContentContainer.css('height', height + 'px').css('overflow-y', 'auto')
        }
        
        // tabs
        const tabs = opt.tabs || []
        const tabTitleArr = []
        const tabContentArr = []
        tabs.forEach((tab, tabIndex) => {
            if (!tab) {
                return
            }
            let title = tab.title || ''
            let tpl = tab.tpl || ''

            // 替换多语言
            title = replaceLang(editor, title)
            tpl = replaceLang(editor, tpl)

            // 添加到 DOM
            const $title = $(`<li class="w-e-item">${title}</li>`)
            $tabTitleContainer.append($title)
            const $content = $(tpl)
            $tabContentContainer.append($content)

            // 记录到内存
            $title._index = tabIndex
            tabTitleArr.push($title)
            tabContentArr.push($content)

            // 设置 active 项
            if (tabIndex === 0) {
                $title._active = true
                $title.addClass('w-e-active')
            } else {
                $content.hide()
            }

            // 绑定 tab 的事件
            $title.on('click', e => {
                if ($title._active) {
                    return
                }
                // 隐藏所有的 tab
                tabTitleArr.forEach($title => {
                    $title._active = false
                    $title.removeClass('w-e-active')
                })
                tabContentArr.forEach($content => {
                    $content.hide()
                })

                // 显示当前的 tab
                $title._active = true
                $title.addClass('w-e-active')
                $content.show()
            })
        })

        // 绑定关闭事件
        $container.on('click', e => {
            // 点击时阻止冒泡
            e.stopPropagation()
        })
        $body.on('click', e => {
            this.hide()
        })

        // 添加到 DOM
        $textContainerElem.append($container)

        // 绑定 opt 的事件，只有添加到 DOM 之后才能绑定成功
        tabs.forEach((tab, index) => {
            if (!tab) {
                return
            }
            const events = tab.events || []
            events.forEach(event => {
                const selector = event.selector
                const type = event.type
                const fn = event.fn || emptyFn
                const $content = tabContentArr[index]
                $content.find(selector).on(type, (e) => {
                    e.stopPropagation()
                    const needToHide = fn(e)
                    // 执行完事件之后，是否要关闭 panel
                    if (needToHide) {
                        this.hide()
                    }
                })
            })
        })

        // focus 第一个 elem
        let $inputs = $container.find('input[type=text],textarea')
        if ($inputs.length) {
            $inputs.get(0).focus()
        }

        // 添加到属性
        this.$container = $container

        // 隐藏其他 panel
        this._hideOtherPanels()
        // 记录该 menu 已经创建了 panel
        _isCreatedPanelMenus.push(menu)
    },

    // 隐藏（移除DOM）
    hide: function () {
        const menu = this.menu
        const $container = this.$container
        if ($container) {
            $container.remove()
        }

        // 将该 menu 记录中移除
        _isCreatedPanelMenus = _isCreatedPanelMenus.filter(item => {
            if (item === menu) {
                return false
            } else {
                return true
            }
        })
    },

    // 一个 panel 展示时，隐藏其他 panel
    _hideOtherPanels: function () {
        if (!_isCreatedPanelMenus.length) {
            return
        }
        _isCreatedPanelMenus.forEach(menu => {
            const panel = menu.panel || {}
            if (panel.hide) {
                panel.hide()
            }
        })
    }
}

export default Panel