<?php
/**
 * License Page class
 *
 * Self-contained license management page without Factory Templates dependency.
 * Reuses existing factory-bootstrap-500 CSS framework.
 *
 * @package    Robin_Image_Optimizer
 * @subpackage Admin\Pages
 */

// Exit if accessed directly
if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

/**
 * Class WRIO_License_Page_View
 *
 * Handles the license management admin page.
 */
class WRIO_License_Page_View {

	/**
	 * Page ID
	 *
	 * @var string
	 */
	public $id = 'wrio_license';

	/**
	 * Page hook suffix
	 *
	 * @var string|false
	 */
	private $page_hook;

	/**
	 * Premium provider instance
	 *
	 * @var WRIO_Premium_Provider
	 * @phpstan-ignore-next-line property.onlyRead
	 */
	private $premium;

	/**
	 * License instance
	 *
	 * @var WRIO_License
	 * @phpstan-ignore-next-line property.onlyRead
	 */
	private $license;

	/**
	 * Whether premium is activated
	 *
	 * @var bool|null
	 */
	private $is_premium;

	/**
	 * Plan name
	 *
	 * @var string
	 */
	public $plan_name;

	/**
	 * Subscribe widget instance
	 *
	 * @var WRIO_Subscribe_Widget
	 */
	private $subscribe_widget;

	/**
	 * Constructor
	 */
	public function __construct() {
		$this->is_premium = null;
		$this->plan_name  = __( 'Robin image optimizer Premium', 'robin-image-optimizer' );

		// Initialize subscribe widget.
		$this->subscribe_widget = new WRIO_Subscribe_Widget();

		add_action( 'admin_menu', [ $this, 'register_page' ], 9 );
		add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_assets' ] );
		add_action( 'wp_ajax_wrio_license_action', [ $this, 'ajax_handler' ] );

		// Register this page in the Factory navigation menu
		$this->register_in_factory_menu();
	}

	/**
	 * Register this page in the Factory impressive menu system
	 *
	 * This allows the license page to appear in the left navigation bar
	 * alongside other Factory-registered pages.
	 *
	 * @return void
	 */
	private function register_in_factory_menu() {
		global $factory_impressive_page_menu;

		$page_url = admin_url( 'admin.php?page=' . $this->id );

		$factory_impressive_page_menu['robin-image-optimizer'][ $this->id ] = [
			'type'              => 'page',
			'url'               => $page_url,
			'title'             => __( 'License', 'robin-image-optimizer' ) . ' <span class="dashicons dashicons-admin-network"></span>',
			'short_description' => __( 'Product activation', 'robin-image-optimizer' ),
			'position'          => 10,
			'parent'            => 'rio_general',
		];
	}

	/**
	 * Initialize premium data
	 *
	 * Called late to ensure WRIO_Plugin is available.
	 *
	 * @return void
	 */
	private function init_premium() {
		if ( null !== $this->premium ) {
			return;
		}

		/**
		 * Initializes the premium provider instance.
		 *
		 * @var WRIO_Premium_Provider $premium
		 */
		$premium       = WRIO_Plugin::app()->premium;
		$this->premium = $premium;
		/**
		 * Gets the license instance from premium provider.
		 *
		 * @var WRIO_License $license
		 */
		$license          = $premium->get_license();
		$this->license    = $license;
		$this->is_premium = $premium->is_activate();
	}

	/**
	 * Register the admin page
	 *
	 * @return void
	 */
	public function register_page() {
		// Parent slug follows Factory pattern: {page_id}-{plugin_name}
		$parent_slug = 'rio_general-robin-image-optimizer';

		$this->page_hook = add_submenu_page(
			$parent_slug,
			__( 'License', 'robin-image-optimizer' ),
			__( 'License', 'robin-image-optimizer' ),
			'manage_options',
			$this->id,
			[ $this, 'render_page' ],
			90 // Position before About Us (which uses 100)
		);
	}

