<?php
namespace Buddypress\CLI\Command;

use WP_CLI;

/**
 * Manage XProfile Data.
 *
 * @since BuddyPress 1.5.0
 */
class XProfile_Data extends BuddypressCommand {

	/**
	 * XProfile object fields.
	 *
	 * @var array
	 */
	protected $obj_fields = array(
		'id',
		'field_id',
		'user_id',
		'value',
		'last_updated',
	);

	/**
	 * Set profile data for a user.
	 *
	 * ## OPTIONS
	 *
	 * --user-id=<user>
	 * : Identifier for the user. Accepts either a user_login or a numeric ID.
	 *
	 * --field-id=<field>
	 * : Identifier for the field. Accepts either the name of the field or a numeric ID.
	 *
	 * --value=<value>
	 * : Value to set.
	 *
	 * ## EXAMPLE
	 *
	 *     $ wp bp xprofile data set --user-id=45 --field-id=120 --value=teste
	 *     Success: Updated XProfile field "Field Name" (ID 120) with value  "teste" for user user_login (ID 45).
	 */
	public function set( $args, $assoc_args ) {
		$user     = $this->get_user_id_from_identifier( $assoc_args['user-id'] );
		$field_id = $this->get_field_id( $assoc_args['field-id'] );
		$field    = new \BP_XProfile_Field( $field_id );

		if ( empty( $field->name ) ) {
			WP_CLI::error( 'XProfile field not found.' );
		}

		$value = $assoc_args['value'];

		if ( 'checkbox' === $field->type ) {
			$value = explode( ',', $assoc_args['value'] );
		}

		$updated = xprofile_set_field_data( $field->id, $user->ID, $value );

		if ( ! $updated ) {
			WP_CLI::error( 'Could not set profile data.' );
		}

		$success = sprintf(
			'Updated XProfile field "%s" (ID %d) with value "%s" for user %s (ID %d).',
			$field->name,
			$field->id,
			$assoc_args['value'],
			$user->user_nicename,
			$user->ID
		);
		WP_CLI::success( $success );
	}

	/**
	 * Get profile data for a user.
	 *
	 * ## OPTIONS
	 *
	 * --user-id=<user>
	 * : Identifier for the user. Accepts either a user_login or a numeric ID.
	 *
	 * [--field-id=<field>]
	 * : Identifier for the field. Accepts either the name of the field or a numeric ID.
	 *
	 * [--format=<format>]
	 * : Render output in a particular format.
	 *  ---
	 * default: table
	 * options:
	 *   - table
	 *   - json
	 *   - haml
	 * ---
	 *
	 * [--multi-format=<multi-format>]
	 * : The format for array data.
	 *  ---
	 * default: array
	 * options:
	 *   - array
	 *   - comma
	 * ---
	 *
	 * ## EXAMPLES
	 *
	 *     $ wp bp xprofile data get --user-id=45 --field-id=120
	 *     $ wp bp xprofile data see --user-id=user_test --field-id=Hometown --multi-format=comma
	 *
	 * @alias see
	 */
	public function get( $args, $assoc_args ) {
		$user = $this->get_user_id_from_identifier( $assoc_args['user-id'] );

		if ( isset( $assoc_args['field-id'] ) ) {
			$data = xprofile_get_field_data( $assoc_args['field-id'], $user->ID, $assoc_args['multi-format'] );
			WP_CLI::print_value( $data, $assoc_args );
		} else {
			$data           = \BP_XProfile_ProfileData::get_all_for_user( $user->ID );
			$formatted_data = array();

			foreach ( $data as $field_name => $field_data ) {
				// Omit WP core fields.
				if ( ! is_array( $field_data ) ) {
					continue;
				}

				$_field_data = maybe_unserialize( $field_data['field_data'] );
				$_field_data = wp_json_encode( $_field_data );

				$formatted_data[] = array(
					'field_id'   => $field_data['field_id'],
					'field_name' => $field_name,
					'value'      => $_field_data,
				);
			}

			$format_args           = $assoc_args;
			$format_args['fields'] = array(
				'field_id',
				'field_name',
				'value',
			);
			$formatter             = $this->get_formatter( $format_args );
			$formatter->display_items( $formatted_data );
		}
	}

	/**
	 * Delete XProfile data for a user.
	 *
	 * ## OPTIONS
	 *
	 * --user-id=<user>
	 * : Identifier for the user. Accepts either a user_login or a numeric ID.
	 *
	 * [--field-id=<field>]
	 * : Identifier for the field. Accepts either the name of the field or a numeric ID.
	 *
	 * [--delete-all]
	 * : Delete all data for the user.
	 *
	 * [--yes]
	 * : Answer yes to the confirmation message.
	 *
	 * ## EXAMPLES
	 *
	 *     $ wp bp xprofile data delete --user-id=45 --field-id=120 --yes
	 *     Success: XProfile data removed.
	 *
	 *     $ wp bp xprofile data remove --user-id=user_test --delete-all --yes
	 *     Success: XProfile data removed.
	 *
	 * @alias remove
	 */
	public function delete( $args, $assoc_args ) {
		$user = $this->get_user_id_from_identifier( $assoc_args['user-id'] );

		if ( ! isset( $assoc_args['field-id'] ) && ! isset( $assoc_args['delete-all'] ) ) {
			WP_CLI::error( 'Either --field-id or --delete-all must be provided.' );
		}

		if ( isset( $assoc_args['delete-all'] ) ) {
			WP_CLI::confirm( sprintf( 'Are you sure you want to delete all XProfile data for the user %s (#%d)?', $user->user_login, $user->ID ), $assoc_args );

			xprofile_remove_data( $user->ID );
			WP_CLI::success( 'XProfile data removed.' );
		} else {
			WP_CLI::confirm( 'Are you sure you want to delete that?', $assoc_args );

			if ( xprofile_delete_field_data( $assoc_args['field-id'], $user->ID ) ) {
				WP_CLI::success( 'XProfile data removed.' );
			} else {
				WP_CLI::error( 'Could not delete XProfile data.' );
			}
		}
	}
}
