/**
 * @flow
 * AndroidRemoteInput representation wrapper
 */

import type { AndroidAllowDataType, NativeAndroidRemoteInput } from './types';

export default class AndroidRemoteInput {
  _allowedDataTypes: AndroidAllowDataType[];
  _allowFreeFormInput: boolean | void;
  _choices: string[];
  _label: string | void;
  _resultKey: string;

  constructor(resultKey: string) {
    this._allowedDataTypes = [];
    this._choices = [];
    this._resultKey = resultKey;
  }

  get allowedDataTypes(): AndroidAllowDataType[] {
    return this._allowedDataTypes;
  }

  get allowFreeFormInput(): ?boolean {
    return this._allowFreeFormInput;
  }

  get choices(): string[] {
    return this._choices;
  }

  get label(): ?string {
    return this._label;
  }

  get resultKey(): string {
    return this._resultKey;
  }

  /**
   *
   * @param mimeType
   * @param allow
   * @returns {AndroidRemoteInput}
   */
  setAllowDataType(mimeType: string, allow: boolean): AndroidRemoteInput {
    this._allowedDataTypes.push({
      allow,
      mimeType,
    });
    return this;
  }

  /**
   *
   * @param allowFreeFormInput
   * @returns {AndroidRemoteInput}
   */
  setAllowFreeFormInput(allowFreeFormInput: boolean): AndroidRemoteInput {
    this._allowFreeFormInput = allowFreeFormInput;
    return this;
  }

  /**
   *
   * @param choices
   * @returns {AndroidRemoteInput}
   */
  setChoices(choices: string[]): AndroidRemoteInput {
    this._choices = choices;
    return this;
  }

  /**
   *
   * @param label
   * @returns {AndroidRemoteInput}
   */
  setLabel(label: string): AndroidRemoteInput {
    this._label = label;
    return this;
  }

  build(): NativeAndroidRemoteInput {
    if (!this._resultKey) {
      throw new Error(
        'AndroidRemoteInput: Missing required `resultKey` property'
      );
    }

    return {
      allowedDataTypes: this._allowedDataTypes,
      allowFreeFormInput: this._allowFreeFormInput,
      choices: this._choices,
      label: this._label,
      resultKey: this._resultKey,
    };
  }
}

export const fromNativeAndroidRemoteInput = (
  nativeRemoteInput: NativeAndroidRemoteInput
): AndroidRemoteInput => {
  const remoteInput = new AndroidRemoteInput(nativeRemoteInput.resultKey);
  if (nativeRemoteInput.allowedDataTypes) {
    for (let i = 0; i < nativeRemoteInput.allowedDataTypes.length; i++) {
      const allowDataType = nativeRemoteInput.allowedDataTypes[i];
      remoteInput.setAllowDataType(allowDataType.mimeType, allowDataType.allow);
    }
  }
  if (nativeRemoteInput.allowFreeFormInput) {
    remoteInput.setAllowFreeFormInput(nativeRemoteInput.allowFreeFormInput);
  }
  if (nativeRemoteInput.choices) {
    remoteInput.setChoices(nativeRemoteInput.choices);
  }
  if (nativeRemoteInput.label) {
    remoteInput.setLabel(nativeRemoteInput.label);
  }

  return remoteInput;
};
