<?php
/**
 * マルチステップフォーム
 *
 * @package CF7MasterPro\Form
 */

namespace CF7MasterPro\Form;

defined( 'ABSPATH' ) || exit;

/**
 * CF7にステップ機能追加（ステップ数は無制限）
 */
class MultiStep {

	/**
	 * 登録
	 */
	public function register() {
		add_action( 'wpcf7_init', array( $this, 'add_form_tag' ) );
		add_filter( 'wpcf7_form_elements', array( $this, 'process_steps' ) );
		add_action( 'wp_enqueue_scripts', array( $this, 'enqueue_assets' ) );
	}

	/**
	 * CF7フォームタグ追加
	 */
	public function add_form_tag() {
		if ( ! function_exists( 'wpcf7_add_form_tag' ) ) {
			return;
		}
		wpcf7_add_form_tag( 'step', array( $this, 'render_step_tag' ) );
		wpcf7_add_form_tag( 'multistep', array( $this, 'render_step_tag' ) );
	}

	/**
	 * stepタグレンダリング
	 *
	 * 書式:
	 * - [step "基本情報"]
	 * - [step "確認" confirmation]   ← 確認画面ステップとして扱う
	 *
	 * @param object $tag タグ.
	 * @return string
	 */
	public function render_step_tag( $tag ) {
		$step_num = 1;
		if ( ! empty( $tag->values ) ) {
			foreach ( $tag->values as $v ) {
				if ( is_numeric( $v ) ) {
					$step_num = intval( $v );
					break;
				}
			}
		}
		$title = '';
		if ( ! empty( $tag->labels ) ) {
			$title = esc_html( $tag->labels[0] );
		} elseif ( ! empty( $tag->values[1] ) && ! is_numeric( $tag->values[1] ) ) {
			$title = esc_html( $tag->values[1] );
		}

		// 確認画面判定
		$role = '';
		$opts = isset( $tag->options ) && is_array( $tag->options ) ? $tag->options : array();
		foreach ( $opts as $opt ) {
			$opt_lower = strtolower( (string) $opt );
			if ( 'confirmation' === $opt_lower || 'confirm' === $opt_lower || 0 === strpos( $opt_lower, 'role:confirmation' ) ) {
				$role = 'confirmation';
				break;
			}
		}
		// values にも 'confirmation' があれば許容（互換）
		if ( '' === $role && ! empty( $tag->values ) ) {
			foreach ( $tag->values as $v ) {
				if ( ! is_numeric( $v ) && in_array( strtolower( (string) $v ), array( 'confirmation', 'confirm' ), true ) ) {
					$role = 'confirmation';
					break;
				}
			}
		}

		$role_attr = '' !== $role ? sprintf( ' data-role="%s"', esc_attr( $role ) ) : '';

		return sprintf(
			'<div class="cf7mp-multistep__step" data-step="%1$d" data-title="%2$s"%3$s></div>',
			$step_num,
			$title,
			$role_attr
		);
	}

	/**
	 * ステップHTMLグルーピング処理
	 *
	 * @param string $form HTML.
	 * @return string
	 */
	public function process_steps( $form ) {
		if ( false === strpos( $form, 'cf7mp-multistep__step' ) ) {
			return $form;
		}

		// data-role属性のキャプチャを追加
		$pattern = '/<div class="cf7mp-multistep__step"\s+data-step="(\d+)"\s+data-title="([^"]*)"(?:\s+data-role="([^"]*)")?><\/div>/';
		preg_match_all( $pattern, $form, $matches, PREG_OFFSET_CAPTURE );

		if ( empty( $matches[0] ) ) {
			return $form;
		}

		$wrapped     = '<div class="cf7mp-multistep" data-form-id="' . esc_attr( $this->get_form_id() ) . '"><div class="cf7mp-multistep__steps">';
		$last_offset = 0;
		$prev_title  = '';
		$prev_role   = '';

		foreach ( $matches[0] as $idx => $match ) {
			$offset = $match[1];
			$title  = esc_attr( $matches[2][ $idx ][0] );
			$role   = isset( $matches[3][ $idx ][0] ) ? esc_attr( $matches[3][ $idx ][0] ) : '';

			if ( $idx > 0 ) {
				$step_content = substr( $form, $last_offset, $offset - $last_offset );
				$role_attr    = '' !== $prev_role ? ' data-role="' . $prev_role . '"' : '';
				$wrapped     .= '<div class="cf7mp-multistep__step" data-step="' . $idx . '" data-title="' . $prev_title . '"' . $role_attr . '>' . $step_content . '</div>';
			} else {
				$wrapped .= substr( $form, 0, $offset );
			}
			$prev_title  = $title;
			$prev_role   = $role;
			$last_offset = $offset + strlen( $match[0] );
		}
		$step_content = substr( $form, $last_offset );
		$role_attr    = '' !== $prev_role ? ' data-role="' . $prev_role . '"' : '';
		$wrapped     .= '<div class="cf7mp-multistep__step" data-step="' . count( $matches[0] ) . '" data-title="' . $prev_title . '"' . $role_attr . '>' . $step_content . '</div>';
		$wrapped     .= '</div></div>';

		return $wrapped;
	}

	/**
	 * フォームID取得
	 *
	 * @return int
	 */
	private function get_form_id() {
		if ( function_exists( 'wpcf7_get_current_contact_form' ) ) {
			$cf7 = wpcf7_get_current_contact_form();
			return $cf7 ? $cf7->id() : 0;
		}
		return 0;
	}

	/**
	 * フロント側JS/CSS読込
	 */
	public function enqueue_assets() {
		// メインアセットはPlugin.phpで読込済
	}
}
