/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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';

/**
 * @ngdoc function
 * @name ocwUiApp.controller:ParameterSelectCtrl
 * @description
 * # ParameterSelectCtrl
 * Controller of the ocwUiApp
 */
angular.module('ocwUiApp')
.controller('ParameterSelectCtrl', ['$rootScope', '$scope', '$http', '$timeout', 
						   'selectedDatasetInformation', 'regionSelectParams', 'evaluationSettings', 
  function($rootScope, $scope, $http, $timeout, selectedDatasetInformation, regionSelectParams, evaluationSettings) {
    $scope.datasets = selectedDatasetInformation.getDatasets();

    // The min/max lat/lon values from the selected datasets
    $scope.latMin = -90;
    $scope.latMax = 90;
    $scope.lonMin = -180;
    $scope.lonMax = 180;
    $scope.start = "1900-01-01 00:00:00";
    $scope.end = "2030-01-01 00:00:00";

    // The min/max lat/lon values that are displayed
    $scope.displayParams = regionSelectParams.getParameters();

    $scope.runningEval = false;

    // Flag for toggling re-grid controls based on whether or not the user has selected a grid
    // base from the selected datasets. By default we have no datasets so we don't need to show
    // the controls!
    $scope.areInUserRegridState = false;

    // Initialization for the lat/lon grid step sliders
    // TODO There has to be a better way of dealing with this. Perhaps a directive??
    $scope.latSliderVal = 0;
    $scope.lonSliderVal = 0;

    // Settings for jQuery datepicker directives!
    $scope.datepickerSettings = {
      changeMonth: true,
      changeYear: true,
    };

    $scope.shouldDisableControls = function() {
      return (selectedDatasetInformation.getDatasetCount() < 2);
    }

    $scope.shouldDisableEvaluateButton = function() {
      return ($scope.shouldDisableControls() || $scope.runningEval);
    }

    $scope.shouldDisableResultsView = function() {
      var res = false;

      if ($rootScope.evalResults == "")
        res = true;

      return res;
    }

    $scope.runEvaluation = function() {
      $scope.runningEval = true;

      var data = {}
      var settings = evaluationSettings.getSettings()

      // Set dataset information

      // Grab the reference dataset information
      var ref_ds = settings.spatialSelect;

      if (ref_ds == null) {
        ref_ds = $scope.datasets[0];
      }

      data['reference_dataset'] = null;
      data['target_datasets'] = [];

      // Parse all the dataset information and generate the necessary objects for the backend
      for (var i = 0; i < $scope.datasets.length; i++) {
        var dataset = {}
        dataset['dataset_info'] = {}

        if ($scope.datasets[i].isObs == 0) {
          dataset['data_source_id'] = 1;
          dataset['dataset_info']['dataset_id'] = $scope.datasets[i]['id'];
          dataset['dataset_info']['var_name'] = $scope.datasets[i]['param'];
          dataset['dataset_info']['lat_name'] = $scope.datasets[i]['lat'];
          dataset['dataset_info']['lon_name'] = $scope.datasets[i]['lon'];
          dataset['dataset_info']['time_name'] = $scope.datasets[i]['time'];
          dataset['dataset_info']['name'] = $scope.datasets[i]['name'];
        } else {
          dataset['data_source_id'] = 2;
          dataset['dataset_info']['dataset_id'] = $scope.datasets[i]['datasetId'];
          dataset['dataset_info']['parameter_id'] = $scope.datasets[i]['param'];
          dataset['dataset_info']['name'] = $scope.datasets[i]['name'];
        }

        if ($scope.datasets[i].id === ref_ds.id) {
          data['reference_dataset'] = dataset;
        } else {
          data['target_datasets'].push(dataset);
        }
      }

      // TODO: These should be use customizable
      // Set the spatial rebin grid steps
      data['spatial_rebin_lat_step'] = 1;
      data['spatial_rebin_lon_step'] = 1;

      // Determine the temporal resolution to use when doing a temporal rebin. The
      // value is used to determine the timedelta in days to use.
      var temporal_res = settings.temporal.selected;

      if (temporal_res == 'daily') {
        data['temporal_resolution'] = 1;
      } else if (temporal_res == 'monthly') {
        data['temporal_resolution'] = 30;
      } else if (temporal_res == 'yearly') {
        data['temporal_resolution'] = 365;
      } else if (temporal_res == 'full') {
        data['temporal_resolution'] = 999;
      } else {
        // Default to monthly just in case
        data['temporal_resolution'] = 30;
      }

      // Load the Metrics for the evaluation
      data['metrics'] = []
      var metrics = settings.metrics
      for (var i = 0; i < metrics.length; i++) {
        var metric = metrics[i];

        if (metric.select) {
          data['metrics'].push(metric.name)
        }
      }

      // Set the bound values for the evaluation
      data['start_time'] =  $scope.displayParams.start + " 00:00:00",
      data['end_time'] = $scope.displayParams.end + " 00:00:00",
      data['lat_min'] = $scope.displayParams.latMin,
      data['lat_max'] = $scope.displayParams.latMax,
      data['lon_min'] = $scope.displayParams.lonMin,
      data['lon_max'] = $scope.displayParams.lonMax,

      $http.post($rootScope.baseURL + '/processing/run_evaluation/', data).
      success(function(data) {
        var evalWorkDir = data['eval_work_dir'];

        $scope.runningEval = false;

        $timeout(function() {
          if (evalWorkDir !== undefined) {
            window.location = "#/results/" + evalWorkDir;
          } else {
            window.location = "#/results";
          }
        }, 100);
        
      }).error(function() {
        $scope.runningEval = false;
      });
    };

    // Check the Parameter selection boxes after the user has changed input to ensure that valid
    // values were entered
    $scope.checkParameters = function() {
      if (parseFloat($scope.displayParams.latMin) < parseFloat($scope.latMin))
        $scope.displayParams.latMin = $scope.latMin;

      if (parseFloat($scope.displayParams.latMax) > parseFloat($scope.latMax))
        $scope.displayParams.latMax = $scope.latMax;

      if (parseFloat($scope.displayParams.lonMin) < parseFloat($scope.lonMin)) 
        $scope.displayParams.lonMin = $scope.lonMin;

      if (parseFloat($scope.displayParams.lonMax) > parseFloat($scope.lonMax)) 
        $scope.displayParams.lonMax = $scope.lonMax;

      if ($scope.displayParams.start < $scope.start) 
        $scope.displayParams.start = $scope.start;

      if ($scope.displayParams.end > $scope.end)
        $scope.displayParams.end = $scope.end;

          $scope.displayParams.latMin = $scope.truncateFloat($scope.displayParams.latMin);
          $scope.displayParams.latMax = $scope.truncateFloat($scope.displayParams.latMax);
          $scope.displayParams.lonMin = $scope.truncateFloat($scope.displayParams.lonMin);
          $scope.displayParams.lonMax = $scope.truncateFloat($scope.displayParams.lonMax);

      $scope.$apply();
      $rootScope.$broadcast('redrawOverlays', []);
    }

    $scope.unwatchDatasets = $scope.$watch('datasets', 
      function() { 
        var numDatasets = $scope.datasets.length;
        $scope.displayParams.areValid = false;
        $scope.areInUserRegridState = false;

        if (numDatasets) {
          var latMin        = -90,
            latMax        = 90,
            lonMin        = -180,
            lonMax        = 180,
            start         = "1900-01-01 00:00:00",
            end           = "2030-01-01 00:00:00",
            datasetRegrid = false;
          // Get the valid lat/lon range in the selected datasets.
          for (var i = 0; i < numDatasets; i++) {
            var curDataset = $scope.datasets[i];
    
            latMin = (curDataset['latlonVals']['latMin'] > latMin) ? curDataset['latlonVals']['latMin'] : latMin;
            latMax = (curDataset['latlonVals']['latMax'] < latMax) ? curDataset['latlonVals']['latMax'] : latMax;
            lonMin = (curDataset['latlonVals']['lonMin'] > lonMin) ? curDataset['latlonVals']['lonMin'] : lonMin;
            lonMax = (curDataset['latlonVals']['lonMax'] < lonMax) ? curDataset['latlonVals']['lonMax'] : lonMax;
            start = (curDataset['timeVals']['start'] > start) ? curDataset['timeVals']['start'] : start;
            end = (curDataset['timeVals']['end'] < end) ? curDataset['timeVals']['end'] : end;

            datasetRegrid = datasetRegrid || curDataset.regrid;

          }

          $scope.areInUserRegridState = !datasetRegrid
        }

        // Update the display parameters with the new valid overlap that we've found!
        $scope.displayParams.latMin = $scope.truncateFloat(latMin);
        $scope.displayParams.latMax = $scope.truncateFloat(latMax);
        $scope.displayParams.lonMin = $scope.truncateFloat(lonMin);
        $scope.displayParams.lonMax = $scope.truncateFloat(lonMax);
        $scope.displayParams.start = (typeof start == 'undefined') ? "" : start.split(" ")[0];
        $scope.displayParams.end = (typeof end == 'undefined') ? "" : end.split(" ")[0];

        // Update the local store values!
        $scope.latMin = latMin;
        $scope.latMax = latMax;
        $scope.lonMin = lonMin;
        $scope.lonMax = lonMax;
        $scope.start = (typeof start == 'undefined') ? "" : start.split(" ")[0];
        $scope.end = (typeof end == 'undefined') ? "" : end.split(" ")[0];

        $scope.displayParams.areValid = true;
        $rootScope.$broadcast('redrawOverlays', []);
      }, true);

      $scope.truncateFloat = function(floatVal) {
          if (floatVal > 0) {
              return Math.floor(floatVal);
          } else {
              return Math.ceil(floatVal);
          }
      };
  }]);
