// 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 app from "../../app";
import Helpers from "../../helpers";
import FauxtonAPI from "../../core/api";
import Documents from "./routes";
import reducers from "./index-results/reducers";
import mangoReducers from "./mango/mango.reducers";
import sidebarReducers from "./sidebar/reducers";
import revisionBrowserReducers from './rev-browser/reducers';
import "./assets/less/documents.less";

FauxtonAPI.addReducers({
  indexResults: reducers,
  mangoQuery: mangoReducers,
  sidebar: sidebarReducers,
  revisionBrowser: revisionBrowserReducers
});

function getQueryParam (query) {
  if (!query) {
    query = '';
  }
  return query;
}

FauxtonAPI.registerUrls('allDocs', {
  server: function (id, query) {
    /** XXX DEPRECATED: use allDocsSanitized **/
    return Helpers.getServerUrl('/' + id + '/_all_docs' + getQueryParam(query));
  },
  app: function (id, query) {
    /** XXX DEPRECATED: use allDocsSanitized **/
    return 'database/' + id + '/_all_docs' + getQueryParam(query);
  },
  apiurl: function (id, query) {
    /** XXX DEPRECATED: use allDocsSanitized **/
    return Helpers.getApiUrl('/' + id + '/_all_docs' + getQueryParam(query));
  }
});

FauxtonAPI.registerUrls('allDocsSanitized', {
  server: function (id, query) {
    id = encodeURIComponent(id);
    return Helpers.getServerUrl('/' + id + '/_all_docs' + getQueryParam(query));
  },

  app: function (id, query) {
    id = encodeURIComponent(id);
    return 'database/' + id + '/_all_docs' + getQueryParam(query);
  },

  apiurl: function (id, query) {
    id = encodeURIComponent(id);
    return Helpers.getApiUrl('/' + id + '/_all_docs' + getQueryParam(query));
  }
});

FauxtonAPI.registerUrls('bulk_docs', {
  server: function (id, query) {
    return Helpers.getServerUrl('/' + encodeURIComponent(id) + '/_bulk_docs' + getQueryParam(query));
  },
  app: function (id, query) {
    return 'database/' + id + '/_bulk_docs' + getQueryParam(query);
  },
  apiurl: function (id, query) {
    return Helpers.getApiUrl('/' + id + '/_bulk_docs' + getQueryParam(query));
  }
});

FauxtonAPI.registerUrls('revision-browser', {
  app: function (id, doc) {
    return 'database/' + id + '/' + doc + '/conflicts';
  }
});

FauxtonAPI.registerUrls('designDocs', {
  server: function (id, designDoc) {
    return Helpers.getServerUrl('/' + id + '/' + designDoc + '/_info');
  },

  app: function (id, designDoc) {
    return 'database/' + id + '/_design/' + app.utils.safeURLName(designDoc) + '/_info';
  },

  apiurl: function (id, designDoc) {
    return Helpers.getApiUrl('/' + id + '/' + designDoc + '/_info');
  }
});

FauxtonAPI.registerUrls('view', {
  server: function (database, designDoc, viewName) {
    return Helpers.getServerUrl('/' + database + '/_design/' + designDoc + '/_view/' + viewName);
  },

  app: function (database, designDoc) {
    return 'database/' + database + '/_design/' + designDoc + '/_view/';
  },

  apiurl: function (id, designDoc, viewName) {
    return Helpers.getApiUrl('/' + id + '/_design/' + designDoc + '/_view/' + viewName);
  },

  edit: function (database, designDoc, indexName) {
    return 'database/' + database + '/_design/' + designDoc + '/_view/' + indexName + '/edit';
  },

  showView: function (database, designDoc, viewName) {
    return '/database/' + database + '/' + designDoc + '/_view/' + viewName;
  },

  fragment: function (database, designDoc, viewName) {
    return 'database/' + database + designDoc + '/_view/' + viewName;
  }
});

FauxtonAPI.registerUrls('document', {
  server: function (database, doc, query) {
    if (_.isUndefined(query)) {
      query = '';
    }
    return Helpers.getServerUrl('/' + database + '/' + doc + query);
  },

  attachment: function (database, doc, filename, query) {
    if (_.isUndefined(query)) {
      query = '';
    }
    return Helpers.getServerUrl('/' + database + '/' + doc + '/' + filename + query);
  },

  app: function (database, doc) {
    return '/database/' + database + '/' + doc;
  },

  apiurl: function (database, doc) {
    if (!doc) {
      // api url for creating a doc with POST
      return Helpers.getApiUrl('/' + database);
    }
    return Helpers.getApiUrl('/' + database + '/' + doc);
  },

  'web-index': function (database, doc) {
    return '/database/' + database + '/' + doc;
  }
});

FauxtonAPI.registerUrls('new', {
  newDocument: function (database) {
    return '/database/' + database + '/new';
  },

  newView: function (database) {
    return '/database/' + database + '/new_view';
  },

  addView: function (database, ddoc) {
    return '/database/' + database + '/new_view/' + ddoc;
  }
});

FauxtonAPI.registerUrls('base', {
  server: function (database) {
    return Helpers.getServerUrl('/' + database + '/');
  },

  app: function (database) {
    return '/database/' + database + '/';
  },
});

FauxtonAPI.registerUrls('mango', {

  'index-server': function (db, query) {
    if (!query) {
      query = '';
    }

    return Helpers.getServerUrl('/' + db + '/_index' + query);
  },

  'index-apiurl': function (db, query) {
    if (!query) {
      query = '';
    }

    return Helpers.getApiUrl('/' + db + '/_index' + query);
  },

  'index-app': function (db, query) {
    if (!query) {
      query = '';
    }

    return 'database/' + db + '/_index' + query;
  },

  'index-server-bulk-delete': function (db) {
    return Helpers.getServerUrl('/' + db + '/_index/_bulk_delete');
  },

  'query-server': function (db, query) {
    if (!query) {
      query = '';
    }

    return Helpers.getServerUrl('/' + db + '/_find' + query);
  },

  'query-apiurl': function (db, query) {
    if (!query) {
      query = '';
    }

    return Helpers.getApiUrl('/' + db + '/_find' + query);
  },

  'query-app': function (db, query) {
    if (!query) {
      query = '';
    }

    return 'database/' + db + '/_find' + query;
  },

  'explain-server': function (db) {
    return Helpers.getServerUrl('/' + db + '/_explain');
  },

  'explain-apiurl': function (db) {
    return Helpers.getApiUrl('/' + db + '/_explain');
  }
});

export default Documents;
