<?php
declare(strict_types=1);
if ( ! defined( 'ABSPATH' ) ) { exit; }
/**
 * Meta Boxes — Business Details & FAQ.
 * @package WTE_Business_Card
 */

/**
 * メタボックスの登録。
 * フロントページに設定された固定ページにのみ表示する。
 */
function wte_register_meta_boxes(): void {
	add_meta_box(
		'wte_business_details_box',
		__( '事業詳細（フロントページ）', 'wte_' ),
		'wte_render_business_details_box',
		'page',
		'normal',
		'high'
	);
	add_meta_box(
		'wte_faq_box',
		__( 'FAQ（よくある質問）', 'wte_' ),
		'wte_render_faq_box',
		'page',
		'normal',
		'high'
	);
}
add_action( 'add_meta_boxes', 'wte_register_meta_boxes', 20 );

/**
 * メタボックスの表示制御 — フロントページのみ表示。
 * WordPress の do_meta_boxes フィルターを使って非フロントページでは非表示にする。
 */
add_filter( 'postbox_classes_page_wte_business_details_box', 'wte_meta_box_classes_control' );
add_filter( 'postbox_classes_page_wte_faq_box', 'wte_meta_box_classes_control' );
function wte_meta_box_classes_control( array $classes ): array {
	global $post;
	if ( ! $post instanceof WP_Post ) return $classes;

	$front_page_id = (int) get_option( 'page_on_front', 0 );
	// フロントページIDが設定されていて、現在のページがそれ以外の場合は非表示
	if ( $front_page_id > 0 && $post->ID !== $front_page_id ) {
		$classes[] = 'hidden';
	}
	return $classes;
}

function wte_render_business_details_box( WP_Post $post ): void {
	wp_nonce_field( 'wte_save_meta_' . $post->ID, 'wte_meta_nonce' );
	$raw   = get_post_meta( $post->ID, 'wte_business_details', true );
	$items = [];
	if ( ! empty( $raw ) ) {
		$decoded = json_decode( $raw, true );
		$items   = is_array( $decoded ) ? $decoded : [];
	}
	?>
	<p class="description"><?php esc_html_e( 'フロントページの「事業詳細」セクションに表示する項目を追加してください。', 'wte_' ); ?></p>
	<div class="wte-repeater" id="wte-business-repeater" data-field="wte_business_details">
		<div class="wte-repeater__items">
			<?php foreach ( $items as $i => $item ) : ?>
				<div class="wte-repeater__item" data-index="<?php echo (int) $i; ?>">
					<p><label><?php esc_html_e( '項目名', 'wte_' ); ?></label><input type="text" class="widefat wte-field-title" value="<?php echo esc_attr( $item['title'] ?? '' ); ?>"></p>
					<p><label><?php esc_html_e( '説明文', 'wte_' ); ?></label><textarea class="widefat wte-field-body" rows="3"><?php echo esc_textarea( $item['body'] ?? '' ); ?></textarea></p>
					<p><label><?php esc_html_e( 'リンクURL', 'wte_' ); ?></label><input type="url" class="widefat wte-field-link-url" value="<?php echo esc_url( $item['link_url'] ?? '' ); ?>"></p>
					<p><label><?php esc_html_e( 'リンクテキスト', 'wte_' ); ?></label><input type="text" class="widefat wte-field-link-text" value="<?php echo esc_attr( $item['link_text'] ?? '' ); ?>"></p>
					<p><label><?php esc_html_e( '画像ID', 'wte_' ); ?></label><input type="number" class="wte-field-image-id" value="<?php echo absint( $item['image_id'] ?? 0 ); ?>"> <button type="button" class="button wte-media-select"><?php esc_html_e( '画像を選択', 'wte_' ); ?></button></p>
					<p><label><?php esc_html_e( '表示順', 'wte_' ); ?></label><input type="number" class="wte-field-order" value="<?php echo absint( $item['order'] ?? $i ); ?>" min="0"></p>
					<p><button type="button" class="button wte-repeater__remove"><?php esc_html_e( '削除', 'wte_' ); ?></button></p>
					<hr>
				</div>
			<?php endforeach; ?>
		</div>
		<button type="button" class="button button-primary wte-repeater__add"><?php esc_html_e( '＋ 項目を追加', 'wte_' ); ?></button>
		<input type="hidden" name="wte_business_details" id="wte_business_details_data" value="<?php echo esc_attr( wp_json_encode( $items, JSON_UNESCAPED_UNICODE ) ); ?>">
	</div>
	<?php
}

