/// <reference path="../../includes.ts"/>
module Navigation {

  export var pluginName = 'hawtio-navigation';
  export var log = Logger.get(pluginName);
  export var _module = angular.module(pluginName, []);

  _module.run(() =>{
    console.log("1");    
  });

  _module.service('HawtioBreadcrumbs', () => {
    var _config = [];
    var self = {
      apply: (config) => {
        _config.length = 0;
        _.forEach(config, (crumb) => {
          _config.push(crumb);
        });
      },
      get: () => {
        return _config;
      }
    };
    return self;
  });

  _module.service('HawtioSubTabs', () => {
    var _config = [];
    var self = {
      apply: (config) => {
        _config.length = 0;
        _.forEach(config, (crumb) => {
          _config.push(crumb);
        });
      },
      get: () => {
        return _config;
      } 
    } 
    return self;
  });

  _module.directive('hawtioRelativeHref', ['$location', ($location) => {
    return {
      restrict: 'A',
      link: (scope, element, attr) => {
        var targetPath = attr['hawtioRelativeHref'];
        var targetHref = new URI($location.url());
        targetHref.segment(targetPath);
        element.attr('href', targetHref.toString());
      }
    }
  }]);

  _module.directive('viewportHeight', ['$window', '$document', ($window, $document) => {
    return {
      restrict: 'A',
      link: (scope, element, attr) => {
        // log.debug("Window: ", $window);
        // log.debug("element: ", element);
        var win = $($window);
        var resizeFunc = () => {
          var viewportHeight = win.innerHeight();
          // log.debug("Viewport height: ", viewportHeight);
          var elTop = element.offset().top;
          // log.debug("Element top: ", elTop);
          var height = viewportHeight - elTop;
          element.css('height', height);
        };
        win.on('resize', resizeFunc);
        element.on('$destroy', () => {
          win.off('resize', resizeFunc);
        });
        setTimeout(resizeFunc, 50);
      }
    }
  }]);

  _module.directive('hawtioMainOutlet', ['HawtioSubTabs', (HawtioSubTabs) => {
    return {
      restrict: 'A',
      link: (scope, element, attrs) => {
        scope.tabs = HawtioSubTabs;
        scope.$watchCollection('tabs.get()', (tabs) => {
          // log.debug("subTabConfig: ", subTabConfig);
          if (tabs && tabs.length > 0) {
            element.removeClass('hidden-nav');
            element.css({ 'margin-left': '' });
          } else {
            element.addClass('hidden-nav');
            element.css({ 'margin-left': 'auto' });
          }
        });
      }
    };

  }]);

  _module.directive('hawtioTabsOutlet', ['HawtioSubTabs', (HawtioSubTabs) => {
    var initialized = false;
    return {
      restrict: 'AE',
      replace: true,
      template: `
        <div class="nav-pf-vertical nav-pf-vertical-with-secondary-nav" ng-controller="Developer.NavBarController" ng-class="getClass()">
          <div class="list-group">
            <div ng-repeat="subTab in subTabConfig" ng-show="true"
                class="list-group-item {{subTab.active ? 'active' : ''}}"
                title="{{subTab.title}}">
                <a ng-hide="subTab.template" href="{{subTab.href}}">
                  <span ng-show="subTab.class" ng-class="subTab.class"></span>
                  <img ng-show="subTab.icon" ng-src="{{subTab.icon}}">
                  {{subTab.label}}
                </a>
                <div ng-show="subTab.template" compile="subTab.template"></div>
            </div>
          </>
        </div>
      `,
      link: (scope, element, attrs) => {
        if (!initialized) {
          try {
            //(<any>$)().setupVerticalNavigation(false);
          } catch (err) {
            // ignore if we haven't loaded patternfly
          }
          initialized = true;
        }
        scope.HawtioSubTabs = HawtioSubTabs;

        var collapsed = false;
        scope.getClass = () => {
          //log.debug("My class: ", element.attr('class'));
          if (!scope.subTabConfig || !scope.subTabConfig.length) {
            return 'hidden';
          }
          if (collapsed) {
            return 'collapsed';
          }
          return '';
        }
        scope.$on('hawtioCollapseNav', () => {
          collapsed = !collapsed;
        });
        scope.$watch('HawtioSubTabs.get()', (subTabConfig) => {
          scope.subTabConfig = subTabConfig;

        });
      }
    };
  }]);

