import process from 'process';

import * as EASCLI from './EASCLI';
import * as ExpoCLI from './ExpoCLI';
import * as Log from './Log';

type Options = {
  accessToken?: string;
  userpass?: {
    username: string;
    password: string;
  };
  message: string;
};

/**
 * Uses the installed version of `eas-cli` to publish a project.
 */
export async function publishProjectWithEasCliAsync(
  projectRoot: string,
  options: Options
): Promise<{ createdUpdateGroupId: string }> {
  process.env.EXPO_NO_DOCTOR = '1';

  if (options.accessToken) {
    Log.collapsed('Using access token...');
    process.env.EXPO_TOKEN = options.accessToken;
  } else {
    const username = options.userpass?.username || process.env.EXPO_CI_ACCOUNT_USERNAME;
    const password = options.userpass?.password || process.env.EXPO_CI_ACCOUNT_PASSWORD;

    if (username && password) {
      Log.collapsed('Logging in...');
      await ExpoCLI.runExpoCliAsync('login', ['-u', username, '-p', password]);
    } else {
      Log.collapsed('Expo username and password not specified. Using currently logged-in account.');
    }
  }

  Log.collapsed('Publishing...');
  const publishedUpdatesJSONString = await EASCLI.runEASCliAsync(
    'update',
    ['--non-interactive', '--json', '--branch', 'development', '--message', options.message],
    {
      cwd: projectRoot,
    }
  );

  const publishedUpdates = JSON.parse(publishedUpdatesJSONString);
  return { createdUpdateGroupId: publishedUpdates[0].group };
}
