<?php
/**
 * Wave Access – Lizenzverwaltung
 *
 * Zentrale Lizenzlogik für alle Tarife:
 *   free   – keine Lizenz (wordpress.org-Version)
 *   pro    – 1 Site: Statement-Generator, PDF-Bericht, unbegrenzter Audit + CSV
 *   ai     – wie pro, plus KI-Funktionen (Alt-Texte, Leichte Sprache, Vorlesen)
 *   agency – wie ai, bis 25 Sites, White-Label
 *
 * Aktivierung gegen den Wave-Lizenzserver (serv01). Antwort-Contract:
 *   POST {server}/activate  body: license_key, site_url
 *   → { valid: bool, plan: 'pro'|'ai'|'agency', expires: 'Y-m-d',
 *       sites_used: int, sites_max: int, message?: string }
 *   POST {server}/check     body: license_key, site_url  → wie oben
 *   POST {server}/deactivate body: license_key, site_url → { ok: bool }
 */

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

class Wave_License {

	const OPT       = 'wave_license';
	const SERVER    = 'https://wavetools.io/api/wave-license/v1';
	const CRON_HOOK = 'wave_license_daily_check';

	private static $instance = null;

	public static function instance() {
		if ( null === self::$instance ) self::$instance = new self();
		return self::$instance;
	}

	private function __construct() {
		add_action( 'admin_post_wave_license_action', array( $this, 'handle_form' ) );
		add_action( self::CRON_HOOK, array( $this, 'recheck' ) );
		if ( ! wp_next_scheduled( self::CRON_HOOK ) ) {
			wp_schedule_event( time() + DAY_IN_SECONDS, 'daily', self::CRON_HOOK );
		}
	}

	/* ---------- Datenzugriff ---------- */

	public static function get() {
		return wp_parse_args( get_option( self::OPT, array() ), array(
			'key'        => '',
			'status'     => 'inactive',   // inactive | active | invalid | error
			'plan'       => 'free',       // free | pro | ai | agency
			'expires'    => '',
			'sites_used' => 0,
			'sites_max'  => 1,
			'message'    => '',
			'checked'    => 0,
		) );
	}

	private static function save( $data ) {
		update_option( self::OPT, wp_parse_args( $data, self::get() ), false );
	}

	/* ---------- Abfragen (überall im Plugin nutzbar) ---------- */

	public static function plan() {
		$l = self::get();
		return ( 'active' === $l['status'] ) ? $l['plan'] : 'free';
	}

	/** Pro-Funktionen (Statement, PDF-Bericht, unbegrenzter Audit) */
	public static function is_pro() {
		return in_array( self::plan(), array( 'pro', 'ai', 'agency' ), true );
	}

	/** KI-Funktionen (Alt-Texte, Leichte Sprache, Vorlesen) */
	public static function is_ai() {
		return in_array( self::plan(), array( 'ai', 'agency' ), true );
	}

	public static function is_agency() {
		return 'agency' === self::plan();
	}

	public static function key() {
		$l = self::get();
		return ( 'active' === $l['status'] ) ? $l['key'] : '';
	}

	public static function plan_label( $plan = null ) {
		$plan = $plan ?: self::plan();
		$map  = array(
			'free'   => __( 'Free', 'wave-access' ),
			'pro'    => __( 'Pro', 'wave-access' ),
			'ai'     => __( 'Pro AI', 'wave-access' ),
			'agency' => __( 'Agency', 'wave-access' ),
		);
		return isset( $map[ $plan ] ) ? $map[ $plan ] : $plan;
	}

	/* ---------- Server-Kommunikation ---------- */

	private static function request( $path, $key ) {
		// Entwickler-/Testschlüssel ohne Server: WAVE-DEV-PRO / WAVE-DEV-AI / WAVE-DEV-AGENCY
		if ( preg_match( '/^WAVE-DEV-(PRO|AI|AGENCY)$/i', $key, $m ) ) {
			$plan = strtolower( $m[1] );
			return array(
				'valid'      => true,
				'plan'       => ( 'agency' === $plan ) ? 'agency' : ( 'ai' === $plan ? 'ai' : 'pro' ),
				'expires'    => gmdate( 'Y-m-d', time() + YEAR_IN_SECONDS ),
				'sites_used' => 1,
				'sites_max'  => ( 'agency' === $plan ) ? 25 : 1,
				'message'    => __( 'Entwicklungslizenz (ohne Server-Prüfung)', 'wave-access' ),
			);
		}

		$res = wp_remote_post( self::SERVER . $path, array(
			'timeout' => 15,
			'body'    => array(
				'license_key' => $key,
				'site_url'    => home_url(),
				'product'     => 'wave-access',
				'version'     => defined( 'WAVE_VERSION' ) ? WAVE_VERSION : '',
			),
		) );
		if ( is_wp_error( $res ) ) {
			return new WP_Error( 'http', $res->get_error_message() );
		}
		$code = wp_remote_retrieve_response_code( $res );
		$body = json_decode( wp_remote_retrieve_body( $res ), true );
		if ( 404 === $code ) {
			return new WP_Error( 'server', __( 'Lizenzserver-Endpunkt nicht erreichbar (in Vorbereitung).', 'wave-access' ) );
		}
		if ( ! is_array( $body ) ) {
			return new WP_Error( 'server', __( 'Ungültige Antwort vom Lizenzserver.', 'wave-access' ) );
		}
		return $body;
	}

