<?php

namespace Simple_History\Loggers;

use Simple_History\Log_Initiators;

/**
 * Logs user switching from the great User Switching plugin
 * Plugin URL: https://wordpress.org/plugins/user-switching/
 *
 * @since 2.2
 */
class Plugin_User_Switching_Logger extends Logger {
	/** @var string Logger slug */
	public $slug = 'PluginUserSwitchingLogger';

	/**
	 * Get array with information about this logger
	 *
	 * @return array
	 */
	public function get_info() {
		return array(
			'name'        => _x( 'Plugin: User Switching Logger', 'PluginUserSwitchingLogger', 'simple-history' ),
			'description' => _x( 'Logs user switches', 'PluginUserSwitchingLogger', 'simple-history' ),
			'name_via'    => _x( 'Using plugin User Switching', 'PluginUserSwitchingLogger', 'simple-history' ),
			'capability'  => 'edit_users',
			'messages'    => array(
				'switched_to_user'       => _x( 'Switched to user "{user_login_to}" from user "{user_login_from}"', 'PluginUserSwitchingLogger', 'simple-history' ),
				'switched_back_user'     => _x( 'Switched back to user "{user_login_to}" from user "{user_login_from}"', 'PluginUserSwitchingLogger', 'simple-history' ),
				'switched_back_themself' => _x( 'Switched back to user "{user_login_to}"', 'PluginUserSwitchingLogger', 'simple-history' ),
				'switched_off_user'      => _x( 'Switched off user "{user_login}"', 'PluginUserSwitchingLogger', 'simple-history' ),
			),
			'labels'      => array(
				'search' => array(
					'label'     => _x( 'User Switching', 'User Switching logger: search', 'simple-history' ),
					'label_all' => _x( 'All user switches', 'User Switching logger: search', 'simple-history' ),
					'options'   => array(
						_x( 'User switches', 'User Switching logger: search', 'simple-history' ) => array(
							'switched_to_user',
							'switched_back_user',
							'switched_back_themself',
							'switched_off_user',
						),
					),
				),
			),
		);
	}

	/**
	 * Called when logger is loaded.
	 */
	public function loaded() {
		add_action( 'switch_to_user', array( $this, 'on_switch_to_user' ), 10, 2 );
		add_action( 'switch_back_user', array( $this, 'on_switch_back_user' ), 10, 2 );
		add_action( 'switch_off_user', array( $this, 'on_switch_off_user' ), 10, 1 );
	}

	/**
	 * Function is called when a user switches to another user.
	 *
	 * @param int $user_id     The ID of the user being switched to.
	 * @param int $old_user_id The ID of the user being switched from.
	 */
	public function on_switch_to_user( $user_id, $old_user_id ) {
		$user_to   = get_user_by( 'id', $user_id );
		$user_from = get_user_by( 'id', $old_user_id );

		if ( ! is_a( $user_to, 'WP_User' ) || ! is_a( $user_from, 'WP_User' ) ) {
			return;
		}

		$this->info_message(
			'switched_to_user',
			array(
				// It is the old user who initiates the switching.
				'_initiator'      => Log_Initiators::WP_USER,
				'_user_id'        => $user_from->ID,
				'_user_login'     => $user_from->user_login,
				'_user_email'     => $user_from->user_email,
				'user_id'         => $user_id,
				'old_user_id'     => $old_user_id,
				'user_login_to'   => $user_to->user_login,
				'user_login_from' => $user_from->user_login,
			)
		);
	}

	/**
	 * Function is called when a user switches back to their originating account.
	 * When you switch back after being logged off the
	 *
	 * Note: $old_user_id parameter is boolean false because there is no old user.
	 *
	 * @param int       $user_id     The ID of the user being switched back to.
	 * @param int|false $old_user_id The ID of the user being switched from, or false if the user is switching back
	 *                               after having been switched off.
	 */
	public function on_switch_back_user( $user_id, $old_user_id ) {
		$user_to = get_user_by( 'id', $user_id );

		$user_from = $old_user_id === false ? null : get_user_by( 'id', $old_user_id );

		if ( ! is_a( $user_to, 'WP_User' ) ) {
			return;
		}

		if ( $user_from ) {
			// User switched back from another user.
			$this->info_message(
				'switched_back_user',
				array(
					'_initiator'      => Log_Initiators::WP_USER,
					'_user_id'        => $user_to->ID,
					'_user_login'     => $user_to->user_login,
					'_user_email'     => $user_to->user_email,
					'user_id'         => $user_id,
					'old_user_id'     => $old_user_id,
					'user_login_to'   => $user_to->user_login,
					'user_login_from' => $user_from->user_login,
				)
			);
		} else {
			// User switched back to themself (no prev user).
			$this->info_message(
				'switched_back_themself',
				array(
					'_initiator'    => Log_Initiators::WP_USER,
					'_user_id'      => $user_to->ID,
					'_user_login'   => $user_to->user_login,
					'_user_email'   => $user_to->user_email,
					'user_login_to' => $user_to->user_login,
				)
			);
		}
	}

	/**
	 * Function is called when a user is switched off.
	 *
	 * @param int $user_id The ID of the user being switched off.
	 */
	public function on_switch_off_user( $user_id ) {
		$user = get_user_by( 'id', $user_id );

		if ( ! is_a( $user, 'WP_User' ) ) {
			return;
		}

		$this->info_message(
			'switched_off_user',
			array(
				'_initiator'  => Log_Initiators::WP_USER,
				'_user_id'    => $user_id,
				'_user_login' => $user->user_login,
				'_user_email' => $user->user_email,
				'user_id'     => $user_id,
				'user_login'  => $user->user_login,
			)
		);
	}
}
