<?php

if ( ! class_exists( 'WP_CLI' ) ) {
	return;
}

/**
 * Class EIG_WP_CLI_Staging
 *
 * This class is instantiated in /inc/cli-init.php
 */
class EIG_WP_CLI_Staging extends EIG_WP_CLI_Command {

	/**
	 * @var array - Subcommand actions used to create/modify staging environments.
	 */
	protected static $valid_actions = array(
		'create',
		'clone',
		'destroy',
		'sso_staging',
		'deploy',
		'deploy_files',
		'deploy_db',
		'deploy_files_db',
		'save_state',
		'restore_state',
		'sso_production',
	);
	/**
	 * Used internally to create staging environment.
	 *
	 * @param $args null
	 * @param $assoc_args array
	 * @throws \WP_CLI\ExitException
	 */
	public function __invoke( $args, $assoc_args ) {
		if ( ! is_array( $args ) || ! isset( $args[0] ) ) {
			$this->error( 'No sub-command provided' );
		}
		if ( ! in_array( $args[0], static::$valid_actions ) ) {
			$this->error( 'Invalid action' );
		}
		switch ( $args[0] ) {
			case 'create':
				set_transient( 'mm_fresh_staging', true, 300 );
				$json_response = mm_cl( 'create' );
				break;

			case 'clone':
				$json_response = mm_cl( 'clone' );
				break;

			case 'destroy':
				$json_response = mm_cl( 'destroy' );
				break;

			case 'sso_staging':
				$user = get_users(
					array(
						'role'   => 'administrator',
						'number' => 1,
					)
				);
				if ( is_array( $user ) && is_a( $user[0], 'WP_User' ) ) {
					$user = $user[0];
					$user = $user->ID;
				}
				$json_response = mm_cl( 'sso_staging', array( $user ) );
				break;

			case 'sso_production':
				$user = get_users(
					array(
						'role'   => 'administrator',
						'number' => 1,
					)
				);
				if ( is_array( $user ) && is_a( $user[0], 'WP_User' ) ) {
					$user = $user[0];
					$user = $user->ID;
				}
				$json_response = mm_cl( 'sso_production', array( $user ) );
				break;

			case 'deploy':
				if ( ! isset( $args[1] ) || ! in_array( $args[1], array( 'files', 'db', 'database', 'all', 'both' ) ) ) {
					$this->error( 'Invalid deploy type' );
				}
				if ( 'files' == $args[1] ) {
					$json_response = mm_cl( 'deploy_files' );
				}
				if ( 'db' == $args[1] || 'database' == $args[1] ) {
					$json_response = mm_cl( 'deploy_db' );
				}
				if ( 'all' == $args[1] || 'both' == $args[1] ) {
					$json_response = mm_cl( 'deploy_files_db' );
				}
				break;

			case 'deploy_files':
				$json_response = mm_cl( 'deploy_files' );
				break;

			case 'deploy_db':
				$json_response = mm_cl( 'deploy_db' );
				break;

			case 'deploy_files_db':
				$json_response = mm_cl( 'deploy_files_db' );
				break;

			case 'save_state':
				$json_response = mm_cl( 'save_state' );
				break;

			case 'restore_state':
				if ( ! isset( $assoc_args['revision'] ) ) {
					$this->error( 'Revision not provided.' );
				}
				$json_response = mm_cl( 'restore_state', array( esc_attr( $assoc_args['revision'] ) ) );
				break;
		}
		$json_response = preg_replace( '/[^[:print:]]/', '', $json_response );
		$json_response = str_replace( '[H[2J', '', $json_response );

		if ( $response = json_decode( $json_response ) ) {
			if ( 'success' == $response->status ) {
				$this->success( $response->message );
			} else {
				$this->error( $response->message );
			}
		} else {
			$this->error( 'Invalid JSON response' );
		}
	}
}
