// appTabManager is responsible for loading or closing tabs 
frameworkModule.factory('appTabManager', ['$log', 'enums', '$filter', 'constants', '$translate', '$rootScope', '$timeout', '$window', '$stickyState', 'risDialog',
    function ($log, enums, $filter, constants, $translate, $rootScope, $timeout, $window, $stickyState, risDialog) {
        'use strict';
        $log.debug('appTabManager.ctor()...');

        var broadcastTabsChangedEvent = function () {
            // use $timeout to wait for the DOM get updated completed!
            $timeout(function () {
                $rootScope.$broadcast('appTabManager:tabsChanged');
            }, 300);
        };

        /// <summary>
        ///  tab collection on application nav bar
        /// </summary>
        var tabs = [];

        var meetTabCeiling = function () {
            if (tabs.length >= constants.tabCeiling) {
                risDialog({
                    id: 'simpleDialog',
                    template:
                      '<div class="row-fluid">' +
                      ' <h4>您打开的窗口过多,这会影响工作效率,请关闭部分窗口。</h4>' +
                      ' <div>' +
                      '   <div class="codebox">' +
                      '   </div>\n' +
                      ' </div>\n' +
                      '</div>',
                    title: '提示',
                    backdrop: true
                });

                return true;
            }
            return false;
        };

        var selectOpenedTab = function (tab) {
            var list = [];
            if (tabs.length > 0) {
                angular.forEach(tabs, function (tabInfo) {
                    tabInfo.active = tabInfo.tabId === tab.tabId;
                });
            }

            return list;
        };

        tabs.insert = function (index, tab) {
            if (meetTabCeiling()) {
                return false;
            }

            tabs.splice(index, 0, tab);
            broadcastTabsChangedEvent();
            selectOpenedTab(tab);
            return true;
        };

        tabs.add = function (tab) {
            if (meetTabCeiling()) {
                return false;
            }

            tabs.push(tab);
            broadcastTabsChangedEvent();
            selectOpenedTab(tab);
            return true;
        };

        tabs.remove = function (index) {
            if (index > 0) {
                tabs.splice(index, 1);
                broadcastTabsChangedEvent();

                return true;
            }
            selectOpenedTab(tabs[0]);
            return false;
        }

    

        //get opened tabs data to save
        var getOpenedTabs = function (userId) {
            var list = [];
            if (tabs.length > 0) {
                angular.forEach(tabs, function (tabInfo, index) {
                    var tab = {};
                    tab.isWorking = tabInfo.active;
                    tab.position = index;
                    tab.tabId = tabInfo.tabId;
                    tab.tabType = tabInfo.tabType;
                    tab.userId = userId;
                    list.push(tab);
                });
            }

            return list;
        };


        // after tab closed, remove the dom element from ui-view
        var resetState = function (tab) {
            if (tab.route) {
                tab.route.tabId = '';
                tab.route.isWorking = false;
                tab.route = null;
            }

            $timeout(function () {
                $stickyState.reset(tab.state);
            }, 0);
        };

        var closeTabByIndex = function (index) {
            if (_.isNumber(index)) {
                var tab = tabs[index];
                tabs.remove(index);

                resetState(tab);

                selectOpenedTab(tabs[0]);
            } else {
                // do nothing
            }
        };

        var closeCurrentTab = function ()
        {
            _.each(tabs, function (item, index)
            {
                if (item.active)
                {
                    tabs.remove(index);
                }
            });

            selectOpenedTab(tabs[0]);
            
        };

        var closeTab = function (tabId) {
            var tab = _.findWhere(tabs, {
                tabId: tabId
            });
            if (tab) {
                var index = tabs.indexOf(tab);
                tabs.remove(index);

                resetState(tab);

                selectOpenedTab(tabs[0]);
            } else {
                // do nothing
            }
        };
 

        //main
        var createMainTab = function () {
            var mainTab = {
                tabType: enums.tabType.main,
                tabId: PWC.newGuid(),
                url: '/main',
                tabName: '主页' // just demo, need do i18n in future
            };

            return mainTab;
        };

        var loadMainTab = function (eventData, onTabLoaded) {
            var tabItem = _.findWhere(tabs, {
                tabType: enums.tabType.main
            });

            if (!tabItem)
            {
                tabItem = createMainTab();
                if (tabs.add(tabItem))
                {
                    onTabLoaded(tabItem, eventData);
                }
            } else {
                onTabLoaded(tabItem, eventData);
                selectOpenedTab(tabItem);
            }
        };

        //dashboard
        var createDashboardTab = function ()
        {
            var mainTab = {
                tabType: enums.tabType.dashboard,
                tabId: PWC.newGuid(),
                url: '/dashboard/compare',
                tabName: '数据汇总'
            };

            return mainTab;
        };

        var loadDashboardTab = function (eventData, onTabLoaded)
        {
            var tabItem = _.findWhere(tabs, {
                tabType: enums.tabType.dashboard
            });

            if (!tabItem)
            {
                tabItem = createDashboardTab();
                if (tabs.add(tabItem))
                {
                    onTabLoaded(tabItem, eventData);
                }
            }
            else
            {
                onTabLoaded(tabItem, eventData);
                selectOpenedTab(tabItem);
            }
        };

        //dashboard
        var createChartEditTab = function (chartSettingEventData)
        {
            var tabItem = {
                tabType: enums.tabType.chartEdit,
                tabId: PWC.newGuid(),
                chartId: chartSettingEventData.chartId,
                url: '/dashboardsetting/{0}'.format(chartSettingEventData.chartId), 
                tabName: $translate.instant('chartsetting')
            };

            return tabItem;
        };

        var loadChartEditTab = function (chartSettingEventData, onTabLoaded)
        {
            var tabItem = _.findWhere(tabs, {
                tabType: enums.tabType.chartEdit, chartId: chartSettingEventData.chartId
            });

            if (!tabItem)
            {
                tabItem = createChartEditTab(chartSettingEventData);
                if (tabs.add(tabItem))
                {
                    onTabLoaded(tabItem, chartSettingEventData);
                }
            } else
            {
                selectOpenedTab(tabItem);
                onTabLoaded(tabItem, chartSettingEventData);
            }
        };

        //dashboard
        var createCommonUrlTab = function (comonEventData)
        {
            var tabItem = {
                tabType: enums.tabType.commonUrl,
                tabId: PWC.newGuid(),
                url: comonEventData.url.format(comonEventData.param),
                tabName: $translate.instant(comonEventData.stateName)
            };

            return tabItem;
        };

        var loadCommonUrlTab = function (comonEventData, onTabLoaded)
        {
            var tabItem = _.findWhere(tabs, {
                url: comonEventData.url
            });

            if (!tabItem)
            {
                tabItem = createCommonUrlTab(comonEventData);
                if (tabs.add(tabItem))
                {
                    onTabLoaded(tabItem, comonEventData);
                }
            }
            else
            {
                selectOpenedTab(tabItem);
            }
        };


        return {
            tabs: tabs,
            getOpenedTabs: getOpenedTabs,
            closeTabByIndex: closeTabByIndex,
            closeTab: closeTab,
            closeCurrentTab: closeCurrentTab,
            loadMainTab: loadMainTab,
            loadDashboardTab: loadDashboardTab,
            loadChartEditTab: loadChartEditTab,
            loadCommonUrlTab: loadCommonUrlTab,
            selectOpenedTab: selectOpenedTab
        };
    }
]);