<?php
/**
 * Admin Settings Page
 *
 * @package MBMaxCf7Relay
 */

namespace MBMaxCf7Relay\Includes\Admin;

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

/**
 * Страница настроек плагина.
 */
class SettingsPage {

	/**
	 * Сервис лицензии.
	 *
	 * @var \MBMaxCf7Relay\Includes\Services\LicenseService
	 */
	private $license_service;

	/**
	 * Конструктор.
	 *
	 * @param \MBMaxCf7Relay\Includes\Services\LicenseService $license_service Сервис лицензии.
	 */
	public function __construct( $license_service ) {
		$this->license_service = $license_service;
	}

	/**
	 * Зарегистрировать хуки страницы.
	 *
	 * @return void
	 */
	public function register_hooks() {
		add_action( 'admin_menu', array( $this, 'register_menu' ) );
		add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_assets' ) );
	}

	/**
	 * Добавить страницу в меню Settings.
	 *
	 * @return void
	 */
	public function register_menu() {
		add_options_page(
			'CACR Отправка заявок с сайта в Мессенджер MAX',
			'CACR Отправка заявок с сайта в Мессенджер MAX',
			'manage_options',
			'cacr-relay-cf7-max',
			array( $this, 'render_page' )
		);
	}

	/**
	 * Подключить ассеты страницы настроек.
	 *
	 * @param string $hook_suffix Суффикс текущей admin-страницы.
	 * @return void
	 */
	public function enqueue_assets( $hook_suffix ) {
		if ( 'settings_page_cacr-relay-cf7-max' !== $hook_suffix ) {
			return;
		}

		$options = \MBMaxCf7Relay\Includes\Plugin::get_options();
		$domain  = (string) wp_parse_url( home_url( '/' ), PHP_URL_HOST );

		wp_enqueue_style(
			'mb-max-cf7-relay-admin-settings',
			MB_MAX_CF7_RELAY_URI . 'assets/admin/settings.css',
			array(),
			MB_MAX_CF7_RELAY_VERSION
		);

		wp_enqueue_script(
			'mb-max-cf7-relay-admin-settings',
			MB_MAX_CF7_RELAY_URI . 'assets/admin/settings.js',
			array( 'jquery' ),
			MB_MAX_CF7_RELAY_VERSION,
			true
		);

		$config = array(
			'ajaxUrl'           => admin_url( 'admin-ajax.php' ),
			'nonce'             => wp_create_nonce( 'mb_max_cf7_onboarding' ),
			'hasIntegrationKey' => '' !== $options['integration_key'],
			'siteHost'          => $domain,
			'integrationHash'   => substr( md5( (string) $options['integration_key'] ), 0, 12 ),
		);

		wp_add_inline_script(
			'mb-max-cf7-relay-admin-settings',
			'window.mbMaxCf7OnboardingConfig = ' . wp_json_encode( $config ) . ';',
			'before'
		);
	}

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

		$notice = null;

		if ( isset( $_POST['mb_max_cf7_save_settings'] ) && check_admin_referer( 'mb_max_cf7_settings' ) ) {
			$options = \MBMaxCf7Relay\Includes\Plugin::get_options();
			$license_ttl_raw            = isset( $_POST['license_ttl'] ) ? sanitize_text_field( wp_unslash( $_POST['license_ttl'] ) ) : '300';
			$options['integration_key']   = sanitize_text_field( wp_unslash( $_POST['integration_key'] ?? '' ) );
			$options['license_ttl']       = max( 60, (int) $license_ttl_raw );
			$options['debug_mode']        = isset( $_POST['debug_mode'] ) ? 1 : 0;

			\MBMaxCf7Relay\Includes\Plugin::save_options( $options );
			delete_transient( \MBMaxCf7Relay\Includes\Services\LicenseService::CACHE_KEY );

			$notice = array(
				'type'    => 'success',
				'message' => 'Настройки сохранены.',
			);
		}

		if ( isset( $_POST['mb_max_cf7_check_license'] ) && check_admin_referer( 'mb_max_cf7_settings' ) ) {
			$status = $this->license_service->check_license( true );
			$notice = array(
				'type'    => ! empty( $status['active'] ) ? 'success' : 'error',
				'message' => $status['message'] ?? 'Проверка лицензии завершена.',
			);
		}

		if ( isset( $_POST['mb_max_cf7_send_test'] ) && check_admin_referer( 'mb_max_cf7_settings' ) ) {
			$result = $this->send_test_lead();
			if ( is_wp_error( $result ) ) {
				$notice = array(
					'type'    => 'error',
					'message' => $result->get_error_message(),
				);
			} else {
				$notice = array(
					'type'    => 'success',
					'message' => $result['message'] ?? 'Тестовая заявка отправлена.',
				);
			}
		}

