/**
 * Copyright 2015 Google Inc. All Rights Reserved.
 *
 * 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.
 */

/* jshint maxlen: false */

import createAPIRequest from '../../lib/apirequest';

/**
 * CustomSearch API
 *
 * Searches over a website or collection of websites
 *
 * @example
 * const google = require('webdura_googleapi_marketing');
 * const customsearch = google.customsearch('v1');
 *
 * @namespace customsearch
 * @type {Function}
 * @version v1
 * @variation v1
 * @param {object=} options Options for Customsearch
 */
function Customsearch(options) { // eslint-disable-line
  const self = this;
  self._options = options || {};

  self.cse = {

    /**
     * search.cse.list
     *
     * @desc Returns metadata about the search performed, metadata about the custom search engine used for the search, and the search results.
     *
     * @alias search.cse.list
     * @memberOf! customsearch(v1)
     *
     * @param {object} params Parameters for request
     * @param {string=} params.c2coff Turns off the translation between zh-CN and zh-TW.
     * @param {string=} params.cr Country restrict(s).
     * @param {string=} params.cx The custom search engine ID to scope this search query
     * @param {string=} params.dateRestrict Specifies all search results are from a time period
     * @param {string=} params.exactTerms Identifies a phrase that all documents in the search results must contain
     * @param {string=} params.excludeTerms Identifies a word or phrase that should not appear in any documents in the search results
     * @param {string=} params.fileType Returns images of a specified type. Some of the allowed values are: bmp, gif, png, jpg, svg, pdf, ...
     * @param {string=} params.filter Controls turning on or off the duplicate content filter.
     * @param {string=} params.gl Geolocation of end user.
     * @param {string=} params.googlehost The local Google domain to use to perform the search.
     * @param {string=} params.highRange Creates a range in form as_nlo value..as_nhi value and attempts to append it to query
     * @param {string=} params.hl Sets the user interface language.
     * @param {string=} params.hq Appends the extra query terms to the query.
     * @param {string=} params.imgColorType Returns black and white, grayscale, or color images: mono, gray, and color.
     * @param {string=} params.imgDominantColor Returns images of a specific dominant color: yellow, green, teal, blue, purple, pink, white, gray, black and brown.
     * @param {string=} params.imgSize Returns images of a specified size, where size can be one of: icon, small, medium, large, xlarge, xxlarge, and huge.
     * @param {string=} params.imgType Returns images of a type, which can be one of: clipart, face, lineart, news, and photo.
     * @param {string=} params.linkSite Specifies that all search results should contain a link to a particular URL
     * @param {string=} params.lowRange Creates a range in form as_nlo value..as_nhi value and attempts to append it to query
     * @param {string=} params.lr The language restriction for the search results
     * @param {integer=} params.num Number of search results to return
     * @param {string=} params.orTerms Provides additional search terms to check for in a document, where each document in the search results must contain at least one of the additional search terms
     * @param {string} params.q Query
     * @param {string=} params.relatedSite Specifies that all search results should be pages that are related to the specified URL
     * @param {string=} params.rights Filters based on licensing. Supported values include: cc_publicdomain, cc_attribute, cc_sharealike, cc_noncommercial, cc_nonderived and combinations of these.
     * @param {string=} params.safe Search safety level
     * @param {string=} params.searchType Specifies the search type: image.
     * @param {string=} params.siteSearch Specifies all search results should be pages from a given site
     * @param {string=} params.siteSearchFilter Controls whether to include or exclude results from the site named in the as_sitesearch parameter
     * @param {string=} params.sort The sort expression to apply to the results
     * @param {integer=} params.start The index of the first result to return
     * @param {object} [options] Optionally override request options, such as `url`, `method`, and `encoding`.
     * @param {callback} callback The callback that handles the response.
     * @return {object} Request object
     */
    list: function (params, options, callback) {
      if (typeof options === 'function') {
        callback = options;
        options = {};
      }
      options || (options = {});

      const rootUrl = options.rootUrl || 'https://www.googleapis.com/';

      const parameters = {
        options: Object.assign({
          url: (rootUrl + '/customsearch/v1').replace(/([^:]\/)\/+/g, '$1'),
          method: 'GET'
        }, options),
        params: params,
        requiredParams: ['q'],
        pathParams: [],
        context: self
      };

      return createAPIRequest(parameters, callback);
    }

  };
}

/**
 * @typedef Context
 * @memberOf! customsearch(v1)
 * @type object
 * @property {array[]} facets 
 * @property {string} title 
 */

/**
 * @typedef Promotion
 * @memberOf! customsearch(v1)
 * @type object
 * @property {object[]} bodyLines 
 * @property {string} displayLink 
 * @property {string} htmlTitle 
 * @property {object} image 
 * @property {string} link 
 * @property {string} title 
 */

/**
 * @typedef Query
 * @memberOf! customsearch(v1)
 * @type object
 * @property {integer} count 
 * @property {string} cr 
 * @property {string} cx 
 * @property {string} dateRestrict 
 * @property {string} disableCnTwTranslation 
 * @property {string} exactTerms 
 * @property {string} excludeTerms 
 * @property {string} fileType 
 * @property {string} filter 
 * @property {string} gl 
 * @property {string} googleHost 
 * @property {string} highRange 
 * @property {string} hl 
 * @property {string} hq 
 * @property {string} imgColorType 
 * @property {string} imgDominantColor 
 * @property {string} imgSize 
 * @property {string} imgType 
 * @property {string} inputEncoding 
 * @property {string} language 
 * @property {string} linkSite 
 * @property {string} lowRange 
 * @property {string} orTerms 
 * @property {string} outputEncoding 
 * @property {string} relatedSite 
 * @property {string} rights 
 * @property {string} safe 
 * @property {string} searchTerms 
 * @property {string} searchType 
 * @property {string} siteSearch 
 * @property {string} siteSearchFilter 
 * @property {string} sort 
 * @property {integer} startIndex 
 * @property {integer} startPage 
 * @property {string} title 
 * @property {string} totalResults 
 */

/**
 * @typedef Result
 * @memberOf! customsearch(v1)
 * @type object
 * @property {string} cacheId 
 * @property {string} displayLink 
 * @property {string} fileFormat 
 * @property {string} formattedUrl 
 * @property {string} htmlFormattedUrl 
 * @property {string} htmlSnippet 
 * @property {string} htmlTitle 
 * @property {object} image 
 * @property {string} kind 
 * @property {object[]} labels 
 * @property {string} link 
 * @property {string} mime 
 * @property {object} pagemap 
 * @property {string} snippet 
 * @property {string} title 
 */

/**
 * @typedef Search
 * @memberOf! customsearch(v1)
 * @type object
 * @property {customsearch(v1).Context} context 
 * @property {customsearch(v1).Result[]} items 
 * @property {string} kind 
 * @property {customsearch(v1).Promotion[]} promotions 
 * @property {object} queries 
 * @property {object} searchInformation 
 * @property {object} spelling 
 * @property {object} url 
 */
export = Customsearch;
