<?php
/**
 * Admin functions.
 *
 * @package BSF core
 */

if ( ! function_exists( 'bsf_generate_rand_token' ) ) {
	/**
	 * Generate 32 characters random token.
	 *
	 * @return string
	 */
	function bsf_generate_rand_token() {
		$valid_characters = 'abcdefghijklmnopqrstuvwxyz0123456789';
		$token            = '';
		$length           = 32;
		for ( $n = 1; $n < $length; $n++ ) {
			$which_character = wp_rand( 0, strlen( $valid_characters ) - 1 );
			$token          .= $valid_characters[ $which_character ];
		}
		return $token;
	}
}

/**
 * Update version numbers of all the brainstorm products in options `brainstorm_products` and `brainstrom_bundled_products`
 *
 * Current version numbers can be fetched from WordPress at runtime whenever ruquired,
 *          Remote version can only be required when transient for update data is deleted (i hope)
 */
if ( ! function_exists( 'bsf_update_all_product_version' ) ) {

	/**
	 * Updates all product versions.
	 *
	 * @return void
	 */
	function bsf_update_all_product_version() {

		$brainstrom_products         = get_option( 'brainstrom_products', array() );
		$brainstrom_bundled_products = get_option( 'brainstrom_bundled_products', array() );
		$bsf_product_themes          = array();

		if ( ! empty( $brainstrom_products ) ) {
			$bsf_product_plugins = isset( $brainstrom_products['plugins'] ) ? $brainstrom_products['plugins'] : array();
			$bsf_product_themes  = isset( $brainstrom_products['themes'] ) ? $brainstrom_products['themes'] : array();
		}

		$bundled_product_updated = false;

		if ( ! empty( $bsf_product_plugins ) ) {

			foreach ( $bsf_product_plugins as $key => $plugin ) {
				if ( ! isset( $plugin['id'] ) || empty( $plugin['id'] ) ) {
					continue;
				}
				if ( ! isset( $plugin['template'] ) || empty( $plugin['template'] ) ) {
					continue;
				}
				if ( ! isset( $plugin['type'] ) || empty( $plugin['type'] ) ) {
					continue;
				}
				$version         = isset( $plugin['version'] ) ? $plugin['version'] : '';
				$current_version = bsf_get_current_version( $plugin['template'], $plugin['type'] );
				$name            = bsf_get_current_name( $plugin['template'], $plugin['type'] );
				if ( '' !== $name ) {
					$brainstrom_products['plugins'][ $key ]['product_name'] = $name;
				}
				if ( '' !== $current_version ) {
					if ( version_compare( $version, $current_version ) === - 1 || 1 === version_compare( $version, $current_version ) ) {
						$brainstrom_products['plugins'][ $key ]['version'] = $current_version;
					}
				}
			}
		}

		if ( ! empty( $bsf_product_themes ) ) {

			foreach ( $bsf_product_themes as $key => $theme ) {
				if ( ! isset( $theme['id'] ) || empty( $theme['id'] ) ) {
					continue;
				}
				if ( ! isset( $theme['template'] ) || empty( $theme['template'] ) ) {
					continue;
				}
				if ( ! isset( $theme['type'] ) || empty( $theme['type'] ) ) {
					continue;
				}
				$version         = isset( $theme['version'] ) ? $theme['version'] : '';
				$current_version = bsf_get_current_version( $theme['template'], $theme['type'] );
				$name            = bsf_get_current_name( $theme['template'], $theme['type'] );
				if ( '' !== $name ) {
					$brainstrom_products['themes'][ $key ]['product_name'] = $name;
				}
				if ( '' !== $current_version || false !== $current_version ) {
					if ( version_compare( $version, $current_version ) === - 1 || 1 === version_compare( $version, $current_version ) ) {
						$brainstrom_products['themes'][ $key ]['version'] = $current_version;
					}
				}
			}
		}

		if ( ! empty( $brainstrom_bundled_products ) ) {

			foreach ( $brainstrom_bundled_products as $keys => $bps ) {
				$version = '';
				if ( strlen( $keys ) > 1 ) {
					foreach ( $bps as $key => $bp ) {
						if ( ! isset( $bp->id ) || '' === $bp->id ) {
							continue;
						}
						$version         = $bp->version;
						$current_version = bsf_get_current_version( $bp->init, $bp->type );

						if ( '' !== $current_version && false !== $current_version ) {
							if ( 1 === - version_compare( $version, $current_version ) || 1 === version_compare( $version, $current_version ) ) {
								if ( is_object( $brainstrom_bundled_products ) ) {
									$brainstrom_bundled_products = array( $brainstrom_bundled_products );
								}
								$single_bp                            = $brainstrom_bundled_products[ $keys ];
								$single_bp[ $key ]->version           = $current_version;
								$bundled_product_updated              = true;
								$brainstrom_bundled_products[ $keys ] = $single_bp;
							}
						}
					}
				} else {
					if ( ! isset( $bps->id ) || '' === $bps->id ) {
						continue;
					}
					$version         = $bps->version;
					$current_version = bsf_get_current_version( $bps->init, $bps->type );
					if ( '' !== $current_version || false !== $current_version ) {
						if ( - 1 === version_compare( $version, $current_version ) || 1 === version_compare( $version, $current_version ) ) {
							$brainstrom_bundled_products[ $keys ]->version = $current_version;
							$bundled_product_updated                       = true;
						}
					}
				}
			}
		}

		update_option( 'brainstrom_products', $brainstrom_products );

		if ( $bundled_product_updated ) {
			update_option( 'brainstrom_bundled_products', $brainstrom_bundled_products );
		}
	}
}