	/**
	 * Enqueue page assets
	 *
	 * @param string $hook Current admin page hook.
	 * @return void
	 */
	public function enqueue_assets( $hook ) {
		if ( $this->page_hook !== $hook ) {
			return;
		}

		wp_enqueue_script(
			'wrio-license-manager',
			WRIO_PLUGIN_URL . '/admin/assets/js/wrio-license-manager.js',
			[ 'jquery' ],
			WRIO_Plugin::app()->getPluginVersion(),
			true
		);

		// Enqueue the Factory bootstrap core CSS (provides .btn, .form-control, etc.)
		wp_enqueue_style(
			'wrio-bootstrap-core',
			WRIO_PLUGIN_URL . '/libs/factory/bootstrap/assets/css-min/bootstrap.core.min.css',
			[],
			WRIO_Plugin::app()->getPluginVersion()
		);

		// Enqueue the license manager CSS from Factory templates
		wp_enqueue_style(
			'wrio-license-manager',
			WRIO_PLUGIN_URL . '/libs/factory/templates/assets/css/license-manager.css',
			[ 'wrio-bootstrap-core' ],
			WRIO_Plugin::app()->getPluginVersion()
		);

		// Enqueue the impressive page template CSS for full layout
		wp_enqueue_style(
			'wrio-impressive-template',
			WRIO_PLUGIN_URL . '/libs/factory/templates/pages/templates/impressive/assets/css/impressive.page.template.css',
			[ 'wrio-bootstrap-core' ],
			WRIO_Plugin::app()->getPluginVersion()
		);

		// Enqueue subscribe widget CSS.
		wp_enqueue_style(
			'wrio-subscribe-widget',
			WRIO_PLUGIN_URL . '/admin/assets/css/wrio-subscribe-widget.css',
			[],
			WRIO_Plugin::app()->getPluginVersion()
		);

		// Hide internal pages from sidebar (Custom Folders, Nextgen Gallery)
		wp_add_inline_style(
			'wrio-impressive-template',
			'#io_folders_statistic-robin-image-optimizer-tab, #io_nextgen_gallery_statistic-robin-image-optimizer-tab { display: none !important; }'
		);
	}

	/**
	 * Handle AJAX license actions
	 *
	 * @return void
	 */
	public function ajax_handler() {
		// Verify nonce
		if ( ! isset( $_POST['_wpnonce'] ) || ! wp_verify_nonce( sanitize_text_field( wp_unslash( $_POST['_wpnonce'] ) ), 'wrio_license_action' ) ) {
			wp_send_json_error( [ 'message' => __( 'Security check failed.', 'robin-image-optimizer' ) ] );
		}

		// Check capabilities
		if ( ! current_user_can( 'manage_options' ) ) {
			wp_send_json_error( [ 'message' => __( 'You do not have permission to perform this action.', 'robin-image-optimizer' ) ] );
		}

		$this->init_premium();

		$action      = isset( $_POST['license_action'] ) ? sanitize_text_field( wp_unslash( $_POST['license_action'] ) ) : '';
		$license_key = isset( $_POST['licensekey'] ) ? trim( wp_unslash( $_POST['licensekey'] ) ) : '';

		$allowed_actions = [ 'activate', 'deactivate', 'unsubscribe' ];

		if ( empty( $action ) || ! in_array( $action, $allowed_actions, true ) ) {
			wp_send_json_error( [ 'message' => __( 'Invalid action.', 'robin-image-optimizer' ) ] );
		}

		try {
			switch ( $action ) {
				case 'activate':
					if ( empty( $license_key ) ) {
						wp_send_json_error( [ 'message' => __( 'Please enter a license key.', 'robin-image-optimizer' ) ] );
					}
					$this->premium->activate( $license_key );
					$message = __( 'Your license has been successfully activated.', 'robin-image-optimizer' );
					break;

				case 'deactivate':
					$this->premium->deactivate();
					$message = __( 'Your license has been deactivated.', 'robin-image-optimizer' );
					break;

				case 'unsubscribe':
					$this->premium->cancel_paid_subscription();
					$message = __( 'Your subscription has been cancelled.', 'robin-image-optimizer' );
					break;

				default:
					wp_send_json_error( [ 'message' => __( 'Unknown action.', 'robin-image-optimizer' ) ] );
			}

			wp_send_json_success( [ 'message' => $message ] );

		} catch ( Exception $e ) {
			wp_send_json_error( [ 'message' => $e->getMessage() ] );
		}
	}

