<?php
/**
 * Modern admin shell — appbar (crumbs) + hero (title/subtitle) dla stron
 * Wystaw / Faktury sprzedaży / Faktury zakupu. NIE ukrywa natywnego menu
 * WordPressa — siedzi wewnątrz #wpbody-content jak normalna podstrona admin.
 *
 * Użycie:
 *   Modern_Shell::open( 'wystaw-fakture', $page_data );
 *   ... istniejący markup strony ...
 *   Modern_Shell::close();
 *
 * @package KSEF\WordPress\Admin
 */

declare(strict_types=1);

namespace KSEF\WordPress\Admin;

final class Modern_Shell {

	/**
	 * Otwiera modern shell. Wywołaj na początku render_page() — przed
	 * normalnym markupem strony.
	 *
	 * @param string $active_key Tylko do podświetlenia okruszka (nieużywany do menu).
	 * @param array<string,mixed> $opts crumbs (string[]), title, subtitle, status_pill ('draft'|'sent'|'paid'|'live'), hero_actions, ksef_id, has_sidebar.
	 */
	public static function open( string $active_key, array $opts = [] ): void {
		self::enqueue_assets();
		?>
		<div class="wrap ksef-modern-wrap">
			<div class="appbar">
				<div class="appbar-row">
					<div class="crumbs">
						<?php
						$crumbs = (array) ( $opts['crumbs'] ?? [] );
						$last   = count( $crumbs ) - 1;
						foreach ( $crumbs as $i => $c ) {
							if ( $i === $last ) {
								echo '<b>' . esc_html( (string) $c ) . '</b>';
							} else {
								echo '<span class="muted">' . esc_html( (string) $c ) . '</span><span class="sep">›</span>';
							}
						}
						if ( ! empty( $opts['ksef_id'] ) ) {
							echo '<span class="ksef-id">' . esc_html( (string) $opts['ksef_id'] ) . '</span>';
						}
						?>
					</div>
					<div class="appbar-actions">
						<a href="https://prostafakturaksef.pl/docs" target="_blank" rel="noopener" class="help-pill">
							<svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="10"/><path d="M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3M12 17h.01"/></svg>
							<?php esc_html_e( 'Pomoc', 'prostafaktura-ksef' ); ?>
						</a>
					</div>
				</div>
			</div>

			<?php if ( ! empty( $opts['title'] ) ) : ?>
				<div class="page-hero">
					<div class="hero-row">
						<div class="hero-title-block">
							<h1 class="page-title">
								<?php
								$title = (string) $opts['title'];
								if ( strpos( $title, '|' ) !== false ) {
									[ $plain, $accent ] = array_map( 'trim', explode( '|', $title, 2 ) );
									echo esc_html( $plain ) . ' <span class="accent">' . esc_html( $accent ) . '</span>';
								} else {
									echo esc_html( $title );
								}
								?>
								<?php if ( ! empty( $opts['status_pill'] ) ) : ?>
									<span class="status-pill <?php echo esc_attr( $opts['status_pill'] ); ?>"><?php echo esc_html( (string) ( $opts['status_pill_label'] ?? ucfirst( $opts['status_pill'] ) ) ); ?></span>
								<?php endif; ?>
								<?php if ( ! empty( $opts['title_pills'] ) ) : ?>
									<?php echo $opts['title_pills']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- pre-rendered HTML przekazany przez wywolujacego. ?>
								<?php endif; ?>
							</h1>
							<?php if ( ! empty( $opts['subtitle'] ) ) : ?>
								<p class="page-subtitle"><?php echo esc_html( (string) $opts['subtitle'] ); ?></p>
							<?php endif; ?>
						</div>
						<?php if ( ! empty( $opts['hero_actions'] ) ) : ?>
							<div class="hero-actions">
								<?php echo $opts['hero_actions']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- already-rendered HTML by caller. ?>
							</div>
						<?php endif; ?>
					</div>
				</div>
			<?php endif; ?>

			<div class="content single">
		<?php
	}

	/**
	 * Zamyka shell. Wywołaj na końcu render_page().
	 */
	public static function close(): void {
		?>
			</div>
		</div>
		<?php
	}