add_action( 'admin_init', 'bsf_update_all_product_version', 1000 );

if ( ! function_exists( 'bsf_get_current_version' ) ) {
	/**
	 * Get current version of plugin / theme.
	 *
	 * @param string $template plugin template/slug.
	 * @param string $type type of product.
	 *
	 * @return float
	 */
	function bsf_get_current_version( $template, $type ) {
		if ( '' === $template ) {
			return false;
		}
		if ( 'theme' === $type || 'themes' === $type ) {
			$theme   = wp_get_theme( $template );
			$version = $theme->get( 'Version' );
		} elseif ( 'plugin' === $type || 'plugins' === $type ) {
			$plugin_file = rtrim( WP_PLUGIN_DIR, '/' ) . '/' . $template;
			if ( ! is_file( $plugin_file ) ) {
				return false;
			}
			$plugin  = get_plugin_data( $plugin_file );
			$version = $plugin['Version'];
		}
		return $version;
	}
}
if ( ! function_exists( 'bsf_get_current_name' ) ) {
	/**
	 * Get name of plugin / theme.
	 *
	 * @param string $template plugin template/slug.
	 * @param string $type type of product.
	 * @return string
	 */
	function bsf_get_current_name( $template, $type ) {
		if ( '' === $template ) {
			return false;
		}
		if ( 'theme' === $type || 'themes' === $type ) {
			$theme = wp_get_theme( $template );
			$name  = $theme->get( 'Name' );
		} elseif ( 'plugin' === $type || 'plugins' === $type ) {
			$plugin_file = rtrim( WP_PLUGIN_DIR, '/' ) . '/' . $template;
			if ( ! is_file( $plugin_file ) ) {
				return false;
			}
			$plugin = get_plugin_data( $plugin_file );
			$name   = $plugin['Name'];
		}
		return $name;
	}
}
add_action( 'admin_notices', 'bsf_notices', 1000 );
add_action( 'network_admin_notices', 'bsf_notices', 1000 );
if ( ! function_exists( 'bsf_notices' ) ) {
	/**
	 * Display admin notices.
	 *
	 * @return bool
	 */
	function bsf_notices() {
		global $pagenow;

		if ( 'update-core.php' === $pagenow || 'plugins.php' === $pagenow || 'post-new.php' === $pagenow || 'edit.php' === $pagenow || 'post.php' === $pagenow ) {
			$brainstrom_products         = get_option( 'brainstrom_products' );
			$brainstrom_bundled_products = get_option( 'brainstrom_bundled_products', array() );

			if ( empty( $brainstrom_products ) ) {
				return false;
			}

			$brainstrom_bundled_products_keys = array();

			if ( ! empty( $brainstrom_bundled_products ) ) {
				foreach ( $brainstrom_bundled_products as $bps ) {
					foreach ( $bps as $bp ) {
						array_push( $brainstrom_bundled_products_keys, $bp->id );
					}
				}
			}

			$mix = array();

			$plugins = isset( $brainstrom_products['plugins'] ) ? $brainstrom_products['plugins'] : array();
			$themes  = isset( $brainstrom_products['themes'] ) ? $brainstrom_products['themes'] : array();

			$mix = array_merge( $plugins, $themes );

			if ( empty( $mix ) ) {
				return false;
			}

			if ( ( defined( 'BSF_PRODUCTS_NOTICES' ) && ( 'false' === BSF_PRODUCTS_NOTICES || false === BSF_PRODUCTS_NOTICES ) ) ) {
				return false;
			}

			$is_multisite     = is_multisite();
			$is_network_admin = is_network_admin();

			foreach ( $mix as $product ) {
				if ( ! isset( $product['id'] ) ) {
					continue;
				}

				if ( false === apply_filters( "bsf_display_product_activation_notice_{$product['id']}", true ) ) {
					continue;
				}

				if ( isset( $product['is_product_free'] ) && ( 'true' === $product['is_product_free'] || true === $product['is_product_free'] ) ) {
					continue;
				}

				$constant        = strtoupper( str_replace( '-', '_', $product['id'] ) );
				$constant_nag    = 'BSF_' . $constant . '_NAG';
				$constant_notice = 'BSF_' . $constant . '_NOTICES';

				if ( defined( $constant_nag ) && ( 'false' === constant( $constant_nag ) || false === constant( $constant_nag ) ) ) {
					continue;
				}
				if ( defined( $constant_notice ) && ( 'false' === constant( $constant_notice ) || false === constant( $constant_notice ) ) ) {
					continue;
				}

				$status = isset( $product['status'] ) ? $product['status'] : false;
				$type   = isset( $product['type'] ) ? $product['type'] : false;

				if ( ! $type ) {
					continue;
				}

				if ( 'plugin' === $type ) {
					if ( ! is_plugin_active( $product['template'] ) ) {
						continue;
					}
				} elseif ( 'theme' === $type ) {
					$theme = wp_get_theme();
					if ( $product['template'] !== $theme->template ) {
						continue;
					}
				} else {
					continue;
				}

				if ( BSF_Update_Manager::bsf_is_product_bundled( $product['id'] ) ) {
					continue;
				}

				if ( 'registered' !== $status ) {

					$url = bsf_registration_page_url( '', $product['id'] );

					$message = __( 'Please', 'bsf' ) . ' <a href="' . esc_url( $url ) . '" class="bsf-core-license-form-btn" plugin-slug="' . esc_html( $product['id'] ) . '">' . __( 'activate', 'bsf' ) . '</a> ' . __( 'your copy of the', 'bsf' ) . ' <i>' . esc_html( $product['product_name'] ) . '</i> ' . __( 'to get update notifications, access to support features & other resources!', 'bsf' );
					$message = apply_filters( "bsf_product_activation_notice_{$product['id']}", $message, $url, $product['product_name'] );

					$allowed_html = array(
						'a'      => array(
							'href'        => array(),
							'class'       => array(),
							'title'       => array(),
							'plugin-slug' => array(),
						),
						'br'     => array(),
						'em'     => array(),
						'strong' => array(),
						'i'      => array(),
					);

					if ( ( $is_multisite && $is_network_admin ) || ! $is_multisite ) {
						echo '<div class="notice notice-warning"><p>' . wp_kses( $message, $allowed_html ) . '</p></div>';
					}
				}
			}
		}
	}
}

