define(["backdrop", "mainTabsManager", "layoutManager", "emby-tabs"], function(backdrop, mainTabsManager, layoutManager) {
    "use strict";

    function onViewDestroy(e) {
        var tabControllers = this.tabControllers;
        tabControllers && (tabControllers.forEach(function(t) {
            t.destroy && t.destroy()
        }), this.tabControllers = null), this.view = null, this.params = null, this.currentTabController = null, this.initialTabIndex = null
    }

    function onBeforeTabChange() {}

    function TabbedView(view, params) {
        function validateTabLoad(index) {
            return self.validateTabLoad ? self.validateTabLoad(index) : Promise.resolve()
        }

        function loadTab(index, previousIndex) {
            validateTabLoad(index).then(function() {
                self.getTabController(index).then(function(controller) {
                    var refresh = !controller.refreshed;
                    controller.onResume({
                        autoFocus: null == previousIndex && layoutManager.tv,
                        refresh: refresh
                    }), controller.refreshed = !0, currentTabIndex = index, self.currentTabController = controller
                })
            })
        }

        function getTabContainers() {
            return view.querySelectorAll(".tabContent")
        }

        function onTabChange(e) {
            var newIndex = parseInt(e.detail.selectedTabIndex),
                previousIndex = e.detail.previousIndex,
                previousTabController = null == previousIndex ? null : self.tabControllers[previousIndex];
            previousTabController && previousTabController.onPause && previousTabController.onPause(), loadTab(newIndex, previousIndex)
        }
        this.tabControllers = [], this.view = view, this.params = params;
        var self = this,
            currentTabIndex = parseInt(params.tab || this.getDefaultTabIndex(params.parentId));
        this.initialTabIndex = currentTabIndex, view.addEventListener("viewbeforehide", this.onPause.bind(this)), view.addEventListener("viewbeforeshow", function(e) {
            mainTabsManager.setTabs(view, currentTabIndex, self.getTabs, getTabContainers, onBeforeTabChange, onTabChange, !1)
        }), view.addEventListener("viewshow", function(e) {
            self.onResume(e.detail)
        }), view.addEventListener("viewdestroy", onViewDestroy.bind(this))
    }
    return TabbedView.prototype.onResume = function(options) {
        this.setTitle(), backdrop.clear();
        var currentTabController = this.currentTabController;
        currentTabController ? currentTabController && currentTabController.onResume && currentTabController.onResume({}) : mainTabsManager.selectedTabIndex(this.initialTabIndex)
    }, TabbedView.prototype.onPause = function() {
        var currentTabController = this.currentTabController;
        currentTabController && currentTabController.onPause && currentTabController.onPause()
    }, TabbedView.prototype.setTitle = function() {
        Emby.Page.setTitle("")
    }, TabbedView
});