	/**
	 * Wspólny helper: dorzuca dynamiczny CSS strony przez właściwy pipeline WP
	 * (bez literalnego <style> w kodzie). Handle „pusty" (src=false) drukuje sam
	 * inline w stopce (late styles) — zweryfikowane na docelowej wersji WP.
	 */
	public static function inline_style( string $handle, string $css ): void {
		if ( '' === trim( $css ) ) { return; }
		wp_register_style( $handle, false, [], KSEF_WORDPRESS_VERSION );
		wp_enqueue_style( $handle );
		wp_add_inline_style( $handle, $css );
	}

	/**
	 * Wspólny helper: dorzuca dynamiczny JS strony przez właściwy pipeline WP
	 * (bez literalnego <script> w kodzie). Drukuje się w stopce.
	 */
	public static function inline_script( string $handle, string $js, array $deps = [] ): void {
		if ( '' === trim( $js ) ) { return; }
		wp_register_script( $handle, false, $deps, KSEF_WORDPRESS_VERSION, true );
		wp_enqueue_script( $handle );
		wp_add_inline_script( $handle, $js );
	}

	/**
	 * Helper do nagłówka karty zgodnego z designem ze screenów:
	 * [kolorowy kwadracik z ikoną] [Tytuł] / [podtytuł] [opcjonalne akcje].
	 *
	 * @param string $icon_svg  Inline SVG (bez klasy/koloru — ostyluje rodzic).
	 * @param string $tone      'violet' | 'emerald' | 'sky' | 'amber' | 'slate' | 'pink'
	 * @param string $title     Główny tytuł karty.
	 * @param string $subtitle  Krótki opis pod tytułem (max ~80 znaków).
	 * @param string $actions   Opcjonalny HTML akcji po prawej (np. button "Dodaj").
	 */
	public static function card_head( string $icon_svg, string $tone, string $title, string $subtitle = '', string $actions = '' ): void {
		?>
		<div class="ksef-card-head">
			<span class="ksef-card-ic <?php echo esc_attr( $tone ); ?>"><?php echo $icon_svg; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- inline SVG (stala w kodzie). ?></span>
			<span class="ksef-card-meta">
				<b><?php echo esc_html( $title ); ?></b>
				<?php if ( '' !== $subtitle ) : ?>
					<small><?php echo esc_html( $subtitle ); ?></small>
				<?php endif; ?>
			</span>
			<?php if ( '' !== $actions ) : ?>
				<span class="ksef-card-head-actions"><?php echo $actions; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- pre-rendered HTML przekazany przez wywolujacego. ?>
			<?php endif; ?>
		</div>
		<?php
	}

	public static function enqueue_assets(): void {
		wp_enqueue_style(
			'ksef-admin-modern',
			KSEF_WORDPRESS_URL . 'assets/admin-modern.css',
			[],
			KSEF_WORDPRESS_VERSION
		);
		// Brak zewnętrznych fontów (Google Fonts) — używamy systemowego stosu czcionek,
		// żeby panel nie wykonywał żądań do usług trzecich (prywatność / brak „phoning home").

		// CSS normalizujący WP-admin chrome (dawniej inline <style> w admin_head) —
		// teraz dopięty do zaenqueue'owanego handla, bez literalnego tagu w kodzie.
		$page_css = '.ksef-modern-wrap{margin:10px 20px 40px 0;max-width:1480px;}'
			. '.ksef-modern-wrap > .appbar{position:static;background:transparent;border-bottom:1px solid var(--line,#EFEDE7);padding:8px 0;backdrop-filter:none;-webkit-backdrop-filter:none;}'
			. '.ksef-modern-wrap > .page-hero{padding:18px 0 0;}'
			. '.ksef-modern-wrap > .content{padding:18px 0 40px;max-width:none;}'
			. 'body.toplevel_page_ksef-manual-invoice .notice:not(.ksef-keep),'
			. 'body.toplevel_page_ksef-outgoing .notice:not(.ksef-keep),'
			. 'body.toplevel_page_ksef-incoming .notice:not(.ksef-keep),'
			. 'body.toplevel_page_ksef-manual-invoice .update-nag,'
			. 'body.toplevel_page_ksef-outgoing .update-nag,'
			. 'body.toplevel_page_ksef-incoming .update-nag{display:none !important;}';
		wp_add_inline_style( 'ksef-admin-modern', $page_css );
	}
}