		$options = \MBMaxCf7Relay\Includes\Plugin::get_options();
		$status  = $this->license_service->get_last_status();
		$portal_url = \MBMaxCf7Relay\Includes\Plugin::get_portal_base_url();
		$domain = (string) wp_parse_url( home_url( '/' ), PHP_URL_HOST );
		?>
		<div class="wrap">
			<h1>CACR Отправка заявок с сайта в Мессенджер MAX</h1>

			<?php if ( is_array( $notice ) ) : ?>
				<div class="notice notice-<?php echo esc_attr( $notice['type'] ); ?> is-dismissible"><p><?php echo esc_html( $notice['message'] ); ?></p></div>
			<?php endif; ?>

			<div class="notice notice-info inline">
				<p><strong>Работа только через CACR:</strong></p>
				<ol>
					<li>Войдите в кабинет: <a href="https://cacr.ru/cabinet/bots/max_cf7/" target="_blank" rel="noopener noreferrer">https://cacr.ru/cabinet/bots/max_cf7/</a>.</li>
					<li>Создайте интеграцию <code>max_cf7</code> для домена <code><?php echo esc_html( $domain ); ?></code>.</li>
					<li>Установите статус интеграции <code>active</code> и настройте получателя (личка/чат) в кабинете CACR.</li>
					<li>Сгенерируйте ключ в кабинете CACR и вставьте его в поле ниже.</li>
				</ol>
				<p><strong>Важно:</strong> ключ генерируется в кабинете CACR. На клиентском сайте ключ не создается.</p>
				<p><strong>Источник лидов:</strong> Contact Form 7 и другие формы сайта, которые отправляют письмо через <code>wp_mail</code> (включая отправку через <code>/wp-admin/admin-post.php</code>).</p>
				<p><strong>Допуслуга CACR:</strong> для одного сайта можно включить маршрутизацию заявок по формам и полям формы. Логика маршрутизации хранится и обслуживается на стороне CACR, а сайт продолжает работать через один ключ интеграции и одного получателя по умолчанию с резервным получателем при необходимости.</p>
			</div>

			<form method="post">
				<?php wp_nonce_field( 'mb_max_cf7_settings' ); ?>
				<table class="form-table">
					<tr>
						<th scope="row">Портал</th>
						<td>
							<code><?php echo esc_html( $portal_url ); ?></code>
							<p class="description">Все запросы и отправка лидов идут только через этот портал.</p>
						</td>
					</tr>
					<tr>
						<th scope="row"><label for="integration_key">Ключ интеграции (из кабинета CACR)</label></th>
						<td>
							<input type="text" id="integration_key" name="integration_key" class="regular-text code" value="<?php echo esc_attr( $options['integration_key'] ); ?>" />
							<p class="description">Ключ должен совпадать с ключом интеграции <code>max_cf7</code> в кабинете CACR.</p>
						</td>
					</tr>
					<tr>
						<th scope="row"><label for="license_ttl">Интервал кэша лицензии (сек.)</label></th>
						<td>
							<input type="number" min="60" step="60" id="license_ttl" name="license_ttl" value="<?php echo esc_attr( (string) $options['license_ttl'] ); ?>" />
							<p class="description">Рекомендуемо: 300 секунд.</p>
						</td>
					</tr>
					<tr>
						<th scope="row">Debug лог</th>
						<td>
							<label><input type="checkbox" name="debug_mode" value="1" <?php checked( ! empty( $options['debug_mode'] ) ); ?> /> Логировать ошибки в PHP error_log</label>
						</td>
					</tr>
				</table>

				<p class="submit">
					<button type="submit" name="mb_max_cf7_save_settings" class="button button-primary">Сохранить настройки</button>
					<button type="submit" name="mb_max_cf7_check_license" class="button button-secondary">Проверить ключ и лицензию</button>
					<button type="submit" name="mb_max_cf7_send_test" class="button button-secondary">Отправить тестовую заявку в MAX</button>
				</p>
			</form>

