#!/usr/bin/env node

'use strict';

const {exec, spawn} = require('child-process-promise');
const {join} = require('path');
const {readFileSync} = require('fs');
const theme = require('./theme');
const {getDateStringForCommit, logPromise, printDiff} = require('./utils');

const cwd = join(__dirname, '..', '..');

const CIRCLE_CI_BUILD = 12707;
const COMMIT = 'b3d1a81a9';
const VERSION = '1.2.3';

const run = async () => {
  const defaultOptions = {
    cwd,
    env: process.env,
  };

  try {
    // Start with a known build/revision:
    // https://circleci.com/gh/facebook/react/12707
    let promise = spawn(
      'node',
      [
        './scripts/release/prepare-release-from-ci.js',
        `--build=${CIRCLE_CI_BUILD}`,
      ],
      defaultOptions
    );
    logPromise(
      promise,
      theme`Checking out "next" build {version ${CIRCLE_CI_BUILD}}`
    );
    await promise;

    const dateString = await getDateStringForCommit(COMMIT);

    // Upgrade the above build top a known React version.
    // Note that using the --local flag skips NPM checkout.
    // This isn't totally necessary but is useful if we want to test an unpublished "next" build.
    promise = spawn(
      'node',
      [
        './scripts/release/prepare-release-from-npm.js',
        `--version=0.0.0-${COMMIT}-${dateString}`,
        '--local',
      ],
      defaultOptions
    );
    promise.childProcess.stdin.setEncoding('utf-8');
    promise.childProcess.stdout.setEncoding('utf-8');
    promise.childProcess.stdout.on('data', data => {
      if (data.includes('✓ Version for')) {
        // Update all packages to a stable version
        promise.childProcess.stdin.write(VERSION);
      } else if (data.includes('(y/N)')) {
        // Accept all of the confirmation prompts
        promise.childProcess.stdin.write('y');
      }
    });
    logPromise(promise, theme`Preparing stable release {version ${VERSION}}`);
    await promise;

    const beforeContents = readFileSync(
      join(cwd, 'scripts/release/snapshot-test.snapshot'),
      'utf-8'
    );
    await exec('cp build/temp.diff scripts/release/snapshot-test.snapshot', {
      cwd,
    });
    const afterContents = readFileSync(
      join(cwd, 'scripts/release/snapshot-test.snapshot'),
      'utf-8'
    );

    if (beforeContents === afterContents) {
      console.log(theme.header`Snapshot test passed.`);
    } else {
      printDiff(
        'scripts/release/snapshot-test.snapshot',
        beforeContents,
        afterContents
      );
      console.log();
      console.error(theme.error('Snapshot test failed!'));
      console.log();
      console.log(
        'If this failure was expected, please update the contents of the snapshot file:'
      );
      console.log(
        theme`  {command git add} {path scripts/release/snapshot-test.snapshot}`
      );
      console.log(
        theme`  {command git commit -m "Updating release script snapshot file."}`
      );
      process.exit(1);
    }
  } catch (error) {
    console.error(theme.error(error));
    process.exit(1);
  }
};

run();