let axios = require('axios');

class BaseClient {
  /**
   * Initialize a specific client.
   * @param {string} apiKey client specific api key
   * @param {string} baseUrl client specific base url
     */
  constructor(apiKey, baseUrl) {
    if (!apiKey) {
      throw new Error('API Key not provided.');
    }

    this._apiKey = apiKey;

    this._httpManager = axios.create({
      baseURL: baseUrl
    });
  }

  get authParam() {
    throw new Error('Not implemented');
  }

  get httpManager() {
    return this._httpManager;
  }

  get requestKeyMap() {
    throw new Error('Not implemented');
  }

  /**
   * Get a movie by looking up using different params (e.g. title, imdb id, year etc.)
   * @param {object} options
   */
  get(options) {
    throw new Error('Not implemented');
  }

  /**
   * Search for a movie.
   * @param {object} options
   */
  search(options) {
    throw new Error('Not implemented');
  }

  _makeHTTPGET(url, params, headers, responseTransformer) {
    let paramsWithAuth = Object.assign({}, params);
    paramsWithAuth[this.authParam] = this._apiKey;

    let responseTransformers = [JSON.parse];
    if (responseTransformer) {
      responseTransformers.push(responseTransformer);
    }

    return this.httpManager({
      method: 'get',
      url: url,
      params: paramsWithAuth,
      headers: headers,
      transformResponse: responseTransformers
    });
  }

  _translateIncomingRequestOptions(options) {
    let translated = {};
    Object.keys(options).forEach((key) => {
      if (options[key] && this.requestKeyMap[key]) {
        translated[this.requestKeyMap[key]] = options[key];
      }
    });
    return translated;
  }
}

module.exports = BaseClient;