	public static function activate( $key ) {
		$key = strtoupper( trim( $key ) );
		if ( '' === $key ) {
			self::save( array( 'key' => '', 'status' => 'inactive', 'plan' => 'free', 'message' => '' ) );
			return;
		}
		$res = self::request( '/activate', $key );
		if ( is_wp_error( $res ) ) {
			self::save( array( 'key' => $key, 'status' => 'error', 'plan' => 'free', 'message' => $res->get_error_message(), 'checked' => time() ) );
			return;
		}
		if ( ! empty( $res['valid'] ) ) {
			self::save( array(
				'key'        => $key,
				'status'     => 'active',
				'plan'       => isset( $res['plan'] ) ? sanitize_key( $res['plan'] ) : 'pro',
				'expires'    => isset( $res['expires'] ) ? sanitize_text_field( $res['expires'] ) : '',
				'sites_used' => isset( $res['sites_used'] ) ? (int) $res['sites_used'] : 1,
				'sites_max'  => isset( $res['sites_max'] ) ? (int) $res['sites_max'] : 1,
				'message'    => isset( $res['message'] ) ? sanitize_text_field( $res['message'] ) : '',
				'checked'    => time(),
			) );
		} else {
			self::save( array(
				'key'     => $key,
				'status'  => 'invalid',
				'plan'    => 'free',
				'message' => isset( $res['message'] ) ? sanitize_text_field( $res['message'] ) : __( 'Lizenzschlüssel ungültig.', 'wave-access' ),
				'checked' => time(),
			) );
		}
	}

	public static function deactivate() {
		$l = self::get();
		if ( '' !== $l['key'] ) {
			self::request( '/deactivate', $l['key'] ); // Fehler hier bewusst ignorieren
		}
		self::save( array( 'key' => '', 'status' => 'inactive', 'plan' => 'free', 'message' => '', 'expires' => '' ) );
	}

	/** Täglicher Cron: aktiven Schlüssel erneut prüfen (Kulanz bei Serverfehlern). */
	public function recheck() {
		$l = self::get();
		if ( 'active' !== $l['status'] || '' === $l['key'] ) return;
		$res = self::request( '/check', $l['key'] );
		if ( is_wp_error( $res ) ) {
			// Server nicht erreichbar → Lizenz NICHT hart deaktivieren (14 Tage Kulanz)
			if ( time() - (int) $l['checked'] > 14 * DAY_IN_SECONDS ) {
				self::save( array( 'status' => 'error', 'message' => $res->get_error_message() ) );
			}
			return;
		}
		if ( ! empty( $res['valid'] ) ) {
			self::save( array(
				'status'     => 'active',
				'plan'       => isset( $res['plan'] ) ? sanitize_key( $res['plan'] ) : $l['plan'],
				'expires'    => isset( $res['expires'] ) ? sanitize_text_field( $res['expires'] ) : $l['expires'],
				'sites_used' => isset( $res['sites_used'] ) ? (int) $res['sites_used'] : $l['sites_used'],
				'sites_max'  => isset( $res['sites_max'] ) ? (int) $res['sites_max'] : $l['sites_max'],
				'checked'    => time(),
			) );
		} else {
			self::save( array( 'status' => 'invalid', 'plan' => 'free', 'message' => isset( $res['message'] ) ? sanitize_text_field( $res['message'] ) : '', 'checked' => time() ) );
		}
	}

	/* ---------- Formular-Handling (Lizenz-Tab) ---------- */

	public function handle_form() {
		if ( ! current_user_can( 'manage_options' ) ) wp_die( 'forbidden' );
		check_admin_referer( 'wave_license' );
		if ( isset( $_POST['wave_license_deactivate'] ) ) {
			self::deactivate();
		} elseif ( isset( $_POST['license_key'] ) ) {
			self::activate( sanitize_text_field( wp_unslash( $_POST['license_key'] ) ) );
		}
		wp_safe_redirect( admin_url( 'options-general.php?page=wave-access&maintab=license' ) );
		exit;
	}

	/* ---------- Darstellung (Lizenz-Tab) ---------- */

