import { inject } from "inversify"
import Tabs from "vc/modules/tabs"
import WindowManager from "vc/modules/window-manager"
import { broadcast } from "vc/utils"

class TabsCommand {
    static name: string = "TabsCommand"

    constructor(
        @inject(Tabs) private _Tabs: Tabs,
        @inject(WindowManager) private _WindowManager: WindowManager,
    ) {
        this.listenerTabActive = this.listenerTabActive.bind(this)
        this._Tabs.events.addListener("update", this.listenerTabActive)
    }

    init() {
        const mainWindow = this._WindowManager.getMainWindow()
        this._Tabs.init(mainWindow)
    }

    bindElement(rect) {
        this._Tabs.updateRect(rect)
    }

    reload() {
        this._WindowManager.getMainWindow()?.reload()
    }

    sync() {
        this.listenerTabActive()
    }

    listenerTabActive() {
        broadcast("TabsCommand.update", this.getAllTabs())
    }

    add(url) {
        this._Tabs.add(url, true, this._WindowManager.getMainWindow()!)
    }

    nagivate(index: number, url: string) {
        this._Tabs.navigate(+index, url)
    }

    setActive(index) {
        this._Tabs.changeActive(index)
    }

    closeTab(e) {
        this._Tabs.remove(e.body.active)
    }

    getAllTabs() {
        return this._Tabs._tabs.map(v => ({
            url: v.url,
            showUrl: v.showUrl,
            title: v.title,
            favicons: v.favicons,
            isActive: v.isActive,
        }))
    }
}

export { TabsCommand }
export default TabsCommand