	/**
	 * Render the admin page
	 *
	 * @return void
	 */
	public function render_page() {
		$this->init_premium();
		$min_height = $this->calculate_menu_height();
		?>
		<div id="tsdk_banner" class="robin-banner"></div>
		<div id="WBCR" class="wrap">
			<div class="wbcr-factory-templates-759-impressive-page-template factory-bootstrap-500 factory-fontawesome-000">
				<div class="wbcr-factory-page wbcr-factory-page-<?php echo esc_attr( $this->id ); ?>">
					<?php $this->render_header(); ?>
					<div class="wbcr-factory-left-navigation-bar">
						<?php $this->render_page_menu(); ?>
					</div>
					<div class="wbcr-factory-page-inner-wrap">
						<div class="wbcr-factory-content-section wbcr-fullwidth">
							<div class="wbcr-factory-content" style="min-height:<?php echo esc_attr( (string) $min_height ); ?>px">
								<div id="wrio-license-wrapper"
									data-loader="<?php echo esc_url( admin_url( 'images/spinner.gif' ) ); ?>"
									data-nonce="<?php echo esc_attr( wp_create_nonce( 'wrio_license_action' ) ); ?>">
									<?php $this->render_license_form(); ?>
								</div>
							</div>
						</div>
					</div>
				</div>
				<div class="clearfix"></div>
			</div>
		</div>
		<?php
	}

	/**
	 * Calculate minimum height for content based on menu items
	 *
	 * @return int
	 */
	private function calculate_menu_height() {
		global $factory_impressive_page_menu;

		$menu_scope = 'robin-image-optimizer';
		$min_height = 0;

		if ( isset( $factory_impressive_page_menu[ $menu_scope ] ) ) {
			foreach ( $factory_impressive_page_menu[ $menu_scope ] as $page ) {
				if ( ! isset( $page['parent'] ) || empty( $page['parent'] ) ) {
					$min_height += 77;
				}
			}
		}

		return $min_height;
	}

	/**
	 * Render the page header
	 *
	 * @return void
	 */
	private function render_header() {
		?>
		<div class="wbcr-factory-page-header">
			<div class="wbcr-factory-header-logo">
				<?php echo esc_html( WRIO_Plugin::app()->getPluginTitle() ); ?>
				<span class="version"><?php echo esc_html( WRIO_Plugin::app()->getPluginVersion() ); ?></span>
				<span class="dash">—</span>
			</div>
			<div class="wbcr-factory-header-title">
				<h2><?php esc_html_e( 'Page', 'robin-image-optimizer' ); ?>: <?php esc_html_e( 'License', 'robin-image-optimizer' ); ?></h2>
			</div>
			<div class="wbcr-factory-control">
					<?php do_action( 'wbcr_factory_pages_impressive_header', WRIO_Plugin::app()->getPluginName() ); ?>
			</div>
		</div>
		<?php
	}

	/**
	 * Render the left navigation menu
	 *
	 * @return void
	 */
	private function render_page_menu() {
		global $factory_impressive_page_menu;

		$menu_scope   = 'robin-image-optimizer';
		$self_page_id = $this->id;

		if ( ! isset( $factory_impressive_page_menu[ $menu_scope ] ) ) {
			return;
		}

		$page_menu = $factory_impressive_page_menu[ $menu_scope ];

		// Sort by position (descending - higher position = higher in menu)
		uasort(
			$page_menu,
			function ( $a, $b ) {
				return $b['position'] <=> $a['position'];
			}
		);

		?>
		<ul>
			<?php
			// First, render parent pages
			foreach ( $page_menu as $page_screen => $page ) :
				if ( ! empty( $page['parent'] ) ) {
					continue;
				}
				$active_tab = ( $page_screen === $self_page_id ) ? ' wbcr-factory-active-tab' : '';
				?>
				<li class="wbcr-factory-nav-tab<?php echo esc_attr( $active_tab ); ?>">
					<a href="<?php echo esc_url( $page['url'] ); ?>"
						id="<?php echo esc_attr( $page_screen ); ?>-tab"
						class="wbcr-factory-tab__link js-wbcr-factory-tab__link">
						<div class="wbcr-factory-tab__title">
							<?php echo wp_kses( $page['title'], [ 'span' => [ 'class' => [] ] ] ); ?>
						</div>
						<?php if ( ! empty( $page['short_description'] ) ) : ?>
							<div class="wbcr-factory-tab__short-description">
								<?php echo esc_html( $page['short_description'] ); ?>
							</div>
						<?php endif; ?>
					</a>
				</li>
			<?php endforeach; ?>

			<?php
			// Then, render child pages
			foreach ( $page_menu as $page_screen => $page ) :
				if ( empty( $page['parent'] ) ) {
					continue;
				}
				$active_tab = ( $page_screen === $self_page_id ) ? ' wbcr-factory-active-tab' : '';
				?>
				<li class="wbcr-factory-nav-tab<?php echo esc_attr( $active_tab ); ?>">
					<a href="<?php echo esc_url( $page['url'] ); ?>"
						id="<?php echo esc_attr( $page_screen ); ?>-tab"
						class="wbcr-factory-tab__link js-wbcr-factory-tab__link">
						<div class="wbcr-factory-tab__title">
							<?php echo wp_kses( $page['title'], [ 'span' => [ 'class' => [] ] ] ); ?>
						</div>
						<?php if ( ! empty( $page['short_description'] ) ) : ?>
							<div class="wbcr-factory-tab__short-description">
								<?php echo esc_html( $page['short_description'] ); ?>
							</div>
						<?php endif; ?>
					</a>
				</li>
			<?php endforeach; ?>
		</ul>
		<?php
	}

