/// <reference path="../../includes.ts"/>
/// <reference path="../../kubernetes/ts/kubernetesHelpers.ts"/>
/// <reference path="developerEnrichers.ts"/>
/// <reference path="developerHelpers.ts"/>
/// <reference path="developerNavigation.ts"/>

module Developer {

  export var ProjectsController = controller("ProjectsController", ["$scope", "KubernetesModel", "KubernetesState", "$dialog", "$window", "$templateCache", "$routeParams", "$location", "localStorage", "$http", "$timeout", "KubernetesApiURL",
    ($scope, KubernetesModel:Kubernetes.KubernetesModelService, KubernetesState, $dialog, $window, $templateCache, $routeParams, $location:ng.ILocationService, localStorage, $http, $timeout, KubernetesApiURL) => {

      $scope.kubernetes = KubernetesState;
      $scope.model = KubernetesModel;

      $scope.tableConfig = {
        data: 'model.buildconfigs',
        showSelectionCheckbox: true,
        enableRowClickSelection: false,
        multiSelect: true,
        selectedItems: [],
        filterOptions: {
          filterText: $location.search()["q"] || ''
        },
        columnDefs: [
          {
            field: '$name',
            displayName: 'Name',
            cellTemplate: $templateCache.get("idTemplate.html")
          },
/*
          {
            field: 'spec.source.type',
            displayName: 'Source'
          },
*/
          {
            field: 'spec.source.git.uri',
            displayName: 'Repository'
          },
/*
          {
            field: 'spec.strategy.type',
            displayName: 'Strategy'
          },
          {
            field: 'spec.strategy.stiStrategy.image',
            displayName: 'Source Image'
          },
          {
            field: 'spec.output.imageTag',
            displayName: 'Output Image'
          },
*/
          {
            field: 'metadata.description',
            displayName: 'Description'
          },
          {
            field: '$creationDate',
            displayName: 'Created',
            cellTemplate: $templateCache.get("creationTimeTemplate.html")
          },
          {
            field: '$labelsText',
            displayName: 'Labels',
            cellTemplate: $templateCache.get("labelTemplate.html")
          }
        ]
      };

      Kubernetes.initShared($scope, $location, $http, $timeout, $routeParams, KubernetesModel, KubernetesState, KubernetesApiURL);

      $scope.breadcrumbConfig = createProjectBreadcrumbs();
      $scope.subTabConfig = Developer.createWorkspaceSubNavBars();

      // TODO
      //$scope.isLoggedIntoGogs = Forge.isLoggedIntoGogs;

      $scope.deletePrompt = (selected) => {
        UI.multiItemConfirmActionDialog(<UI.MultiItemConfirmActionOptions>{
          collection: selected,
          index: '$name',
          onClose: (result:boolean) => {
            if (result) {
              function deleteSelected(selected, next) {
                if (next) {
                  deleteEntity(next, () => {
                    deleteSelected(selected, selected.shift());
                  });
                } else {
                  // TODO
                  // updateData();
                }
              }

              deleteSelected(selected, selected.shift());
            }
          },
          title: 'Delete Apps',
          action: 'The following Apps will be deleted:',
          okText: 'Delete',
          okClass: 'btn-danger',
          custom: "This operation is permanent once completed!",
          customClass: "alert alert-warning"
        }).open();
      };

      function deleteEntity(selection, nextCallback) {
        var name = (selection || {}).$name;
        var jenkinsJob = selection.$jenkinsJob;
        var publicJenkinsUrl = jenkinsLink();
        //var jenkinsUrl = Core.pathGet(selection, ["$fabric8Views", "fabric8.link.jenkins.job", "url"]);
        if (name) {
          console.log("About to delete build config: " + name);
          var url = Kubernetes.buildConfigRestUrl(name);
          $http.delete(url).
            success(function (data, status, headers, config) {
              nextCallback();
            }).
            error(function (data, status, headers, config) {
              log.warn("Failed to delete build config on " + url + " " + data + " " + status);
              nextCallback();
            });
        } else {
          console.log("warning: no name for selection: " + angular.toJson(selection));
        }

        if (jenkinsJob && publicJenkinsUrl) {
          var url = Kubernetes.kubernetesProxyUrlForServiceCurrentNamespace(jenkinsServiceNameAndPort, UrlHelpers.join("job", jenkinsJob, "doDelete"));
          var body = "";
          var config = {
            headers: {
              'Content-Type': "text/plain"
            }
          };
          log.info("posting to jenkinsUrl: " + url);
          $http.post(url, body, config).
            success(function (data, status, headers, config) {
              log.info("Managed to delete " + url);
            }).
            error(function (data, status, headers, config) {
              log.warn("Failed to delete jenkins job at " + url + " " + data + " " + status);
            });
        }
      }

/*
      $scope.$keepPolling = () => Kubernetes.keepPollingModel;
      $scope.fetch = PollHelpers.setupPolling($scope, (next:() => void) => {
        var url = Kubernetes.buildConfigsRestURL();
        $http.get(url).
          success(function (data, status, headers, config) {
            if (data) {
              //console.log("got data " + angular.toJson(data, true));
              var sortedBuilds = null;
              $scope.buildConfigs = Kubernetes.enrichBuildConfigs(data.items, sortedBuilds);
              $scope.model.fetched = true;
              Core.$apply($scope);
              next();
            }
          }).
          error(function (data, status, headers, config) {
            log.warn("Failed to load " + url + " " + data + " " + status);
            next();
          });
      });

      $scope.fetch();
*/
    }]);
}