<?php
/**
 * Powiadomienia wzrostowe (growth) w panelu — wyłącznie wersja darmowa.
 *
 * Dwa nienachalne, zamykalne komunikaty pokazywane TYLKO na stronach wtyczki:
 *  1. Prośba o ocenę na WordPress.org po realnym użyciu (>= N wystawionych faktur).
 *  2. Upsell do wersji Pro (ukrywany, gdy wykryto wtyczkę Pro / licencjonowanie).
 *
 * Stan zamknięcia trzymamy w user_meta (per użytkownik). Brak nachalności:
 * jednorazowe zamknięcie = koniec; prośba o ocenę nie wraca po kliknięciu.
 *
 * @package KSEF\WordPress
 */

namespace KSEF\WordPress\Admin;

// phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.PreparedSQL.InterpolatedNotPrepared, PluginCheck.Security.DirectDB.UnescapedDBParameter -- Liczba faktur z własnej tabeli gksef_*, nazwa z $wpdb->prefix, wynik cache'owany w transient (6h).

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

/**
 * Growth notices (review prompt + Pro upsell) dla wersji darmowej.
 */
class Growth_Notices {

	const REVIEW_URL  = 'https://wordpress.org/support/plugin/prostafaktura-ksef/reviews/#new-post';
	const PRICING_URL = 'https://prostafakturaksef.pl/cennik';

	/** Próg „realnego użycia" do prośby o ocenę. */
	const MIN_INVOICES_FOR_REVIEW = 3;

	/** Klucze user_meta przechowujące zamknięcie. */
	const META_REVIEW = 'ksef_notice_review_dismissed';
	const META_UPSELL = 'ksef_notice_upsell_dismissed';

	/**
	 * Rejestracja hooków.
	 *
	 * @return void
	 */
	public static function register(): void {
		add_action( 'admin_notices', [ self::class, 'render' ] );
		add_action( 'wp_ajax_ksef_dismiss_notice', [ self::class, 'ajax_dismiss' ] );
	}

	/**
	 * Czy jesteśmy na stronie wtyczki (slug zaczyna się od ksef-)?
	 *
	 * @return bool
	 */
	private static function on_plugin_page(): bool {
		// Tylko odczyt do warunku UI; brak akcji zmieniającej stan — nonce zbędny.
		$page = isset( $_GET['page'] ) ? sanitize_key( wp_unslash( $_GET['page'] ) ) : ''; // phpcs:ignore WordPress.Security.NonceVerification.Recommended
		return '' !== $page && 0 === strpos( $page, 'ksef-' );
	}

	/**
	 * Czy działa wersja Pro / licencjonowanie? Wtedy nie pokazujemy upsellu.
	 *
	 * @return bool
	 */
	private static function is_pro(): bool {
		return class_exists( '\KSEF\WordPress\Licensing\License_Manager' );
	}

	/**
	 * Liczba wystawionych faktur (cache 6h) — proxy „realnego użycia".
	 *
	 * @return int
	 */
	private static function issued_invoices_count(): int {
		$cached = get_transient( 'ksef_outgoing_count' );
		if ( false !== $cached ) {
			return (int) $cached;
		}
		global $wpdb;
		$table = $wpdb->prefix . 'gksef_outgoing_invoices';
		$count = 0;
		if ( $wpdb->get_var( $wpdb->prepare( 'SHOW TABLES LIKE %s', $table ) ) === $table ) {
			$count = (int) $wpdb->get_var( "SELECT COUNT(*) FROM {$table}" );
		}
		set_transient( 'ksef_outgoing_count', $count, 6 * HOUR_IN_SECONDS );
		return $count;
	}

