<?php
/**
 * Role manager api
 *
 * @package kirki
 */

namespace Kirki\Ajax;

if (!defined('ABSPATH')) {
	exit; // Exit if accessed directly.
}
use Kirki\HelperFunctions;


/**
 * Role manager API Class
 */
class RBAC
{

	/**
	 * Get members based on role
	 *
	 * @return void wp_send_json.
	 */
	public static function members_based_on_role()
	{
		$roles = static::get_all_roles();
		$user_count = static::get_user_count_based_on_role($roles);
		$user_dps = static::get_user_dp($roles);
		$access_levels = static::get_access_level($roles);

		wp_send_json(
			array(
				'user_count' => $user_count,
				'roles' => $roles,
				'dp' => $user_dps,
				'access' => $access_levels,
			)
		);
	}

	/**
	 * Update access lavel
	 *
	 * @return void wp_send_json.
	 */
	public static function update_access_level()
	{
		//phpcs:ignore WordPress.Security.NonceVerification.Missing,WordPress.Security.NonceVerification.Recommended,WordPress.Security.ValidatedSanitizedInput.MissingUnslash,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
		$role_name = HelperFunctions::sanitize_text(isset($_POST['roleName']) ? $_POST['roleName'] : null);
		//phpcs:ignore WordPress.Security.NonceVerification.Missing,WordPress.Security.NonceVerification.Recommended,WordPress.Security.ValidatedSanitizedInput.MissingUnslash,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
		$access = HelperFunctions::sanitize_text(isset($_POST['access']) ? $_POST['access'] : null);

		// The access level of `administrator` & `subscriber` role can't be updated.
		if (in_array($role_name, array('administrator', 'subscriber'), true)) {
			wp_send_json(false);
			die();
		}
		;

		if ($role_name && $access) {
			$res = update_option('kirki_' . $role_name, $access, false);
			if ($res) {
				wp_send_json(true);
			}
		}
		wp_send_json(false);
	}

	/**
	 * Get editor access lavel
	 *
	 * @return void wp_send_json.
	 */
	public static function get_editor_access_level()
	{
		$curr_user = wp_get_current_user();

		if (HelperFunctions::is_api_call_from_editor_preview() && HelperFunctions::is_api_header_post_editor_preview_token_valid()) {
			wp_send_json(KIRKI_ACCESS_LEVELS['FULL_ACCESS']);
		}

		if ($curr_user) {
			$roles = $curr_user->roles;
			$access_arr = array();

			foreach ($roles as $role) {
				$access = get_option('kirki_' . $role);
				$access_arr[] = $access;
			}

			if (in_array(KIRKI_ACCESS_LEVELS['FULL_ACCESS'], $access_arr, true)) {
				wp_send_json(KIRKI_ACCESS_LEVELS['FULL_ACCESS']);
			} elseif (in_array(KIRKI_ACCESS_LEVELS['CONTENT_ACCESS'], $access_arr, true)) {
				wp_send_json(KIRKI_ACCESS_LEVELS['CONTENT_ACCESS']);
			} elseif (in_array(KIRKI_ACCESS_LEVELS['VIEW_ACCESS'], $access_arr, true)) {
				wp_send_json(KIRKI_ACCESS_LEVELS['VIEW_ACCESS']);
			} else {
				wp_send_json(KIRKI_ACCESS_LEVELS['NO_ACCESS']);
			}
		} else {
			wp_send_json(KIRKI_ACCESS_LEVELS['VIEW_ACCESS']);
		}
	}

	/**
	 * Get user count based on role
	 *
	 * @return int count.
	 */
	private static function get_user_count_based_on_role()
	{
		$result = count_users();
		$user_count = $result['avail_roles'];
		unset($user_count['none']); // This is not needed.
		return $user_count;
	}

	/**
	 * Get user DP
	 *
	 * @param array $roles wp roles.
	 * @return array
	 */
	private static function get_user_dp($roles = array())
	{
		if (count($roles)) {
			$dp = array();

			foreach ($roles as $role) {
				$role_id = $role['id'];

				$users = get_users(
					array(
						'role' => $role_id,
						'number' => 3,
					)
				);
				$user_ids = array();

				foreach ($users as $user) {
					$user_ids[] = $user->ID;
				}

				$avatars = array();
				foreach ($user_ids as $user_id) {
					$avatar = get_avatar_url($user_id);
					$avatars[] = $avatar;
				}

				$dp[$role_id] = $avatars;
			}

			return $dp;
		}
		return array();
	}

	/**
	 * Get all roles
	 *
	 * @return array
	 */
	public static function get_all_roles()
	{
		global $wp_roles;
		$role_list = $wp_roles->roles;
		$roles = array();

		if (is_array($role_list)) {
			foreach ($role_list as $key => $val) {
				$roles[] = array(
					'id' => $key,
					'name' => $val['name'],
				);
			}
		}

		return $roles;
	}

	/**
	 * Get access level
	 *
	 * @param array $roles wp roles.
	 * @return array
	 * 
	 * @deprecated
	 * @see \Kirki\App\Supports\Role::get_access_levels_by_roles()
	 */
	public static function get_access_level($roles)
	{
		$access_levels = array();

		foreach ($roles as $role) {
			$role_id = $role['id'];
			$result = get_option('kirki_' . $role_id);

			if ($result) {
				$access_levels[$role_id] = $result;
			} else {
				if (in_array($role_id, KIRKI_USERS_DEFAULT_FULL_ACCESS, true)) {
					add_option('kirki_' . $role_id, KIRKI_ACCESS_LEVELS['FULL_ACCESS']);
					$access_levels[$role_id] = KIRKI_ACCESS_LEVELS['FULL_ACCESS'];
				} else {
					add_option('kirki_' . $role_id, KIRKI_ACCESS_LEVELS['NO_ACCESS']);
					$access_levels[$role_id] = KIRKI_ACCESS_LEVELS['NO_ACCESS'];
				}
			}
		}

		return $access_levels;
	}
}