function wte_render_faq_box( WP_Post $post ): void {
	$raw   = get_post_meta( $post->ID, 'wte_faq_items', true );
	$items = [];
	if ( ! empty( $raw ) ) {
		$decoded = json_decode( $raw, true );
		$items   = is_array( $decoded ) ? $decoded : [];
	}
	?>
	<p class="description"><?php esc_html_e( 'フロントページの「よくある質問」セクションに表示するFAQを追加してください。', 'wte_' ); ?></p>
	<div class="wte-repeater" id="wte-faq-repeater" data-field="wte_faq_items">
		<div class="wte-repeater__items">
			<?php foreach ( $items as $i => $item ) : ?>
				<div class="wte-repeater__item" data-index="<?php echo (int) $i; ?>">
					<p><label>Q:</label><input type="text" class="widefat wte-field-question" value="<?php echo esc_attr( $item['question'] ?? '' ); ?>"></p>
					<p><label>A:</label><textarea class="widefat wte-field-answer" rows="3"><?php echo esc_textarea( $item['answer'] ?? '' ); ?></textarea></p>
					<p><label><?php esc_html_e( '表示順', 'wte_' ); ?></label><input type="number" class="wte-field-order" value="<?php echo absint( $item['order'] ?? $i ); ?>" min="0"></p>
					<p><button type="button" class="button wte-repeater__remove"><?php esc_html_e( '削除', 'wte_' ); ?></button></p>
					<hr>
				</div>
			<?php endforeach; ?>
		</div>
		<button type="button" class="button button-primary wte-repeater__add"><?php esc_html_e( '＋ 質問を追加', 'wte_' ); ?></button>
		<input type="hidden" name="wte_faq_items" id="wte_faq_items_data" value="<?php echo esc_attr( wp_json_encode( $items, JSON_UNESCAPED_UNICODE ) ); ?>">
	</div>
	<?php
}

function wte_save_meta_boxes( int $post_id ): void {
	// セキュリティチェック
	if ( ! isset( $_POST['wte_meta_nonce'] ) ) return;
	if ( ! wp_verify_nonce( $_POST['wte_meta_nonce'], 'wte_save_meta_' . $post_id ) ) return;
	if ( ! current_user_can( 'edit_post', $post_id ) ) return;
	if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) return;
	if ( get_post_type( $post_id ) !== 'page' ) return;

	// Business details.
	if ( isset( $_POST['wte_business_details'] ) ) {
		$raw  = stripslashes( $_POST['wte_business_details'] );
		$data = json_decode( $raw, true );
		if ( ! is_array( $data ) ) {
			$data = [];
		}
		$clean = array_values( array_filter( array_map( function ( $item ) {
			// タイトルが空のアイテムは保存しない
			$title = sanitize_text_field( $item['title'] ?? '' );
			if ( empty( $title ) ) return null;
			return [
				'title'     => $title,
				'body'      => sanitize_textarea_field( $item['body'] ?? '' ),
				'image_id'  => absint( $item['image_id'] ?? 0 ),
				'link_url'  => esc_url_raw( $item['link_url'] ?? '' ),
				'link_text' => sanitize_text_field( $item['link_text'] ?? '' ),
				'order'     => absint( $item['order'] ?? 0 ),
			];
		}, $data ), fn( $v ) => $v !== null ) );
		update_post_meta( $post_id, 'wte_business_details', wp_slash( wp_json_encode( $clean, JSON_UNESCAPED_UNICODE ) ) );
	}

	// FAQ items.
	if ( isset( $_POST['wte_faq_items'] ) ) {
		$raw  = stripslashes( $_POST['wte_faq_items'] );
		$data = json_decode( $raw, true );
		if ( ! is_array( $data ) ) {
			$data = [];
		}
		$clean = array_values( array_filter( array_map( function ( $item ) {
			// 質問が空のアイテムは保存しない
			$question = sanitize_text_field( $item['question'] ?? '' );
			if ( empty( $question ) ) return null;
			return [
				'question' => $question,
				'answer'   => sanitize_textarea_field( $item['answer'] ?? '' ),
				'order'    => absint( $item['order'] ?? 0 ),
			];
		}, $data ), fn( $v ) => $v !== null ) );
		update_post_meta( $post_id, 'wte_faq_items', wp_slash( wp_json_encode( $clean, JSON_UNESCAPED_UNICODE ) ) );
	}
}
add_action( 'save_post_page', 'wte_save_meta_boxes', 20 );