	/**
	 * Render powiadomień. Priorytet: prośba o ocenę (większa wartość), w innym
	 * wypadku upsell. Naraz pokazujemy maksymalnie jeden komunikat.
	 *
	 * @return void
	 */
	public static function render(): void {
		if ( ! current_user_can( 'manage_options' ) || ! self::on_plugin_page() ) {
			return;
		}

		$user_id = get_current_user_id();

		// 1) Prośba o ocenę — po realnym użyciu, jeśli jeszcze nie zamknięta.
		if (
			! get_user_meta( $user_id, self::META_REVIEW, true )
			&& self::issued_invoices_count() >= self::MIN_INVOICES_FOR_REVIEW
		) {
			self::render_notice(
				'review',
				sprintf(
					/* translators: %s: liczba wystawionych faktur */
					esc_html__( 'Wystawiłeś już %s faktur do KSeF przez KSeF e-Faktury 🎉 Jeśli wtyczka oszczędza Ci czas, poświęć chwilę na krótką ocenę — to ogromnie pomaga innym firmom sprawnie wdrożyć KSeF.', 'prostafaktura-ksef' ),
					esc_html( (string) self::issued_invoices_count() )
				),
				esc_url( self::REVIEW_URL ),
				esc_html__( 'Oceń wtyczkę ★★★★★', 'prostafaktura-ksef' )
			);
			return;
		}

		// 2) Upsell do Pro — tylko w wersji darmowej.
		if (
			! self::is_pro()
			&& ! get_user_meta( $user_id, self::META_UPSELL, true )
		) {
			self::render_notice(
				'upsell',
				esc_html__( 'Potrzebujesz faktur kosztowych z KSeF, korekt, automatycznego wystawiania z WooCommerce i raportów? Plan Pro dodaje to wszystko już od 10 zł/mies. (120 zł rocznie), z 30-dniową gwarancją zwrotu.', 'prostafaktura-ksef' ),
				esc_url( self::PRICING_URL ),
				esc_html__( 'Zobacz plan Pro', 'prostafaktura-ksef' )
			);
		}
	}

	/**
	 * Wypisuje pojedynczy komunikat + skrypt zamknięcia (AJAX, nonce).
	 *
	 * @param string $type        'review' | 'upsell'.
	 * @param string $message     Treść (już zescapowana).
	 * @param string $action_url  URL przycisku (już zescapowany).
	 * @param string $action_text Etykieta przycisku (już zescapowana).
	 * @return void
	 */
	private static function render_notice( string $type, string $message, string $action_url, string $action_text ): void {
		$nonce = wp_create_nonce( 'ksef_dismiss_notice' );
		?>
		<div class="notice notice-info is-dismissible ksef-growth-notice" data-ksef-notice="<?php echo esc_attr( $type ); ?>" data-ksef-nonce="<?php echo esc_attr( $nonce ); ?>">
			<p style="display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin:.6em 0;">
				<strong style="color:#b45309;">e-Faktury KSeF</strong>
				<span style="flex:1 1 320px;min-width:260px;"><?php echo wp_kses_post( $message ); ?></span>
				<a href="<?php echo esc_url( $action_url ); ?>" target="_blank" rel="noopener" class="button button-primary"><?php echo esc_html( $action_text ); ?></a>
			</p>
		</div>
		<?php ob_start(); ?>
		( function () {
			var el = document.querySelector( '.ksef-growth-notice[data-ksef-notice="<?php echo esc_js( $type ); ?>"]' );
			if ( ! el ) { return; }
			function dismiss() {
				var body = new URLSearchParams();
				body.set( 'action', 'ksef_dismiss_notice' );
				body.set( 'notice', el.getAttribute( 'data-ksef-notice' ) );
				body.set( 'nonce', el.getAttribute( 'data-ksef-nonce' ) );
				fetch( ajaxurl, { method: 'POST', credentials: 'same-origin', headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, body: body.toString() } );
			}
			// Zamknięcie krzyżykiem WP oraz kliknięciem przycisku akcji.
			el.addEventListener( 'click', function ( e ) {
				if ( e.target.classList.contains( 'notice-dismiss' ) || e.target.classList.contains( 'button-primary' ) ) {
					dismiss();
				}
			} );
		} )();
		<?php Modern_Shell::inline_script( 'ksef-growth-notice', ob_get_clean() ); ?>
		<?php
	}

	/**
	 * AJAX: zapis zamknięcia komunikatu w user_meta.
	 *
	 * @return void
	 */
	public static function ajax_dismiss(): void {
		check_ajax_referer( 'ksef_dismiss_notice', 'nonce' );
		if ( ! current_user_can( 'manage_options' ) ) {
			wp_send_json_error( '', 403 );
		}
		$notice = isset( $_POST['notice'] ) ? sanitize_key( wp_unslash( $_POST['notice'] ) ) : '';
		$key    = 'review' === $notice ? self::META_REVIEW : ( 'upsell' === $notice ? self::META_UPSELL : '' );
		if ( '' === $key ) {
			wp_send_json_error( '', 400 );
		}
		update_user_meta( get_current_user_id(), $key, 1 );
		wp_send_json_success();
	}
}
