"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = exports.LANGUAGES = void 0;

function _has() {
  const data = _interopRequireDefault(require("lodash/has"));

  _has = function () {
    return data;
  };

  return data;
}

function _pick() {
  const data = _interopRequireDefault(require("lodash/pick"));

  _pick = function () {
    return data;
  };

  return data;
}

function _intersection() {
  const data = _interopRequireDefault(require("lodash/intersection"));

  _intersection = function () {
    return data;
  };

  return data;
}

function _chalk() {
  const data = _interopRequireDefault(require("chalk"));

  _chalk = function () {
    return data;
  };

  return data;
}

function _xdl() {
  const data = require("@expo/xdl");

  _xdl = function () {
    return data;
  };

  return data;
}

function _BaseUploader() {
  const data = _interopRequireDefault(require("./BaseUploader"));

  _BaseUploader = function () {
    return data;
  };

  return data;
}

function _log() {
  const data = _interopRequireDefault(require("../../log"));

  _log = function () {
    return data;
  };

  return data;
}

function _prompt() {
  const data = _interopRequireDefault(require("../../prompt"));

  _prompt = function () {
    return data;
  };

  return data;
}

function _utils() {
  const data = require("./utils");

  _utils = function () {
    return data;
  };

  return data;
}

function _CommandError() {
  const data = _interopRequireDefault(require("../../CommandError"));

  _CommandError = function () {
    return data;
  };

  return data;
}

function _validators() {
  const data = require("../../validators");

  _validators = function () {
    return data;
  };

  return data;
}

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

const PLATFORM = 'ios';
const APPLE_CREDS_QUESTIONS = [{
  type: 'input',
  name: 'appleId',
  message: `What's your Apple ID?`,
  validate: _validators().nonEmptyInput
}, {
  type: 'password',
  name: 'appleIdPassword',
  message: 'Password?',
  validate: _validators().nonEmptyInput
}];
const APP_NAME_TOO_LONG_MSG = `An app name can't be longer than 30 characters.`;
const APP_NAME_QUESTION = {
  type: 'input',
  name: 'appName',
  message: 'How would you like to name your app?',
  validate: appName => {
    if (!appName) {
      return 'Empty app name is not valid.';
    } else if (appName.length > 30) {
      return APP_NAME_TOO_LONG_MSG;
    } else {
      return true;
    }
  }
};
const LANGUAGES = ['Brazilian Portuguese', 'Danish', 'Dutch', 'English', 'English_Australian', 'English_CA', 'English_UK', 'Finnish', 'French', 'French_CA', 'German', 'Greek', 'Indonesian', 'Italian', 'Japanese', 'Korean', 'Malay', 'Norwegian', 'Portuguese', 'Russian', 'Simplified Chinese', 'Spanish', 'Spanish_MX', 'Swedish', 'Thai', 'Traditional Chinese', 'Turkish', 'Vietnamese'];
exports.LANGUAGES = LANGUAGES;

class IOSUploader extends _BaseUploader().default {
  static validateOptions(options) {
    if (!LANGUAGES.includes(options.language)) {
      throw new Error(`You must specify a supported language. Run expo upload:ios --help to see the list of supported languages.`);
    }

    if (options.publicUrl && !_xdl().UrlUtils.isHttps(options.publicUrl)) {
      throw new (_CommandError().default)('INVALID_PUBLIC_URL', '--public-url must be a valid HTTPS URL.');
    }
  }

  constructor(projectDir, options) {
    super(PLATFORM, projectDir, options);
  }

  _ensureExperienceIsValid(exp) {
    if (!(0, _has().default)(exp, 'ios.bundleIdentifier')) {
      throw new Error(`You must specify an iOS bundle identifier in app.json.`);
    }
  }

  async _getPlatformSpecificOptions() {
    const appleIdCrentials = await this._getAppleIdCredentials();
    const appleTeamId = await this._getAppleTeamId();
    const appName = await this._getAppName();
    const otherOptions = (0, _pick().default)(this.options, ['language', 'sku']);
    return { ...appleIdCrentials,
      appName,
      ...otherOptions,
      appleTeamId
    };
  }

  async _getAppleTeamId() {
    const credentialMetadata = await _xdl().Credentials.getCredentialMetadataAsync(this.projectDir, 'ios');
    const {
      teamId
    } = await _xdl().Credentials.getCredentialsForPlatform(credentialMetadata);
    return teamId;
  }

  async _getAppleIdCredentials() {
    const appleCredsKeys = ['appleId', 'appleIdPassword'];
    const result = (0, _pick().default)(this.options, appleCredsKeys);

    if (process.env.EXPO_APPLE_ID) {
      result.appleId = process.env.EXPO_APPLE_ID;
    }

    if (process.env.EXPO_APPLE_ID_PASSWORD) {
      result.appleIdPassword = process.env.EXPO_APPLE_ID_PASSWORD;
    }

    const credsPresent = (0, _intersection().default)(Object.keys(result), appleCredsKeys);

    if (credsPresent.length !== appleCredsKeys.length) {
      const questions = APPLE_CREDS_QUESTIONS.filter(({
        name
      }) => !credsPresent.includes(name));
      const answers = await (0, _prompt().default)(questions);
      return { ...result,
        ...answers
      };
    } else {
      return result;
    }
  }

  async _getAppName() {
    const appName = this.options.appName || this._exp.name;

    if (!appName || appName.length > 30) {
      if (appName && appName.length > 30) {
        _log().default.error(APP_NAME_TOO_LONG_MSG);
      }

      return await this._askForAppName();
    } else {
      return appName;
    }
  }

  async _askForAppName() {
    const {
      appName
    } = await (0, _prompt().default)(APP_NAME_QUESTION);
    return appName;
  }

  async _uploadToTheStore(platformData, buildPath) {
    const {
      fastlane
    } = this;
    const {
      appleId,
      appleIdPassword,
      appName,
      language,
      appleTeamId
    } = platformData;
    const {
      bundleIdentifier
    } = this._exp.ios;
    const appleCreds = {
      appleId,
      appleIdPassword,
      appleTeamId,
      itcTeamId: this.options.itcTeamId
    };
    (0, _log().default)('Ensuring the app exists on App Store Connect, this may take a while...');
    await (0, _utils().runFastlaneAsync)(fastlane.appProduce, [bundleIdentifier, appName, appleId, language], appleCreds);
    (0, _log().default)('Uploading the app to Testflight, hold tight...');
    await (0, _utils().runFastlaneAsync)(fastlane.pilotUpload, [buildPath, appleId], appleCreds);
    (0, _log().default)(`All done! You may want to go to App Store Connect (${_chalk().default.underline('https://appstoreconnect.apple.com')}) and share your build with your testers.`);
  }

}

exports.default = IOSUploader;
//# sourceMappingURL=../../__sourcemaps__/commands/upload/IOSUploader.js.map