			<?php if ( ! empty( $status ) ) : ?>
				<h2>Последняя проверка лицензии</h2>
				<table class="widefat striped" style="max-width: 900px;">
					<tbody>
						<tr><td><strong>Статус</strong></td><td><?php echo ! empty( $status['active'] ) ? 'Активна' : 'Неактивна'; ?></td></tr>
						<tr><td><strong>Причина</strong></td><td><?php echo esc_html( (string) ( $status['reason'] ?? '' ) ); ?></td></tr>
						<tr><td><strong>Сообщение</strong></td><td><?php echo esc_html( (string) ( $status['message'] ?? '' ) ); ?></td></tr>
						<tr><td><strong>Тариф</strong></td><td><?php echo esc_html( (string) ( $status['plan'] ?? '-' ) ); ?></td></tr>
						<tr><td><strong>Действует с</strong></td><td><?php echo esc_html( (string) ( $status['valid_from'] ?? '-' ) ); ?></td></tr>
						<tr><td><strong>Действует до</strong></td><td><?php echo esc_html( (string) ( $status['valid_until'] ?? '-' ) ); ?></td></tr>
						<tr><td><strong>ID интеграции CACR</strong></td><td><?php echo esc_html( (string) ( $status['integration_id'] ?? '-' ) ); ?></td></tr>
						<tr><td><strong>Сайт интеграции в CACR</strong></td><td><?php echo esc_html( (string) ( $status['integration_site_url'] ?? '-' ) ); ?></td></tr>
						<tr><td><strong>Проверено</strong></td><td><?php echo esc_html( (string) ( $status['checked_at'] ?? '-' ) ); ?></td></tr>
					</tbody>
				</table>
			<?php endif; ?>
		</div>
		<?php
	}

	/**
	 * Отправить тестовую заявку в endpoint CACR.
	 *
	 * @return array|\WP_Error
	 */
	private function send_test_lead() {
		$options = \MBMaxCf7Relay\Includes\Plugin::get_options();
		if ( '' === $options['integration_key'] ) {
			return new \WP_Error( 'integration_key_missing', 'Сначала укажите ключ интеграции и сохраните настройки.' );
		}

		$url = untrailingslashit( \MBMaxCf7Relay\Includes\Plugin::get_portal_base_url() ) . '/wp-json/mb/v1/max-cf7/lead';
		$now = current_time( 'mysql' );

		$payload = array(
			'integration_key' => (string) $options['integration_key'],
			'site_url'        => home_url( '/' ),
			'site_domain'     => (string) wp_parse_url( home_url( '/' ), PHP_URL_HOST ),
			'form_id'         => 0,
			'form_title'      => 'Тестовая заявка из настроек плагина',
			'submitted_at'    => $now,
			'page_url'        => home_url( '/wp-admin/options-general.php?page=cacr-relay-cf7-max' ),
			'user_ip'         => isset( $_SERVER['REMOTE_ADDR'] ) ? sanitize_text_field( wp_unslash( (string) $_SERVER['REMOTE_ADDR'] ) ) : '',
			'user_agent'      => isset( $_SERVER['HTTP_USER_AGENT'] ) ? sanitize_text_field( wp_unslash( (string) $_SERVER['HTTP_USER_AGENT'] ) ) : '',
			'fields'          => array(
				'test_mode'   => 'ручной',
				'test_time'   => $now,
				'test_source' => 'настройки плагина CACR MAX',
			),
		);

		$response = \MBMaxCf7Relay\Includes\Plugin::post_portal_json( $url, $payload, 15 );

		if ( is_wp_error( $response ) ) {
			return new \WP_Error( 'test_request_failed', 'Не удалось отправить тестовый запрос: ' . $response->get_error_message() );
		}

		$code = (int) wp_remote_retrieve_response_code( $response );
		$raw  = wp_remote_retrieve_body( $response );
		$data = json_decode( (string) $raw, true );

		if ( $code < 200 || $code >= 300 || ! is_array( $data ) || empty( $data['success'] ) ) {
			$remote_message = is_array( $data ) && ! empty( $data['message'] )
				? sanitize_text_field( (string) $data['message'] )
				: 'Ошибка ответа CACR.';
			$remote_code = is_array( $data ) && ! empty( $data['code'] )
				? sanitize_key( (string) $data['code'] )
				: 'unknown_error';
			$details = '';
			if ( is_array( $data ) && ! empty( $data['data'] ) ) {
				$details_raw = wp_json_encode( $data['data'], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES );
				if ( is_string( $details_raw ) && '' !== $details_raw ) {
					$details = '; details=' . $details_raw;
				}
			}

			return new \WP_Error(
				'test_delivery_failed',
				'Тестовая заявка не доставлена. ' . $remote_message . ' (code=' . $remote_code . ', http=' . $code . $details . ')'
			);
		}

		$recipient_type = is_array( $data ) && ! empty( $data['data']['recipient_type'] )
			? sanitize_key( (string) $data['data']['recipient_type'] )
			: 'direct';
		$delivery_hint = 'group' === $recipient_type
			? 'Тестовая заявка отправлена. Проверьте приватный чат в MAX.'
			: 'Тестовая заявка отправлена. Проверьте личные сообщения в MAX.';

		return array(
			'ok'      => true,
			'message' => $delivery_hint,
		);
	}
}