	/**
	 * Get license type for CSS class
	 *
	 * @return string free|gift|trial|paid
	 */
	private function get_license_type() {
		if ( ! $this->is_premium || null === $this->license ) {
			return 'free';
		}

		if ( $this->license->is_lifetime() ) {
			return 'gift';
		}

		if ( $this->license->get_expiration_time( 'days' ) < 1 ) {
			return 'trial';
		}

		return 'paid';
	}

	/**
	 * Get hidden license key (first 8 + last 4 characters)
	 *
	 * @return string
	 */
	private function get_hidden_license_key() {
		if ( ! $this->is_premium || null === $this->license ) {
			return '';
		}

		return $this->license->get_masked_key();
	}



	/**
	 * Get unified expiration display string
	 *
	 * @return string
	 */
	private function get_expiration_display() {
		if ( ! $this->is_premium || null === $this->license ) {
			return __( 'N/A', 'robin-image-optimizer' );
		}

		return $this->license->get_expiration_display();
	}


	/**
	 * Render the license form
	 *
	 * @return void
	 */
	private function render_license_form() {
		$license_type = $this->get_license_type();

		$plan_title = __( 'Free', 'robin-image-optimizer' );
		$has_pro    = null !== $this->premium && null !== $this->premium->get_plan_id();
		if ( $has_pro ) {
			$plan_title = __( 'Pro', 'robin-image-optimizer' );
		}

		$license_status_label = __( 'License', 'robin-image-optimizer' );

		?>
		<div id="license-manager"
			class="factory-bootstrap-500 onp-page-wrap <?php echo esc_attr( $license_type ); ?>-license-manager-content">

			<?php if ( ! $has_pro ) : ?>
				<?php $this->render_upgrade_banner(); ?>
			<?php endif; ?>

			<div class="onp-container">
				<div class="license-details">
					<h3>
						<?php echo esc_html( $license_status_label ); ?>
						<span class="license-info-badge <?php echo esc_attr( 'license-info-badge--plan-' . ( $has_pro ? 'pro' : 'free' ) ); ?>">
							<?php echo esc_html( $plan_title ); ?>
						</span>
						<?php if ( $this->is_premium ) : ?>
						<span class="license-info-badge license-info-badge--expiration">
							<?php echo esc_html( $this->get_expiration_display() ); ?>
						</span>
						<?php endif; ?>
					</h3>
				</div>

				<div class="license-input">
					<form action="" method="post">
						<?php if ( $this->is_premium ) : ?>
							<p><?php esc_html_e( 'Have a key to activate the premium version? Paste it here:', 'robin-image-optimizer' ); ?></p>
						<?php else : ?>
							<p><?php esc_html_e( 'Have a key to activate the plugin? Paste it here:', 'robin-image-optimizer' ); ?></p>
						<?php endif; ?>

						

						<div class="license-key-wrap">
							<input
								type="text"
								id="license-key"
								name="licensekey"
								value=""
								class="form-control"
								placeholder="<?php echo esc_html( $this->get_hidden_license_key() ); ?>"
							/>

							<?php if ( $this->is_premium ) : ?>
								<button data-action="deactivate" class="button button-primary wrio-license-btn" type="button" id="license-submit">
									<?php esc_html_e( 'Deactivate', 'robin-image-optimizer' ); ?>
								</button>
							<?php else : ?>
								<button data-action="activate" class="button button-primary wrio-license-btn" type="button" id="license-submit">
									<?php esc_html_e( 'Activate', 'robin-image-optimizer' ); ?>
								</button>
							<?php endif; ?>
						</div>

						<?php $this->render_learnmore_section(); ?>

						<div id="license-form-error-container"></div>
						<?php $this->render_freemius_migration_notice(); ?>
					</form>
				</div>

			</div>

			<?php $this->subscribe_widget->render(); ?>
		</div>
		<?php
	}