  _module.directive('hawtioBreadcrumbsOutlet', ['HawtioBreadcrumbs', 'HawtioSubTabs', (HawtioBreadcrumbs, HawtioSubTabs) => {
    return {
      restrict: 'E',
      scope: {},
      template: `
        <div class="nav navbar-nav nav-breadcrumb nav-breadcrumbs" ng-show="breadcrumbConfig" ng-controller="Developer.NavBarController">
          <ol class="breadcrumb">
            <li ng-repeat="breadcrumb in breadcrumbConfig" ng-show="isValid(breadcrumb) && label(breadcrumb)"
                class="{{breadcrumb.active ? 'active' : ''}}"
                ng-class="$last ? 'dropdown' : ''"
                title="{{breadcrumb.title}}">
              <a ng-show="breadcrumb.href" href="{{breadcrumb.href}}">{{label(breadcrumb)}}</a>
              <span ng-hide="breadcrumb.href">{{label(breadcrumb)}}</span>
            </li>
            <li ng-show="pageTitle">
              <span ng-bind="pageTitle"></span>
            </li>
          </ol>
        </div>
      `,
      link: (scope, element, attrs) =>  {
        scope.breadcrumbs = HawtioBreadcrumbs;
        scope.tabs = HawtioSubTabs;
        scope.$watchCollection('breadcrumbs.get()', (breadcrumbConfig) => {
          scope.breadcrumbConfig = breadcrumbConfig;          
        });
        scope.$watchCollection('tabs.get()', (tabs) => {        
          var active = _.find(tabs, (tab:any) => tab.active);
          if (active) {
            scope.pageTitle = active.label;
          } else {
            scope.pageTitle = undefined;
          }
        });
      }
    };
  }]);

  _module.directive('platformSubTabsOutlet', ['HawtioSubTabs', (HawtioSubTabs) => {
    var initialized = false;
    return {
      restrict: 'AE',
      replace: true,
      template: `
        <div class="nav-pf-vertical nav-pf-vertical-with-secondary-nav sj_menu"  ng-controller="Developer.NavBarController" ng-class="getClass()">
          <ul class="navbar-lf-menu "  >
            <li ng-repeat="subTab in subTabConfig " >
              <div class="expandable closed "  ng-show="subTab.items.length" style=" padding:0;">
                <div title="The title" class="title sj_menu_nav" >
                  <i class=" sj_menu_01" >{{subTab.label}}</i> 
                </div>
                <ul class="expandable-body  sj_menu_ul" >
                  <li ng-repeat="item in subTab.items" >
                    <a href="{{item.href}}" >{{item.label}}</a>
                  </li>
                </ul>
              </div>
              <div ng-hide="subTab.items.length" class="sj_menu_nav" >
                <i class=" sj_menu_02" ></i><a href="{{subTab.href}}">{{subTab.label}}</a>
              </div>
            </li>  
          </ul>
        </div> 
      `,
      link: (scope, element, attrs) => {
        if (!initialized) {
          try {
            //(<any>$)().setupVerticalNavigation(false);
          } catch (err) {
            // ignore if we haven't loaded patternfly
          }
          initialized = true;
        }
        scope.HawtioSubTabs = HawtioSubTabs;

        var collapsed = false;
        scope.getClass = () => {
          //log.debug("My class: ", element.attr('class'));
          if (!scope.subTabConfig || !scope.subTabConfig.length) {
            return 'hidden';
          }
          if (collapsed) {
            return 'collapsed';
          }
          return '';
        }
        scope.$on('hawtioCollapseNav', () => {
          collapsed = !collapsed;
        });
        scope.$watch('HawtioSubTabs.get()', (subTabConfig) => {
          scope.subTabConfig = subTabConfig;

        });
      }
    };
  }]);

  //hawtioPluginLoader.addModule('patternfly');

  hawtioPluginLoader.addModule(pluginName);

}