<?php
/**
 * Страница настроек: список получателей уведомлений (admin).
 *
 * @package E2W_Price_Change_Alerts
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

/**
 * Class E2W_Price_Change_Alerts_Settings
 */
class E2W_Price_Change_Alerts_Settings {

	const OPTION = E2W_Price_Change_Alerts_Plugin::OPTION;

	/**
	 * Регистрация хуков.
	 */
	public function __construct() {
		add_action( 'admin_menu', array( $this, 'register_page' ) );
		add_action( 'admin_init', array( $this, 'register_settings' ) );
		add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_assets' ) );
	}

	/**
	 * Скрипт формы получателей — только на нашей странице настроек.
	 *
	 * @param string $hook_suffix Текущий admin-хук.
	 */
	public function enqueue_assets( $hook_suffix ) {
		if ( 'settings_page_e2w-price-change-alerts' !== $hook_suffix ) {
			return;
		}

		wp_enqueue_script(
			'e2w-price-change-alerts-settings',
			E2W_PRICE_CHANGE_ALERTS_URL . 'includes/admin/js/settings.js',
			array(),
			E2W_PRICE_CHANGE_ALERTS_VERSION,
			true
		);
	}

	/**
	 * Страница в Settings. Slug совпадает с menu.slug из Freemius init,
	 * чтобы Freemius прицепил свои вкладки (Account и т.д.) сюда.
	 */
	public function register_page() {
		add_options_page(
			__( 'Price Change Alerts', 'e2w-price-change-alerts' ),
			__( 'Price Change Alerts', 'e2w-price-change-alerts' ),
			'manage_options',
			'e2w-price-change-alerts',
			array( $this, 'render_page' )
		);
	}

	/**
	 * Регистрация опции.
	 */
	public function register_settings() {
		register_setting(
			'e2w_price_change_alerts',
			self::OPTION,
			array(
				'type'              => 'array',
				'sanitize_callback' => array( $this, 'sanitize' ),
				'default'           => array( 'recipients' => array() ),
			)
		);
	}

	/**
	 * Доступен ли выборочный режим (разблокируется premium-модулем).
	 *
	 * @return bool
	 */
	private function selective_available() {
		return (bool) apply_filters( 'e2w_price_change_alerts_selective_available', false );
	}

	/**
	 * Санитизация: валидные уникальные e-mail + режим.
	 *
	 * @param mixed $value Сырое значение.
	 * @return array
	 */
	public function sanitize( $value ) {
		// Стартуем от сохранённой опции: ключи premium-фич (и любые
		// неизвестные этой версии) переживают сохранение без активной лицензии.
		$stored     = get_option( self::OPTION, array() );
		$clean      = is_array( $stored ) ? $stored : array();
		$recipients = array();

		if ( is_array( $value ) && isset( $value['recipients'] ) && is_array( $value['recipients'] ) ) {
			foreach ( $value['recipients'] as $email ) {
				if ( ! is_string( $email ) ) {
					continue;
				}

				$email = sanitize_email( $email );

				if ( '' !== $email && is_email( $email ) ) {
					$recipients[] = $email;
				}
			}

			$recipients = array_values( array_unique( $recipients ) );
		}

		// Режим. Отсутствие ключа в POST (radio задизейблен без Pro) НЕ
		// затирает сохранённый режим — конфиг переживает истечение лицензии.
		$mode      = E2W_Price_Change_Alerts_Plugin::get_mode();
		$submitted = ( is_array( $value ) && isset( $value['mode'] ) && is_string( $value['mode'] ) ) ? $value['mode'] : null;

		if ( 'all' === $submitted ) {
			$mode = 'all';
		} elseif ( 'selected' === $submitted ) {
			if ( $this->selective_available() ) {
				$mode = 'selected';
			} elseif ( 'selected' !== $mode ) {
				add_settings_error(
					self::OPTION,
					'e2w_price_change_alerts_mode',
					__( 'Tracking only selected products is a Pro feature. The mode was left at "All products".', 'e2w-price-change-alerts' ),
					'warning'
				);
			}
		}

		$clean['recipients'] = $recipients;
		$clean['mode']       = $mode;

		// Premium-фичи санитизируют свои поля здесь.
		return apply_filters( 'e2w_price_change_alerts_sanitize_settings', $clean, $value );
	}

