/*
 * 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.
 */

import { ModuleWithProviders } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';

import { LoginComponent } from './login/login.module';
import { LayoutComponent } from './layout/layout.component'
import { ResourcesComponent } from './resources/resources.component';
import { AccessNotebookGuideComponent, PublicKeyGuideComponent } from './help';
import { NotFoundComponent } from './service-pages/not-found/not-found.component';
import { AccessDeniedComponent } from './service-pages/access-denied/access-denied.component';
import { ReportingComponent } from './reporting/reporting.component';
import { WebterminalComponent } from './webterminal/webterminal.component';
import { ManagementComponent } from './administration/management/management.component';
import { ProjectComponent } from './administration/project/project.component';
import { RolesComponent } from './administration/roles/roles.component';
import { SwaggerComponent } from './swagger/swagger.component';

import { AuthorizationGuard, CheckParamsGuard, CloudProviderGuard, AdminGuard } from './core/services';

const routes: Routes = [{
  path: 'login',
  component: LoginComponent
}, {
  path: '',
  canActivate: [CheckParamsGuard],
  component: LayoutComponent,
  children: [
    {
      path: '',
      redirectTo: 'resources_list',
      pathMatch: 'full'
    }, {
      path: 'resources_list',
      component: ResourcesComponent,
      canActivate: [AuthorizationGuard]
    }, {
      path: 'billing_report',
      component: ReportingComponent,
      canActivate: [AuthorizationGuard, CloudProviderGuard]
    }, {
      path: 'projects',
      component: ProjectComponent,
      canActivate: [AuthorizationGuard, AdminGuard],
    }, {
      path: 'roles',
      component: RolesComponent,
      canActivate: [AuthorizationGuard, AdminGuard],
    }, {
      path: 'environment_management',
      component: ManagementComponent,
      canActivate: [AuthorizationGuard, AdminGuard]
    }, {
      path: 'swagger',
      component: SwaggerComponent,
      canActivate: [AuthorizationGuard]
    }, {
      path: 'help/publickeyguide',
      component: PublicKeyGuideComponent,
      canActivate: [AuthorizationGuard]
    }, {
      path: 'help/accessnotebookguide',
      component: AccessNotebookGuideComponent,
      canActivate: [AuthorizationGuard]
    }
  ]
}, {
  path: 'terminal/:id/:endpoint',
  component: WebterminalComponent
}, {
  path: '403',
  component: AccessDeniedComponent,
  canActivate: [AuthorizationGuard]
}, {
  path: '**',
  component: NotFoundComponent
}];

export const AppRoutingModule: ModuleWithProviders = RouterModule.forRoot(routes, { useHash: true });
