angular.module('portainer.docker', ['portainer.app'])
.config(['$stateRegistryProvider', function ($stateRegistryProvider) {
  'use strict';

  var docker = {
    name: 'docker',
    parent: 'root',
    abstract: true,
    resolve: {
      endpointID: ['EndpointProvider', '$state',
        function (EndpointProvider, $state) {
          var id = EndpointProvider.endpointID();
          if (!id) {
            return $state.go('portainer.home');
          }
        }
      ]
    }
  };

  var configs = {
    name: 'docker.configs',
    url: '/configs',
    views: {
      'content@': {
        templateUrl: './views/configs/configs.html',
        controller: 'ConfigsController',
        controllerAs: 'ctrl'
      }
    }
  };

  var config = {
    name: 'docker.configs.config',
    url: '/:id',
    views: {
      'content@': {
        templateUrl: './views/configs/edit/config.html',
        controller: 'ConfigController'
      }
    }
  };

  var configCreation = {
    name: 'docker.configs.new',
    url: '/new?id',
    views: {
      'content@': {
        templateUrl: './views/configs/create/createconfig.html',
        controller: 'CreateConfigController',
        controllerAs: 'ctrl'
      }
    }
  };

  var containers = {
    name: 'docker.containers',
    url: '/containers',
    views: {
      'content@': {
        templateUrl: './views/containers/containers.html',
        controller: 'ContainersController'
      }
    }
  };

  var container = {
    name: 'docker.containers.container',
    url: '/:id?nodeName',
    views: {
      'content@': {
        templateUrl: './views/containers/edit/container.html',
        controller: 'ContainerController'
      }
    }
  };

  var containerAttachConsole = {
    name: 'docker.containers.container.attach',
    url: '/attach',
    views: {
      'content@': {
        templateUrl: './views/containers/console/attach.html',
        controller: 'ContainerConsoleController'
      }
    }
  };

  var containerExecConsole = {
    name: 'docker.containers.container.exec',
    url: '/exec',
    views: {
      'content@': {
        templateUrl: './views/containers/console/exec.html',
        controller: 'ContainerConsoleController'
      }
    }
  };

  var containerCreation = {
    name: 'docker.containers.new',
    url: '/new?nodeName&from',
    views: {
      'content@': {
        templateUrl: './views/containers/create/createcontainer.html',
        controller: 'CreateContainerController'
      }
    }
  };

  var containerInspect = {
    name: 'docker.containers.container.inspect',
    url: '/inspect',
    views: {
      'content@': {
        templateUrl: './views/containers/inspect/containerinspect.html',
        controller: 'ContainerInspectController'
      }
    }
  };

  var containerLogs = {
    name: 'docker.containers.container.logs',
    url: '/logs',
    views: {
      'content@': {
        templateUrl: './views/containers/logs/containerlogs.html',
        controller: 'ContainerLogsController'
      }
    }
  };

  var containerStats = {
    name: 'docker.containers.container.stats',
    url: '/stats',
    views: {
      'content@': {
        templateUrl: './views/containers/stats/containerstats.html',
        controller: 'ContainerStatsController'
      }
    }
  };

  var dashboard = {
    name: 'docker.dashboard',
    url: '/dashboard',
    views: {
      'content@': {
        templateUrl: './views/dashboard/dashboard.html',
        controller: 'DashboardController'
      }
    }
  };

  var host = {
    name: 'docker.host',
    url: '/host',
    views: {
      'content@': {
        component: 'hostView'
      }
    }
  };

  var hostBrowser = {
    name: 'docker.host.browser',
    url: '/browser',
    views: {
      'content@': {
        component: 'hostBrowserView'
      }
    }
  };

  var hostJob = {
    name: 'docker.host.job',
    url: '/job',
    views: {
      'content@': {
        component: 'hostJobView'
      }
    }
  };

  var events = {
    name: 'docker.events',
    url: '/events',
    views: {
      'content@': {
        templateUrl: './views/events/events.html',
        controller: 'EventsController'
      }
    }
  };

  var images = {
    name: 'docker.images',
    url: '/images',
    views: {
      'content@': {
        templateUrl: './views/images/images.html',
        controller: 'ImagesController'
      }
    }
  };

  var image = {
    name: 'docker.images.image',
    url: '/:id?nodeName',
    views: {
      'content@': {
        templateUrl: './views/images/edit/image.html',
        controller: 'ImageController'
      }
    }
  };

  var imageBuild = {
    name: 'docker.images.build',
    url: '/build',
    views: {
      'content@': {
        templateUrl: './views/images/build/buildimage.html',
        controller: 'BuildImageController'
      }
    }
  };

  var imageImport = {
    name: 'docker.images.import',
    url: '/import',
    views: {
      'content@': {
        templateUrl: './views/images/import/importimage.html',
        controller: 'ImportImageController'
      }
    }
  };

  var networks = {
    name: 'docker.networks',
    url: '/networks',
    views: {
      'content@': {
        templateUrl: './views/networks/networks.html',
        controller: 'NetworksController'
      }
    }
  };

  var network = {
    name: 'docker.networks.network',
    url: '/:id?nodeName',
    views: {
      'content@': {
        templateUrl: './views/networks/edit/network.html',
        controller: 'NetworkController'
      }
    }
  };

  var networkCreation = {
    name: 'docker.networks.new',
    url: '/new',
    views: {
      'content@': {
        templateUrl: './views/networks/create/createnetwork.html',
        controller: 'CreateNetworkController'
      }
    }
  };

  var nodes = {
    name: 'docker.nodes',
    url: '/nodes',
    abstract: true
  };

  var node = {
    name: 'docker.nodes.node',
    url: '/:id',
    views: {
      'content@': {
        component: 'nodeDetailsView'
      }
    }
  };

  var nodeBrowser = {
    name: 'docker.nodes.node.browse',
    url: '/browse',
    views: {
      'content@': {
        component: 'nodeBrowserView'
      }
    }
  };

  var nodeJob = {
    name: 'docker.nodes.node.job',
    url: '/job',
    views: {
      'content@': {
        component: 'nodeJobView'
      }
    }
  };

  var secrets = {
    name: 'docker.secrets',
    url: '/secrets',
    views: {
      'content@': {
        templateUrl: './views/secrets/secrets.html',
        controller: 'SecretsController'
      }
    }
  };

  var secret = {
    name: 'docker.secrets.secret',
    url: '/:id',
    views: {
      'content@': {
        templateUrl: './views/secrets/edit/secret.html',
        controller: 'SecretController'
      }
    }
  };

  var secretCreation = {
    name: 'docker.secrets.new',
    url: '/new',
    views: {
      'content@': {
        templateUrl: './views/secrets/create/createsecret.html',
        controller: 'CreateSecretController'
      }
    }
  };

  var services = {
    name: 'docker.services',
    url: '/services',
    views: {
      'content@': {
        templateUrl: './views/services/services.html',
        controller: 'ServicesController'
      }
    }
  };

  var service = {
    name: 'docker.services.service',
    url: '/:id',
    views: {
      'content@': {
        templateUrl: './views/services/edit/service.html',
        controller: 'ServiceController'
      }
    }
  };

  var serviceCreation = {
    name: 'docker.services.new',
    url: '/new',
    views: {
      'content@': {
        templateUrl: './views/services/create/createservice.html',
        controller: 'CreateServiceController'
      }
    }
  };

  var serviceLogs = {
    name: 'docker.services.service.logs',
    url: '/logs',
    views: {
      'content@': {
        templateUrl: './views/services/logs/servicelogs.html',
        controller: 'ServiceLogsController'
      }
    }
  };

  var swarm = {
    name: 'docker.swarm',
    url: '/swarm',
    views: {
      'content@': {
        templateUrl: './views/swarm/swarm.html',
        controller: 'SwarmController'
      }
    }
  };

  var swarmVisualizer = {
    name: 'docker.swarm.visualizer',
    url: '/visualizer',
    views: {
      'content@': {
        templateUrl: './views/swarm/visualizer/swarmvisualizer.html',
        controller: 'SwarmVisualizerController'
      }
    }
  };

  var tasks = {
    name: 'docker.tasks',
    url: '/tasks',
    abstract: true
  };

  var task = {
    name: 'docker.tasks.task',
    url: '/:id',
    views: {
      'content@': {
        templateUrl: './views/tasks/edit/task.html',
        controller: 'TaskController'
      }
    }
  };

  var taskLogs = {
    name: 'docker.tasks.task.logs',
    url: '/logs',
    views: {
      'content@': {
        templateUrl: './views/tasks/logs/tasklogs.html',
        controller: 'TaskLogsController'
      }
    }
  };

  var volumes = {
    name: 'docker.volumes',
    url: '/volumes',
    views: {
      'content@': {
        templateUrl: './views/volumes/volumes.html',
        controller: 'VolumesController'
      }
    }
  };

  var volume = {
    name: 'docker.volumes.volume',
    url: '/:id?nodeName',
    views: {
      'content@': {
        templateUrl: './views/volumes/edit/volume.html',
        controller: 'VolumeController'
      }
    }
  };

  var volumeBrowse = {
    name: 'docker.volumes.volume.browse',
    url: '/browse',
    views: {
      'content@': {
        templateUrl: './views/volumes/browse/browsevolume.html',
        controller: 'BrowseVolumeController'
      }
    }
  };

  var volumeCreation = {
    name: 'docker.volumes.new',
    url: '/new',
    views: {
      'content@': {
        templateUrl: './views/volumes/create/createvolume.html',
        controller: 'CreateVolumeController'
      }
    }
  };



  $stateRegistryProvider.register(configs);
  $stateRegistryProvider.register(config);
  $stateRegistryProvider.register(configCreation);
  $stateRegistryProvider.register(containers);
  $stateRegistryProvider.register(container);
  $stateRegistryProvider.register(containerExecConsole);
  $stateRegistryProvider.register(containerAttachConsole);
  $stateRegistryProvider.register(containerCreation);
  $stateRegistryProvider.register(containerInspect);
  $stateRegistryProvider.register(containerLogs);
  $stateRegistryProvider.register(containerStats);
  $stateRegistryProvider.register(docker);
  $stateRegistryProvider.register(dashboard);
  $stateRegistryProvider.register(host);
  $stateRegistryProvider.register(hostBrowser);
  $stateRegistryProvider.register(hostJob);
  $stateRegistryProvider.register(events);
  $stateRegistryProvider.register(images);
  $stateRegistryProvider.register(image);
  $stateRegistryProvider.register(imageBuild);
  $stateRegistryProvider.register(imageImport);
  $stateRegistryProvider.register(networks);
  $stateRegistryProvider.register(network);
  $stateRegistryProvider.register(networkCreation);
  $stateRegistryProvider.register(nodes);
  $stateRegistryProvider.register(node);
  $stateRegistryProvider.register(nodeBrowser);
  $stateRegistryProvider.register(nodeJob);
  $stateRegistryProvider.register(secrets);
  $stateRegistryProvider.register(secret);
  $stateRegistryProvider.register(secretCreation);
  $stateRegistryProvider.register(services);
  $stateRegistryProvider.register(service);
  $stateRegistryProvider.register(serviceCreation);
  $stateRegistryProvider.register(serviceLogs);
  $stateRegistryProvider.register(swarm);
  $stateRegistryProvider.register(swarmVisualizer);
  $stateRegistryProvider.register(tasks);
  $stateRegistryProvider.register(task);
  $stateRegistryProvider.register(taskLogs);
  $stateRegistryProvider.register(volumes);
  $stateRegistryProvider.register(volume);
  $stateRegistryProvider.register(volumeBrowse);
  $stateRegistryProvider.register(volumeCreation);
}]);