/*
 * Copyright 2014 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
'use strict';

angular.module('springBootAdmin')
  	.controller('overviewCtrl', function ($scope, Applications, Application, ApplicationOverview, $location, $interval) {
  		$scope.loadData = function() {
  			$scope.applications = Applications.query({}, function(applications) {
	  			for (var i = 0; i < applications.length; i++) {
	  				var app = applications[i];
	  				ApplicationOverview.getVersion(app);
	  				ApplicationOverview.getHealth(app);
	  				ApplicationOverview.getLogfile(app);
	  			}	
	  		});
  		}
  		$scope.loadData();
  		// callback for ng-click 'showDetails':
  		$scope.showDetails = function(id) {
  			$location.path('/apps/details/' + id + '/infos');
  		};
  		// callback for ng-click 'showLogging':
  		$scope.showLogging = function(id) {
  			$location.path('/apps/logging/' + id + '/read');
  		};
  		// callback for ng-click 'refresh':
  		$scope.refresh = function(id) {
  			$scope.application = Application.query({id: id}, function(application) {
  				ApplicationOverview.refresh(application);
  	  		});
  		};
  		// reload site every 30 seconds
  		var task = $interval(function() {
  			$scope.loadData();
  		}, 30000);
  	})
  	.controller('navCtrl', function ($scope, $location) {
  		$scope.navClass = function(page) {
  			var currentRoute = $location.path().substring(1) || 'main';
  			return page == currentRoute ? 'active' : '';
  		};
  	})
  	.controller('detailsCtrl', function ($scope, $stateParams, Application) {
  		$scope.application = Application.query({id: $stateParams.id});
  	})
  	.controller('detailsInfosCtrl', function ($scope, $stateParams, Application, ApplicationDetails) {
  		$scope.application = Application.query({id: $stateParams.id}, function(application) {
  			ApplicationDetails.getInfo(application);
  		});
  	})
  	.controller('detailsMetricsCtrl', function ($scope, $stateParams, Application, ApplicationDetails, Abbreviator) {
  		$scope.memoryData = [];
  		$scope.heapMemoryData = [];
  		$scope.counterData = [];
  		$scope.gaugeData = [];
  		
  		$scope.application = Application.query({id: $stateParams.id}, function(application) {
  			ApplicationDetails.getMetrics(application, function(application) {
  				//*** Extract data for JVM-Memory-Chart
  				application.metrics["mem.used"] = application.metrics["mem"] - $scope.application.metrics["mem.free"];
  				$scope.memoryData = [ ['Free Memory', application.metrics["mem.free"]],
  				                      ['Used Memory', application.metrics["mem.used"]] ];
  				
  				//*** Extract data for Heap-Memory-Chart
  				application.metrics["heap.free"] = application.metrics["heap"] - $scope.application.metrics["heap.used"];
  				$scope.heapMemoryData = [ ['Free Heap', application.metrics["heap.free"]],
  				                          ['Used Heap', application.metrics["heap.used"]] ];

  				
  				//*** Extract data for Counter-Chart and Gauge-Chart
  				$scope.counterData = [ { key : "value", values: [] } ];
  				$scope.gaugeData = [ { key : "value", values: [] } ];
  				for (var metric in application.metrics) {
  					var matchCounter = /counter\.(.+)/.exec(metric);
  					if ( matchCounter !== null) {
  						$scope.counterData[0].values.push([ matchCounter[1], application.metrics[metric] ]);
  					}

  					var matchGauge = /gauge\.(.+)/.exec(metric);
  					if ( matchGauge !== null) {
  						$scope.gaugeData[0].values.push([ matchGauge[1], application.metrics[metric] ]);
  					}
  				}

  			});
  		});
  		
   		var colorArray = ['#6db33f',  '#a5b2b9', '#34302d' ];
  		$scope.colorFunction = function() {
  			return function(d, i) {
  		    	return colorArray[i % colorArray.length];
  		    };
  		}
  		
		$scope.abbreviateFunction = function(targetLength, preserveLast, shortenThreshold){
  		    return function(s) {
  		        return Abbreviator.abbreviate(s, targetLength, preserveLast, shortenThreshold)
  		    };
  		}

		$scope.intFormatFunction = function(){
  		    return function(d) {
  		        return d3.format('d')(d);
  		    };
  		}
  		
  		$scope.toolTipContentFunction = function(){
  			return function(key, x, y, e, graph) {
  		    	return e.point[0] + ': ' + e.point[1] ;
  			}
  		}
  		
  	})
  	.controller('detailsEnvCtrl', function ($scope, $stateParams, Application, ApplicationDetails) {
  		$scope.application = Application.query({id: $stateParams.id}, function(application) {
  			ApplicationDetails.getEnv(application);
  		});
  	})
  	.controller('detailsPropsCtrl', function ($scope, $stateParams, Application, ApplicationDetails) {
  		$scope.application = Application.query({id: $stateParams.id}, function(application) {
  			ApplicationDetails.getProps(application);
  		});
  	})
  	.controller('loggingCtrl', function ($scope, $stateParams, Application) {
  		$scope.application = Application.query({id: $stateParams.id});
  	})
  	.controller('loggingReadCtrl', function ($scope, $stateParams, Application, ApplicationLogging) {
  		$scope.$parent.application.logger = new Object(); 
  		$scope.readLoglevel = function(application) {
  			ApplicationLogging.getLoglevel(application);
  		};
  	})
  	.controller('loggingWriteCtrl', function ($scope, $stateParams, Application, ApplicationLogging) {
  		$scope.$parent.application.logger = new Object(); 
  		$scope.writeLoglevel = function(application) {
  			ApplicationLogging.setLoglevel(application);
  		};
  	});