	public function render_tab() {
		$l = self::get();
		$status_map = array(
			'active'   => array( 'label' => __( 'Aktiv', 'wave-access' ),                'class' => 'is-ok' ),
			'inactive' => array( 'label' => __( 'Keine Lizenz', 'wave-access' ),          'class' => 'is-muted' ),
			'invalid'  => array( 'label' => __( 'Ungültig', 'wave-access' ),              'class' => 'is-bad' ),
			'error'    => array( 'label' => __( 'Server nicht erreichbar', 'wave-access' ),'class' => 'is-warn' ),
		);
		$st = isset( $status_map[ $l['status'] ] ) ? $status_map[ $l['status'] ] : $status_map['inactive'];
		?>
		<div class="wave-card">
			<div class="wave-card-head">
				<span class="wave-card-ic"><?php echo wave_icon( 'key', 20 ); ?></span>
				<div>
					<h2 class="wave-card-title"><?php esc_html_e( 'Lizenz', 'wave-access' ); ?></h2>
					<p class="wave-card-desc"><?php esc_html_e( 'Ein Schlüssel schaltet alle Pro-Funktionen frei – Verwaltung im Kundenbereich auf wavetools.io.', 'wave-access' ); ?></p>
				</div>
				<span class="wave-status <?php echo esc_attr( $st['class'] ); ?>"><?php echo esc_html( $st['label'] ); ?></span>
			</div>

			<form method="post" action="<?php echo esc_url( admin_url( 'admin-post.php' ) ); ?>">
				<input type="hidden" name="action" value="wave_license_action">
				<?php wp_nonce_field( 'wave_license' ); ?>
				<div class="wave-rows">
					<div class="wave-row">
						<div class="wave-row-main">
							<span class="wave-row-ic"><?php echo wave_icon( 'key', 18 ); ?></span>
							<div>
								<div class="wave-row-label"><?php esc_html_e( 'Lizenzschlüssel', 'wave-access' ); ?></div>
								<div class="wave-row-desc"><?php esc_html_e( 'Du findest ihn in deiner Bestell-E-Mail und im Kundenbereich.', 'wave-access' ); ?></div>
							</div>
						</div>
						<div class="wave-row-control">
							<input type="text" class="wave-field" style="width:260px" name="license_key"
								value="<?php echo esc_attr( $l['key'] ); ?>" placeholder="WAVE-XXXX-XXXX-XXXX" <?php echo ( 'active' === $l['status'] ) ? 'readonly' : ''; ?> />
						</div>
					</div>

					<?php if ( 'active' === $l['status'] ) : ?>
					<div class="wave-row">
						<div class="wave-row-main">
							<span class="wave-row-ic"><?php echo wave_icon( 'circle-check', 18 ); ?></span>
							<div>
								<div class="wave-row-label"><?php printf( esc_html__( 'Tarif: %s', 'wave-access' ), esc_html( self::plan_label( $l['plan'] ) ) ); ?></div>
								<div class="wave-row-desc">
									<?php
									if ( $l['expires'] ) {
										printf( esc_html__( 'Gültig bis %s.', 'wave-access' ), esc_html( date_i18n( get_option( 'date_format' ), strtotime( $l['expires'] ) ) ) );
									}
									if ( $l['sites_max'] > 1 ) {
										echo ' ';
										printf( esc_html__( 'Websites: %1$d von %2$d belegt.', 'wave-access' ), (int) $l['sites_used'], (int) $l['sites_max'] );
									}
									?>
								</div>
							</div>
						</div>
					</div>
					<?php elseif ( $l['message'] ) : ?>
					<div class="wave-row">
						<div class="wave-row-main">
							<span class="wave-row-ic"><?php echo wave_icon( 'triangle-exclamation', 18 ); ?></span>
							<div class="wave-row-desc"><?php echo esc_html( $l['message'] ); ?></div>
						</div>
					</div>
					<?php endif; ?>
				</div>

				<div class="wave-actions">
					<?php if ( 'active' === $l['status'] ) : ?>
						<button type="submit" name="wave_license_deactivate" value="1" class="wave-btn"><?php esc_html_e( 'Lizenz von dieser Website lösen', 'wave-access' ); ?></button>
					<?php else : ?>
						<button type="submit" class="wave-btn wave-btn-primary"><?php echo wave_icon( 'circle-check', 16 ); ?> <?php esc_html_e( 'Aktivieren', 'wave-access' ); ?></button>
						<a class="wave-btn" href="https://wavetools.io/#pricing" target="_blank" rel="noopener"><?php esc_html_e( 'Tarif kaufen', 'wave-access' ); ?></a>
					<?php endif; ?>
				</div>
			</form>
		</div>

		<?php if ( self::is_agency() ) : ?>
		<div class="wave-card">
			<div class="wave-card-head">
				<span class="wave-card-ic"><?php echo wave_icon( 'sitemap', 20 ); ?></span>
				<div>
					<h2 class="wave-card-title"><?php esc_html_e( 'Agentur-Lizenz', 'wave-access' ); ?></h2>
					<p class="wave-card-desc"><?php esc_html_e( 'Dieser Schlüssel kann auf mehreren Kunden-Websites aktiviert werden. Die Übersicht aller verbundenen Sites findest du im Kundenbereich.', 'wave-access' ); ?></p>
				</div>
			</div>
			<div class="wave-actions">
				<a class="wave-btn" href="https://wavetools.io/kundenbereich/" target="_blank" rel="noopener"><?php esc_html_e( 'Kundenbereich öffnen', 'wave-access' ); ?></a>
			</div>
		</div>
		<?php endif; ?>
		<?php
	}
}