// delete bundled products after switch theme.
if ( ! function_exists( 'bsf_theme_deactivation' ) ) {
	/**
	 * Delete transients while switching theme.
	 *
	 * @return void
	 */
	function bsf_theme_deactivation() {
		update_option( 'bsf_force_check_extensions', false );
	}
}

add_action( 'switch_theme', 'bsf_theme_deactivation' );
add_action( 'deactivated_plugin', 'bsf_theme_deactivation' );

if ( ! function_exists( 'bsf_get_free_menu_position' ) ) {
	/**
	 * Get free theme position.
	 *
	 * @param int   $start menu position priority index.
	 * @param float $increment increment number for menu position.
	 * @return int
	 */
	function bsf_get_free_menu_position( $start, $increment = 0.3 ) {
		$menus_positions = [];

		foreach ( $GLOBALS['menu'] as $key => $menu ) {
			$menus_positions[] = $key;
		}

		if ( ! in_array( $start, $menus_positions, true ) ) {
			return $start;
		}

		/* the position is already reserved find the closet one */
		while ( in_array( $start, $menus_positions, true ) ) {
			$start += $increment;
		}
		return $start;
	}
}

if ( ! function_exists( 'bsf_get_option' ) ) {
	/**
	 * Get free theme position.
	 *
	 * @param bool $request return complete option data OR a single variable.
	 * @return array
	 */
	function bsf_get_option( $request = false ) {
		$bsf_options = get_option( 'bsf_options' );
		if ( ! $request ) {
			return $bsf_options;
		}

		return isset( $bsf_options[ $request ] ) ? $bsf_options[ $request ] : false;
	}
}

if ( ! function_exists( 'bsf_update_option' ) ) {
	/**
	 * Update bsf option with key and value.
	 *
	 * @param string $request variable key.
	 * @param string $value variable value.
	 * @return bool
	 */
	function bsf_update_option( $request, $value ) {
		$bsf_options             = get_option( 'bsf_options' );
		$bsf_options[ $request ] = $value;
		return update_option( 'bsf_options', $bsf_options );
	}
}

if ( ! function_exists( 'bsf_sort' ) ) {
	/**
	 * Sort array of objects.
	 *
	 * @param string $a The first string.
	 * @param string $b The second string.
	 * @return int
	 */
	function bsf_sort( $a, $b ) {
		return strcmp( strtolower( $a->short_name ), strtolower( $b->short_name ) );
	}
}
