content: // Licensed 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 React from 'react';
  import FauxtonAPI from '../../core/api';
  import BaseRoute from './shared-routes';
  import DatabaseActions from '../databases/actions';
  import Databases from '../databases/base';
  import Resources from './resources';
  import {SidebarItemSelection} from './sidebar/helpers';
  import ComponentsActions from '../components/actions';
  import {DocsTabsSidebarLayout, ViewsTabsSidebarLayout, ChangesSidebarLayout} from './layouts';
  
  var DocumentsRouteObject = BaseRoute.extend({
    routes: {
      "database/:database/_partition/:partitionkey/_all_docs": {
        route: "partitionedAllDocs",
        roles: ["fx_loggedIn"]
      },
      "database/:database/_all_docs(:extra)": {
        route: "globalAllDocs",
        roles: ["fx_loggedIn"]
      },
      "database/:database/_partition/:partitionkey/_design/:ddoc/_info": {
        route: "designDocMetadata",
        roles: ['fx_loggedIn']
      },
      "database/:database/_design/:ddoc/_info": {
        route: "designDocMetadataNoPartition",
        roles: ['fx_loggedIn']
      },
      'database/:database/_partition/:partitionKey/_changes': {
        route: 'changes',
        roles: ['fx_loggedIn']
      },
      'database/:database/_changes': {
        route: 'changes',
        roles: ['fx_loggedIn']
      }
    },
  
    initialize (route, options) {
      this.initViews(options[0]);
    },
  
    initViews: function (dbName) {
      this.databaseName = dbName;
      this.database = new Databases.Model({id: this.databaseName});
  
      this.createDesignDocsCollection();
  
      this.addSidebar();
    },
  
    designDocMetadataNoPartition: function (database, ddoc) {
      return this.designDocMetadata(database, '', ddoc);
    },
  
    designDocMetadata: function (database, partitionKey, ddoc) {
      const designDocInfo = new Resources.DdocInfo({ _id: "_design/" + ddoc }, { database: this.database });
      const selectedNavItem = new SidebarItemSelection('designDoc', {
        designDocName: ddoc,
        designDocSection: 'metadata'
      });
      DatabaseActions.fetchSelectedDatabaseInfo(database);
      const dropDownLinks = this.getCrumbs(this.database);
      return <ViewsTabsSidebarLayout
        showEditView={false}
        docURL={designDocInfo.documentation()}
        endpoint={designDocInfo.url('apiurl')}
        dbName={this.database.id}
        dropDownLinks={dropDownLinks}
        database={this.database}
        selectedNavItem={selectedNavItem}
        designDocInfo={designDocInfo}
        partitionKey={partitionKey}
      />;
    },
  
    globalAllDocs: function (databaseName, options) {
      return this.allDocs(databaseName, '', options);
    },
  
    partitionedAllDocs: function (databaseName, partitionKey) {
      return this.allDocs(databaseName, partitionKey);
    },
  
    /*
    * docParams are the options fauxton uses to fetch from the server
    * urlParams are what are shown in the url and to the user
    * They are not the same when paginating
    */
    allDocs: function (databaseName, partitionKey, options) {
      const params = this.createParams(options);
      const docParams = params.docParams;
  
      const url = partitionKey ?
        FauxtonAPI.urls('partitioned_allDocs', 'server', encodeURIComponent(databaseName), encodeURIComponent(partitionKey)) :
        FauxtonAPI.urls('allDocsSanitized', 'server', databaseName);
  
      // this is used for the header and sidebar
      this.database.buildAllDocs(docParams);
  
      const onlyShowDdocs = !!(docParams.startkey && docParams.startkey.indexOf("_design") > -1);
      let tab = 'all-docs';
      if (onlyShowDdocs) {
        tab = 'design-docs';
      }
  
      const selectedNavItem = new SidebarItemSelection(tab);
      ComponentsActions.showDeleteDatabaseModal({showDeleteModal: false, dbId: ''});
  
      const endpoint = partitionKey ?
        FauxtonAPI.urls('partitioned_allDocs', 'apiurl', encodeURIComponent(databaseName), encodeURIComponent(partitionKey)) :
        this.database.allDocs.urlRef("apiurl", {});
      const docURL = FauxtonAPI.constants.DOC_URLS.GENERAL;
      const navigateToPartitionedAllDocs = (partKey) => {
        const baseUrl = FauxtonAPI.urls('partitioned_allDocs', 'app', encodeURIComponent(databaseName),
          encodeURIComponent(partKey));
        FauxtonAPI.navigate('#/' + baseUrl);
      };
      const navigateToGlobalAllDocs = () => {
        const baseUrl = FauxtonAPI.urls('allDocs', 'app', encodeURIComponent(databaseName));
        FauxtonAPI.navigate('#/' + baseUrl);
      };
      const dropDownLinks = this.getCrumbs(this.database);
      DatabaseActions.fetchSelectedDatabaseInfo(databaseName);
      return <DocsTabsSidebarLayout
        docURL={docURL}
        endpoint={endpoint}
        dbName={this.database.id}
        dropDownLinks={dropDownLinks}
        database={this.database}
        designDocs={this.designDocs}
        fetchUrl={url}
        ddocsOnly={onlyShowDdocs}
        selectedNavItem={selectedNavItem}
        partitionKey={partitionKey}
        onPartitionKeySelected={navigateToPartitionedAllDocs}
        onGlobalModeSelected={navigateToGlobalAllDocs}
        globalMode={partitionKey === ''}
      />;
    },
  
    changes: function (databaseName, partitionKey) {
      const selectedNavItem = new SidebarItemSelection('changes');
      DatabaseActions.fetchSelectedDatabaseInfo(databaseName);
  
      return <ChangesSidebarLayout
        endpoint={FauxtonAPI.urls('changes', 'apiurl', this.database.id, '')}
        docURL={this.database.documentation()}
        dbName={this.database.id}
        dropDownLinks={this.getCrumbs(this.database)}
        database={this.database}
        selectedNavItem={selectedNavItem}
        partitionKey={partitionKey}
      />;
    }
  
  });
  
  export default DocumentsRouteObject;
  