<?php
/**
 * Wave Access – Generator für die Barrierefreiheitserklärung (Pro)
 *
 * Erzeugt/aktualisiert eine WordPress-Seite mit einer Erklärung nach
 * BFSG / EAA / EN 301 549, DE oder EN.
 */

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

class Wave_Statement {

	const OPT = 'wave_statement';

	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_statement_save', array( $this, 'handle_save' ) );
	}

	public static function get_options() {
		return wp_parse_args( get_option( self::OPT, array() ), array(
			'org'        => get_bloginfo( 'name' ),
			'email'      => get_option( 'admin_email' ),
			'phone'      => '',
			'conformity' => 'partial',           // full | partial | none
			'known'      => '',                  // bekannte Einschränkungen
			'lang'       => get_locale(),        // WP-Locale, z. B. de_DE
			'page_id'    => 0,
			'updated'    => '',
		) );
	}

	/**
	 * Alle Sprachen, für die das Plugin Übersetzungsdateien mitbringt
	 * (aus dem languages-Ordner ermittelt) + Deutsch als Basissprache.
	 *
	 * @return array locale => nativer Name
	 */
	public static function available_languages() {
		$names = array(
			'de_DE' => 'Deutsch', 'en_US' => 'English (US)', 'en_GB' => 'English (UK)',
			'fr_FR' => 'Français', 'es_ES' => 'Español', 'it_IT' => 'Italiano',
			'nl_NL' => 'Nederlands', 'pl_PL' => 'Polski', 'pt_PT' => 'Português',
			'sv_SE' => 'Svenska', 'da_DK' => 'Dansk', 'fi' => 'Suomi',
			'nb_NO' => 'Norsk (Bokmål)', 'cs_CZ' => 'Čeština', 'sk_SK' => 'Slovenčina',
			'hu_HU' => 'Magyar', 'ro_RO' => 'Română', 'bg_BG' => 'Български',
			'el' => 'Ελληνικά', 'hr' => 'Hrvatski', 'sl_SI' => 'Slovenščina',
			'et' => 'Eesti', 'lv' => 'Latviešu', 'lt_LT' => 'Lietuvių',
			'ga' => 'Gaeilge', 'mt_MT' => 'Malti', 'tr_TR' => 'Türkçe',
			'uk' => 'Українська', 'ru_RU' => 'Русский',
		);
		$langs = array( 'de_DE' => $names['de_DE'] );
		foreach ( glob( WAVE_PLUGIN_DIR . 'languages/wave-access-*.mo' ) as $mo ) {
			$locale = str_replace( 'wave-access-', '', basename( $mo, '.mo' ) );
			$langs[ $locale ] = isset( $names[ $locale ] ) ? $names[ $locale ] : $locale;
		}
		asort( $langs );
		return $langs;
	}

	public function handle_save() {
		if ( ! current_user_can( 'manage_options' ) ) wp_die( 'forbidden' );
		check_admin_referer( 'wave_statement' );
		if ( ! Wave_License::is_pro() ) wp_die( 'pro required' );

		$o = self::get_options();
		$o['org']        = sanitize_text_field( wp_unslash( $_POST['org'] ?? '' ) );
		$o['email']      = sanitize_email( wp_unslash( $_POST['email'] ?? '' ) );
		$o['phone']      = sanitize_text_field( wp_unslash( $_POST['phone'] ?? '' ) );
		$o['conformity'] = in_array( $_POST['conformity'] ?? '', array( 'full', 'partial', 'none' ), true ) ? $_POST['conformity'] : 'partial';
		$o['known']      = sanitize_textarea_field( wp_unslash( $_POST['known'] ?? '' ) );
		$lang_req        = sanitize_text_field( wp_unslash( $_POST['stmt_lang'] ?? 'de_DE' ) );
		$o['lang']       = array_key_exists( $lang_req, self::available_languages() ) ? $lang_req : 'de_DE';
		$o['updated']    = current_time( 'Y-m-d' );

		// Inhalt in der Zielsprache erzeugen (Locale temporär umschalten,
		// damit die __()-Strings aus den Plugin-Sprachdateien gezogen werden).
		$switched = switch_to_locale( $o['lang'] );
		if ( $switched ) {
			unload_textdomain( 'wave-access' );
			wave_load_textdomain();
		}
		$title   = __( 'Barrierefreiheitserklärung', 'wave-access' );
		$content = self::build_content( $o );
		if ( $switched ) {
			restore_previous_locale();
			unload_textdomain( 'wave-access' );
			wave_load_textdomain();
		}
		$pagearr = array(
			'post_title'   => $title,
			'post_content' => $content,
			'post_status'  => 'publish',
			'post_type'    => 'page',
		);
		if ( $o['page_id'] && get_post( $o['page_id'] ) ) {
			$pagearr['ID'] = (int) $o['page_id'];
			wp_update_post( $pagearr );
		} else {
			$o['page_id'] = wp_insert_post( $pagearr );
		}
		update_option( self::OPT, $o, false );

		wp_safe_redirect( admin_url( 'options-general.php?page=wave-access&maintab=statement&saved=1' ) );
		exit;
	}

	/**
	 * Inhalt der Erklärung als Gutenberg-Markup.
	 */
	private static function build_content( $o ) {
		$date = date_i18n( get_option( 'date_format' ), strtotime( $o['updated'] ) );
		$conf = array(
			'full'    => __( 'vollständig vereinbar', 'wave-access' ),
			'partial' => __( 'teilweise vereinbar', 'wave-access' ),
			'none'    => __( 'nicht vereinbar', 'wave-access' ),
		);
		$c = $conf[ $o['conformity'] ];

		$p = function( $text ) { return "<!-- wp:paragraph -->\n<p>{$text}</p>\n<!-- /wp:paragraph -->\n\n"; };
		$h = function( $text ) { return "<!-- wp:heading -->\n<h2 class=\"wp-block-heading\">{$text}</h2>\n<!-- /wp:heading -->\n\n"; };

		$out  = $p( sprintf(
			/* translators: %s: Name der Organisation */
			__( '%s ist bemüht, die eigene Website im Einklang mit der Richtlinie (EU) 2019/882 (European Accessibility Act) und den jeweils geltenden nationalen Vorschriften (in Deutschland: Barrierefreiheitsstärkungsgesetz, BFSG) barrierefrei zugänglich zu machen. Maßstab sind die Anforderungen der EN 301 549 bzw. der Web Content Accessibility Guidelines (WCAG) 2.1, Konformitätsstufe AA.', 'wave-access' ),
			esc_html( $o['org'] )
		) );
		$out .= $h( __( 'Stand der Vereinbarkeit', 'wave-access' ) );
		$out .= $p( sprintf(
			/* translators: %s: Konformitätsstatus */
			__( 'Diese Website ist mit den genannten Anforderungen <strong>%s</strong>.', 'wave-access' ), $c
		) );
		if ( trim( $o['known'] ) ) {
			$out .= $h( __( 'Nicht barrierefreie Inhalte', 'wave-access' ) );
			$out .= $p( nl2br( esc_html( $o['known'] ) ) );
		}
		$out .= $h( __( 'Erstellung dieser Erklärung', 'wave-access' ) );
		$out .= $p( sprintf(
			/* translators: %s: Datum */
			__( 'Diese Erklärung wurde am %s erstellt bzw. zuletzt aktualisiert. Grundlage sind eine Selbstbewertung sowie automatisierte Prüfungen mit Wave Access.', 'wave-access' ), $date
		) );
		$out .= $h( __( 'Feedback und Kontakt', 'wave-access' ) );
		$kontakt = __( 'E-Mail:', 'wave-access' ) . ' <a href="mailto:' . esc_attr( $o['email'] ) . '">' . esc_html( $o['email'] ) . '</a>';
		if ( $o['phone'] ) $kontakt .= '<br>' . __( 'Telefon:', 'wave-access' ) . ' ' . esc_html( $o['phone'] );
		$out .= $p( __( 'Sind Ihnen Mängel beim barrierefreien Zugang aufgefallen? Wir freuen uns über Ihre Rückmeldung:', 'wave-access' ) . '<br>' . $kontakt );
		$out .= $h( __( 'Durchsetzungsverfahren', 'wave-access' ) );
		$out .= $p( __( 'Wenn eine Anfrage nicht zufriedenstellend beantwortet wurde, können Sie sich an die für Ihren Mitgliedstaat zuständige Marktüberwachungsbehörde wenden — in Deutschland an die Marktüberwachungsstelle der Länder für die Barrierefreiheit von Produkten und Dienstleistungen (MLBF).', 'wave-access' ) );
		return $out;
	}

	/**
	 * Tab-Inhalt im Admin.
	 */
	public function render_tab() {
		$o      = self::get_options();
		$is_pro = Wave_License::is_pro();
		$dis    = $is_pro ? '' : 'disabled';
		$page   = $o['page_id'] ? get_post( $o['page_id'] ) : null;
		?>
		<?php if ( isset( $_GET['saved'] ) ) : ?>
			<div class="wave-note is-ok"><?php echo wave_icon( 'circle-check', 16 ); ?> <?php esc_html_e( 'Erklärung gespeichert und Seite aktualisiert.', 'wave-access' ); ?></div>
		<?php endif; ?>

		<div class="wave-card <?php echo $is_pro ? '' : 'is-locked'; ?>">
			<div class="wave-card-head">
				<span class="wave-card-ic"><?php echo wave_icon( 'file-lines', 20 ); ?></span>
				<div>
					<h2 class="wave-card-title"><?php esc_html_e( 'Barrierefreiheitserklärung', 'wave-access' ); ?>
						<?php if ( ! $is_pro ) : ?><span class="wave-pill wave-pill-pro"><?php echo wave_icon( 'sparkles', 10 ); ?>Pro</span><?php endif; ?>
					</h2>
					<p class="wave-card-desc"><?php esc_html_e( 'Erzeugt eine fertige Erklärung nach BFSG/EAA als WordPress-Seite – in Deutsch oder Englisch.', 'wave-access' ); ?></p>
				</div>
			</div>

			<form method="post" action="<?php echo esc_url( admin_url( 'admin-post.php' ) ); ?>">
				<input type="hidden" name="action" value="wave_statement_save">
				<?php wp_nonce_field( 'wave_statement' ); ?>
				<div class="wave-rows">
					<div class="wave-row">
						<div class="wave-row-main"><div><div class="wave-row-label"><?php esc_html_e( 'Organisation / Betreiber', 'wave-access' ); ?></div></div></div>
						<div class="wave-row-control"><input type="text" class="wave-field" style="width:260px" name="org" value="<?php echo esc_attr( $o['org'] ); ?>" <?php echo $dis; ?>></div>
					</div>
					<div class="wave-row">
						<div class="wave-row-main"><div><div class="wave-row-label"><?php esc_html_e( 'Kontakt-E-Mail für Feedback', 'wave-access' ); ?></div></div></div>
						<div class="wave-row-control"><input type="email" class="wave-field" style="width:260px" name="email" value="<?php echo esc_attr( $o['email'] ); ?>" <?php echo $dis; ?>></div>
					</div>
					<div class="wave-row">
						<div class="wave-row-main"><div><div class="wave-row-label"><?php esc_html_e( 'Telefon (optional)', 'wave-access' ); ?></div></div></div>
						<div class="wave-row-control"><input type="text" class="wave-field" style="width:260px" name="phone" value="<?php echo esc_attr( $o['phone'] ); ?>" <?php echo $dis; ?>></div>
					</div>
					<div class="wave-row">
						<div class="wave-row-main"><div>
							<div class="wave-row-label"><?php esc_html_e( 'Stand der Vereinbarkeit', 'wave-access' ); ?></div>
							<div class="wave-row-desc"><?php esc_html_e( 'Ehrlich bleiben – „teilweise vereinbar" ist der übliche, ehrliche Stand.', 'wave-access' ); ?></div>
						</div></div>
						<div class="wave-row-control">
							<select name="conformity" class="wave-field" <?php echo $dis; ?>>
								<option value="full" <?php selected( $o['conformity'], 'full' ); ?>><?php esc_html_e( 'Vollständig vereinbar', 'wave-access' ); ?></option>
								<option value="partial" <?php selected( $o['conformity'], 'partial' ); ?>><?php esc_html_e( 'Teilweise vereinbar', 'wave-access' ); ?></option>
								<option value="none" <?php selected( $o['conformity'], 'none' ); ?>><?php esc_html_e( 'Nicht vereinbar', 'wave-access' ); ?></option>
							</select>
						</div>
					</div>
					<div class="wave-row">
						<div class="wave-row-main"><div>
							<div class="wave-row-label"><?php esc_html_e( 'Bekannte Einschränkungen (optional)', 'wave-access' ); ?></div>
							<div class="wave-row-desc"><?php esc_html_e( 'Z. B. „Ältere PDF-Dokumente sind noch nicht barrierefrei."', 'wave-access' ); ?></div>
						</div></div>
						<div class="wave-row-control"><textarea class="wave-field" style="width:260px;height:70px" name="known" <?php echo $dis; ?>><?php echo esc_textarea( $o['known'] ); ?></textarea></div>
					</div>
					<div class="wave-row">
						<div class="wave-row-main"><div><div class="wave-row-label"><?php esc_html_e( 'Sprache der Erklärung', 'wave-access' ); ?></div></div></div>
						<div class="wave-row-control">
							<select name="stmt_lang" class="wave-field" <?php echo $dis; ?>>
								<?php foreach ( self::available_languages() as $locale => $label ) : ?>
									<option value="<?php echo esc_attr( $locale ); ?>" <?php selected( $o['lang'], $locale ); ?>><?php echo esc_html( $label ); ?></option>
								<?php endforeach; ?>
							</select>
						</div>
					</div>
				</div>
				<div class="wave-actions">
					<?php if ( $is_pro ) : ?>
						<button type="submit" class="wave-btn wave-btn-primary"><?php echo wave_icon( 'circle-check', 16 ); ?>
							<?php echo $page ? esc_html__( 'Erklärung aktualisieren', 'wave-access' ) : esc_html__( 'Seite erstellen', 'wave-access' ); ?></button>
						<?php if ( $page ) : ?>
							<a class="wave-btn" href="<?php echo esc_url( get_permalink( $page ) ); ?>" target="_blank" rel="noopener"><?php esc_html_e( 'Seite ansehen', 'wave-access' ); ?></a>
						<?php endif; ?>
					<?php else : ?>
						<a class="wave-btn wave-btn-primary" href="https://wavetools.io/#pricing" target="_blank" rel="noopener"><?php echo wave_icon( 'sparkles', 14 ); ?> <?php esc_html_e( 'Mit Pro freischalten', 'wave-access' ); ?></a>
					<?php endif; ?>
				</div>
			</form>
		</div>
		<?php if ( $is_pro && $page ) : ?>
		<div class="wave-note"><?php printf( esc_html__( 'Tipp: Verlinke die Seite „%s" im Footer deiner Website – das erwartet auch die Marktüberwachung.', 'wave-access' ), esc_html( get_the_title( $page ) ) ); ?></div>
		<?php endif; ?>
		<?php
	}
}
