(function() {
  /**
   * Page to view the details of a single image.
   */
  angular.module('quayPages').config(['pages', function(pages) {
    pages.create('image-view', 'image-view.html', ImageViewCtrl, {
      'newLayout': true,
      'title': '{{ image.id }}',
      'description': 'Image {{ image.id }}'
    })
  }]);

  function ImageViewCtrl($scope, $routeParams, $rootScope, $timeout, ApiService, ImageMetadataService, VulnerabilityService, Features) {
    var namespace = $routeParams.namespace;
    var name = $routeParams.name;
    var imageid = $routeParams.image;

    $scope.options = {
      'vulnFilter': '',
      'packageFilter': ''
    };

    var loadImage = function() {
      var params = {
        'repository': namespace + '/' + name,
        'image_id': imageid
      };

      $scope.imageResource = ApiService.getImageAsResource(params).get(function(image) {
        $scope.image = image;
        $scope.reversedHistory = image.history.reverse();
      });
    };

    var loadRepository = function() {
      var params = {
        'repository': namespace + '/' + name
      };

      $scope.repositoryResource = ApiService.getRepoAsResource(params).get(function(repo) {
        $scope.repository = repo;
      });
    };

    loadImage();
    loadRepository();

    $scope.loadImageSecurity = function() {
      if (!Features.SECURITY_SCANNER || $scope.securityResource) { return; }

      $scope.VulnerabilityLevels = VulnerabilityService.getLevels();

      var params = {
        'repository': namespace + '/' + name,
        'imageid': imageid,
        'vulnerabilities': true,
      };

      $scope.securityResource = ApiService.getRepoImageSecurityAsResource(params).get(function(resp) {
        $scope.securityStatus = resp.status;
        $scope.securityFeatures = [];
        $scope.securityVulnerabilities = [];

        if (resp.data && resp.data.Layer && resp.data.Layer.Features) {
          resp.data.Layer.Features.forEach(function(feature) {
            feature_obj = {
              'name': feature.Name,
              'namespace': feature.Namespace,
              'version': feature.Version,
              'addedBy': feature.AddedBy,
            }
            feature_vulnerabilities = []

            if (feature.Vulnerabilities) {
              feature.Vulnerabilities.forEach(function(vuln) {
                vuln_obj = {
                  'name': vuln.Name,
                  'namespace': vuln.Namespace,
                  'description': vuln.Description,
                  'link': vuln.Link,
                  'severity': vuln.Severity,
                  'metadata': vuln.Metadata,
                  'feature': jQuery.extend({}, feature_obj),
                  'fixedBy': vuln.FixedBy,
                  'index': VulnerabilityService.LEVELS[vuln['Severity']]['index'],
                }

                feature_vulnerabilities.push(vuln_obj)
                $scope.securityVulnerabilities.push(vuln_obj);
              });
            }

            feature_obj['vulnerabilities'] = feature_vulnerabilities
            $scope.securityFeatures.push(feature_obj);
          });
        }

        return resp;
      });
    };

    $scope.initializeTree = function() {
      if ($scope.tree || !$scope.combinedChanges.length) { return; }

      $scope.tree = new ImageFileChangeTree($scope.image, $scope.combinedChanges);
      $timeout(function() {
        $scope.tree.draw('changes-tree-container');
      }, 100);
    };
  }
})();