	/**
	 * Сохранённые получатели.
	 *
	 * @return string[]
	 */
	private function get_recipients() {
		$settings = get_option( self::OPTION, array() );

		if ( is_array( $settings ) && isset( $settings['recipients'] ) && is_array( $settings['recipients'] ) ) {
			return $settings['recipients'];
		}

		return array();
	}

	/**
	 * Рендер страницы настроек.
	 */
	public function render_page() {
		if ( ! current_user_can( 'manage_options' ) ) {
			return;
		}

		$recipients = $this->get_recipients();

		if ( empty( $recipients ) ) {
			$recipients = array( '' );
		}
		?>
		<div class="wrap">
			<h1><?php esc_html_e( 'Price Change Alerts', 'e2w-price-change-alerts' ); ?></h1>
			<p>
				<?php esc_html_e( 'Email addresses that receive a notification whenever a product price changes. Leave empty to send to the site admin email.', 'e2w-price-change-alerts' ); ?>
			</p>
			<form method="post" action="options.php">
				<?php
				settings_fields( 'e2w_price_change_alerts' );
				$mode                = E2W_Price_Change_Alerts_Plugin::get_mode();
				$selective_available = $this->selective_available();
				?>
				<table class="form-table" role="presentation">
					<tr>
						<th scope="row"><?php esc_html_e( 'Tracking mode', 'e2w-price-change-alerts' ); ?></th>
						<td>
							<fieldset>
								<label>
									<input type="radio"
										name="<?php echo esc_attr( self::OPTION ); ?>[mode]"
										value="all" <?php checked( 'all' === $mode ); ?> />
									<?php esc_html_e( 'All products', 'e2w-price-change-alerts' ); ?>
								</label>
								<br />
								<label>
									<input type="radio"
										name="<?php echo esc_attr( self::OPTION ); ?>[mode]"
										value="selected" <?php checked( 'selected' === $mode ); ?> <?php disabled( ! $selective_available ); ?> />
									<?php esc_html_e( 'Only selected products', 'e2w-price-change-alerts' ); ?>
								</label>
							</fieldset>
							<?php if ( ! $selective_available ) : ?>
								<p class="description">
									<?php if ( 'selected' === $mode ) : ?>
										<?php esc_html_e( 'Your saved "Only selected products" mode is kept, but without an active Pro license alerts are currently sent for all products.', 'e2w-price-change-alerts' ); ?>
									<?php endif; ?>
									<a href="<?php echo esc_url( e2w_price_change_alerts_fs()->get_upgrade_url() ); ?>">
										<?php esc_html_e( 'Upgrade to Pro to track only selected products.', 'e2w-price-change-alerts' ); ?>
									</a>
								</p>
							<?php else : ?>
								<p class="description">
									<?php esc_html_e( 'With "Only selected products", enable the "Track price changes" checkbox on each product you want to monitor.', 'e2w-price-change-alerts' ); ?>
								</p>
							<?php endif; ?>
						</td>
					</tr>
					<tr>
						<th scope="row"><?php esc_html_e( 'Recipients', 'e2w-price-change-alerts' ); ?></th>
						<td>
							<div id="e2w-pca-recipients">
								<?php foreach ( $recipients as $email ) : ?>
									<p>
										<input type="email" class="regular-text"
											name="<?php echo esc_attr( self::OPTION ); ?>[recipients][]"
											value="<?php echo esc_attr( $email ); ?>"
											placeholder="user@example.com" />
										<button type="button" class="button e2w-pca-remove"><?php esc_html_e( 'Remove', 'e2w-price-change-alerts' ); ?></button>
									</p>
								<?php endforeach; ?>
							</div>
							<button type="button" class="button" id="e2w-pca-add">
								<?php esc_html_e( 'Add email', 'e2w-price-change-alerts' ); ?>
							</button>
						</td>
					</tr>
					<?php
					// Секции premium-фич (аномалии, Telegram, Google Sheets,
					// категории) рендерятся своими классами.
					do_action( 'e2w_price_change_alerts_settings_rows' );
					?>
				</table>
				<?php submit_button(); ?>
			</form>
		</div>
		<?php
	}
}