	/**
	 * Render the upgrade banner for free users
	 *
	 * @return void
	 */
	private function render_upgrade_banner() {
		$support     = WRIO_Plugin::app()->get_support();
		$pricing_url = $support->get_pricing_url( true, 'license_banner' );
		?>
		<div class="wrio-license-upgrade-banner">
			<div class="wrio-license-upgrade-icon">
				<span>⚡</span>
			</div>
			<div class="wrio-license-upgrade-content">
				<h2 class="wrio-license-upgrade-title"><?php esc_html_e( 'Supercharge Your Image Optimization', 'robin-image-optimizer' ); ?></h2>
				<p class="wrio-license-upgrade-subtitle"><?php esc_html_e( "You're using the free version. Upgrade to unlock unlimited conversions and premium features.", 'robin-image-optimizer' ); ?></p>
				<div class="wrio-license-upgrade-features">
					<div class="wrio-license-upgrade-feature">
						<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor">
							<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"></path>
						</svg>
						<span><?php esc_html_e( 'Unlimited AVIF', 'robin-image-optimizer' ); ?></span>
					</div>
					<div class="wrio-license-upgrade-feature">
						<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor">
							<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"></path>
						</svg>
						<span><?php esc_html_e( 'Custom Folders Optimization', 'robin-image-optimizer' ); ?></span>
					</div>
					<div class="wrio-license-upgrade-feature">
						<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor">
							<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"></path>
						</svg>
						<span><?php esc_html_e( 'NextGen Gallery Support', 'robin-image-optimizer' ); ?></span>
					</div>
					<div class="wrio-license-upgrade-feature">
						<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor">
							<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"></path>
						</svg>
						<span><?php esc_html_e( 'Priority Support', 'robin-image-optimizer' ); ?></span>
					</div>
					<div class="wrio-license-upgrade-feature">
						<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor">
							<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"></path>
						</svg>
						<span><?php esc_html_e( 'More Compression Modes', 'robin-image-optimizer' ); ?></span>
					</div>
					<div class="wrio-license-upgrade-feature">
						<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor">
							<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"></path>
						</svg>
						<span><?php esc_html_e( 'Super Page Cache Pro', 'robin-image-optimizer' ); ?></span>
					</div>
				</div>
				<a href="<?php echo esc_url( $pricing_url ); ?>" class="wrio-license-upgrade-button" target="_blank" rel="noopener">
					<?php esc_html_e( 'View Pro Plans', 'robin-image-optimizer' ); ?> →
				</a>
			</div>
		</div>
		<?php
	}

	/**
	 * Render learn more section
	 *
	 * @return void
	 */
	private function render_learnmore_section() {
		$support = WRIO_Plugin::app()->get_support();

		if ( ! $this->is_premium ) :
			?>
			<p style="margin-top: 10px;">
				<?php
				printf(
					wp_kses(
						/* translators: %1$s: opening link tag, %2$s: closing link tag */
						__( 'Can\'t find your key? Go to %1$sthis page%2$s and login using the e-mail address associated with your purchase.', 'robin-image-optimizer' ),
						[
							'a' => [
								'href'   => [],
								'target' => [],
								'rel'    => [],
							],
						]
					),
					'<a href="' . esc_url( $support->get_contacts_url( true, 'license_page' ) ) . '" target="_blank" rel="noopener">',
					'</a>'
				);
				?>
			</p>
			<?php
		endif;
	}

	/**
	 * Render migration notice for Freemius license holders
	 *
	 * @return void
	 */
	private function render_freemius_migration_notice() {
		if ( ! $this->is_premium || null === $this->license || $this->license->get_source() !== WRIO_License::SOURCE_FREEMIUS ) {
			return;
		}
		?>
		<div class="wrio-migration-notice">
			<p>
				<strong><?php esc_html_e( 'Action Required:', 'robin-image-optimizer' ); ?></strong>
				<?php esc_html_e( 'Your license was issued through our previous licensing system (Freemius). Please contact support to receive a new Themeisle license key for continued access to updates and support.', 'robin-image-optimizer' ); ?>
			</p>
			<p>
				<a href="<?php echo esc_url( WRIO_Plugin::app()->get_support()->get_contacts_url( true, 'license_migration' ) ); ?>" target="_blank" rel="noopener" class="button button-primary">
					<?php esc_html_e( 'Contact Support', 'robin-image-optimizer' ); ?>
				</a>
			</p>
		</div>
		<?php
	}
}
