/**
 * 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';

/**
 * YouTube Reporting API
 *
 * Schedules reporting jobs containing your YouTube Analytics data and downloads the resulting bulk data reports in the form of CSV files.
 *
 * @example
 * const google = require('webdura_googleapi_marketing');
 * const youtubereporting = google.youtubereporting('v1');
 *
 * @namespace youtubereporting
 * @type {Function}
 * @version v1
 * @variation v1
 * @param {object=} options Options for Youtubereporting
 */
function Youtubereporting(options) { // eslint-disable-line
  const self = this;
  self._options = options || {};

  self.jobs = {

    /**
     * youtubereporting.jobs.create
     *
     * @desc Creates a job and returns it.
     *
     * @alias youtubereporting.jobs.create
     * @memberOf! youtubereporting(v1)
     *
     * @param {object} params Parameters for request
     * @param {string=} params.onBehalfOfContentOwner The content owner's external ID on which behalf the user is acting on. If not set, the user is acting for himself (his own channel).
     * @param {youtubereporting(v1).Job} params.resource Request body data
     * @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
     */
    create: function (params, options, callback) {
      if (typeof options === 'function') {
        callback = options;
        options = {};
      }
      options || (options = {});

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

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

      return createAPIRequest(parameters, callback);
    },

    /**
     * youtubereporting.jobs.delete
     *
     * @desc Deletes a job.
     *
     * @alias youtubereporting.jobs.delete
     * @memberOf! youtubereporting(v1)
     *
     * @param {object} params Parameters for request
     * @param {string} params.jobId The ID of the job to delete.
     * @param {string=} params.onBehalfOfContentOwner The content owner's external ID on which behalf the user is acting on. If not set, the user is acting for himself (his own channel).
     * @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
     */
    delete: function (params, options, callback) {
      if (typeof options === 'function') {
        callback = options;
        options = {};
      }
      options || (options = {});

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

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

      return createAPIRequest(parameters, callback);
    },

    /**
     * youtubereporting.jobs.get
     *
     * @desc Gets a job.
     *
     * @alias youtubereporting.jobs.get
     * @memberOf! youtubereporting(v1)
     *
     * @param {object} params Parameters for request
     * @param {string} params.jobId The ID of the job to retrieve.
     * @param {string=} params.onBehalfOfContentOwner The content owner's external ID on which behalf the user is acting on. If not set, the user is acting for himself (his own channel).
     * @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
     */
    get: function (params, options, callback) {
      if (typeof options === 'function') {
        callback = options;
        options = {};
      }
      options || (options = {});

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

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

      return createAPIRequest(parameters, callback);
    },

    /**
     * youtubereporting.jobs.list
     *
     * @desc Lists jobs.
     *
     * @alias youtubereporting.jobs.list
     * @memberOf! youtubereporting(v1)
     *
     * @param {object} params Parameters for request
     * @param {boolean=} params.includeSystemManaged If set to true, also system-managed jobs will be returned; otherwise only user-created jobs will be returned. System-managed jobs can neither be modified nor deleted.
     * @param {string=} params.onBehalfOfContentOwner The content owner's external ID on which behalf the user is acting on. If not set, the user is acting for himself (his own channel).
     * @param {integer=} params.pageSize Requested page size. Server may return fewer jobs than requested. If unspecified, server will pick an appropriate default.
     * @param {string=} params.pageToken A token identifying a page of results the server should return. Typically, this is the value of ListReportTypesResponse.next_page_token returned in response to the previous call to the `ListJobs` method.
     * @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://youtubereporting.googleapis.com/';

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

      return createAPIRequest(parameters, callback);
    },
    reports: {

      /**
       * youtubereporting.jobs.reports.get
       *
       * @desc Gets the metadata of a specific report.
       *
       * @alias youtubereporting.jobs.reports.get
       * @memberOf! youtubereporting(v1)
       *
       * @param {object} params Parameters for request
       * @param {string} params.jobId The ID of the job.
       * @param {string=} params.onBehalfOfContentOwner The content owner's external ID on which behalf the user is acting on. If not set, the user is acting for himself (his own channel).
       * @param {string} params.reportId The ID of the report to retrieve.
       * @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
       */
      get: function (params, options, callback) {
        if (typeof options === 'function') {
          callback = options;
          options = {};
        }
        options || (options = {});

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

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

        return createAPIRequest(parameters, callback);
      },

      /**
       * youtubereporting.jobs.reports.list
       *
       * @desc Lists reports created by a specific job. Returns NOT_FOUND if the job does not exist.
       *
       * @alias youtubereporting.jobs.reports.list
       * @memberOf! youtubereporting(v1)
       *
       * @param {object} params Parameters for request
       * @param {string=} params.createdAfter If set, only reports created after the specified date/time are returned.
       * @param {string} params.jobId The ID of the job.
       * @param {string=} params.onBehalfOfContentOwner The content owner's external ID on which behalf the user is acting on. If not set, the user is acting for himself (his own channel).
       * @param {integer=} params.pageSize Requested page size. Server may return fewer report types than requested. If unspecified, server will pick an appropriate default.
       * @param {string=} params.pageToken A token identifying a page of results the server should return. Typically, this is the value of ListReportsResponse.next_page_token returned in response to the previous call to the `ListReports` method.
       * @param {string=} params.startTimeAtOrAfter If set, only reports whose start time is greater than or equal the specified date/time are returned.
       * @param {string=} params.startTimeBefore If set, only reports whose start time is smaller than the specified date/time are returned.
       * @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://youtubereporting.googleapis.com/';

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

        return createAPIRequest(parameters, callback);
      }
    }
  };

  self.media = {

    /**
     * youtubereporting.media.download
     *
     * @desc Method for media download. Download is supported on the URI `/v1/media/{+name}?alt=media`.
     *
     * @alias youtubereporting.media.download
     * @memberOf! youtubereporting(v1)
     *
     * @param {object} params Parameters for request
     * @param {string} params.resourceName Name of the media that is being downloaded.  See ReadRequest.resource_name.
     * @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
     */
    download: function (params, options, callback) {
      if (typeof options === 'function') {
        callback = options;
        options = {};
      }
      options || (options = {});

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

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

      return createAPIRequest(parameters, callback);
    }

  };

  self.reportTypes = {

    /**
     * youtubereporting.reportTypes.list
     *
     * @desc Lists report types.
     *
     * @alias youtubereporting.reportTypes.list
     * @memberOf! youtubereporting(v1)
     *
     * @param {object} params Parameters for request
     * @param {boolean=} params.includeSystemManaged If set to true, also system-managed report types will be returned; otherwise only the report types that can be used to create new reporting jobs will be returned.
     * @param {string=} params.onBehalfOfContentOwner The content owner's external ID on which behalf the user is acting on. If not set, the user is acting for himself (his own channel).
     * @param {integer=} params.pageSize Requested page size. Server may return fewer report types than requested. If unspecified, server will pick an appropriate default.
     * @param {string=} params.pageToken A token identifying a page of results the server should return. Typically, this is the value of ListReportTypesResponse.next_page_token returned in response to the previous call to the `ListReportTypes` method.
     * @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://youtubereporting.googleapis.com/';

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

      return createAPIRequest(parameters, callback);
    }

  };
}

/**
 * @typedef Empty
 * @memberOf! youtubereporting(v1)
 * @type object
 */

/**
 * @typedef Job
 * @memberOf! youtubereporting(v1)
 * @type object
* @property {string} createTime The creation date/time of the job.
* @property {string} expireTime The date/time when this job will expire/expired. After a job expired, no
new reports are generated.
* @property {string} id The server-generated ID of the job (max. 40 characters).
* @property {string} name The name of the job (max. 100 characters).
* @property {string} reportTypeId The type of reports this job creates. Corresponds to the ID of a
ReportType.
* @property {boolean} systemManaged True if this a system-managed job that cannot be modified by the user;
otherwise false.
*/

/**
 * @typedef ListJobsResponse
 * @memberOf! youtubereporting(v1)
 * @type object
* @property {youtubereporting(v1).Job[]} jobs The list of jobs.
* @property {string} nextPageToken A token to retrieve next page of results.
Pass this value in the
ListJobsRequest.page_token
field in the subsequent call to `ListJobs` method to retrieve the next
page of results.
*/

/**
 * @typedef ListReportTypesResponse
 * @memberOf! youtubereporting(v1)
 * @type object
* @property {string} nextPageToken A token to retrieve next page of results.
Pass this value in the
ListReportTypesRequest.page_token
field in the subsequent call to `ListReportTypes` method to retrieve the next
page of results.
* @property {youtubereporting(v1).ReportType[]} reportTypes The list of report types.
*/

/**
 * @typedef ListReportsResponse
 * @memberOf! youtubereporting(v1)
 * @type object
* @property {string} nextPageToken A token to retrieve next page of results.
Pass this value in the
ListReportsRequest.page_token
field in the subsequent call to `ListReports` method to retrieve the next
page of results.
* @property {youtubereporting(v1).Report[]} reports The list of report types.
*/

/**
 * @typedef Media
 * @memberOf! youtubereporting(v1)
 * @type object
 * @property {string} resourceName Name of the media resource.
 */

/**
 * @typedef Report
 * @memberOf! youtubereporting(v1)
 * @type object
* @property {string} createTime The date/time when this report was created.
* @property {string} downloadUrl The URL from which the report can be downloaded (max. 1000 characters).
* @property {string} endTime The end of the time period that the report instance covers. The value is
exclusive.
* @property {string} id The server-generated ID of the report.
* @property {string} jobExpireTime The date/time when the job this report belongs to will expire/expired.
* @property {string} jobId The ID of the job that created this report.
* @property {string} startTime The start of the time period that the report instance covers. The value is
inclusive.
*/

/**
 * @typedef ReportType
 * @memberOf! youtubereporting(v1)
 * @type object
* @property {string} deprecateTime The date/time when this report type was/will be deprecated.
* @property {string} id The ID of the report type (max. 100 characters).
* @property {string} name The name of the report type (max. 100 characters).
* @property {boolean} systemManaged True if this a system-managed report type; otherwise false. Reporting jobs
for system-managed report types are created automatically and can thus not
be used in the `CreateJob` method.
*/
export = Youtubereporting;
