<?php

namespace Pixalia\ImageAssistant\Admin;

use Pixalia\ImageAssistant\Base\Const\PixaliaConst;
use Pixalia\ImageAssistant\Repository\OptionRepository;
use Pixalia\ImageAssistant\Repository\PostRepository;
use Pixalia\ImageAssistant\Service\Container\ImageCheckResult;
use Pixalia\ImageAssistant\Service\Container\PostData;
use Pixalia\ImageAssistant\Service\ImageChecker;

/**
 * 管理画面用のCSS・JSアセットを登録・読み込みします。
 */
class Assets {

	private const MENU_KEY = 'pixalia-assistant';
	public function __construct() {
	}

	/**
	 * 管理画面用のアセットを読み込みます。
	 *
	 * @param string $hook_suffix 現在の管理画面ページのフックサフィックス
	 */
	public function enqueue( string $hook_suffix ) {
		// ページのフックサフィックスを定義
		$settingsHook      = 'toplevel_page_' . PixaliaConst::MENU_SLUG_SETTINGS;
		$eyecatchCheckHook = self::MENU_KEY . '_page_' . PixaliaConst::MENU_SLUG_EYECATCH_CHECK;
		$postEditHooks     = [ 'post.php', 'post-new.php' ];
		// アセットを読み込むべきページか判定
		// 投稿編集画面内か、pixaliaが規定したダッシュボード、設定ページの場合
		$should_enqueue = (
			in_array( $hook_suffix, $postEditHooks, true )
			|| in_array( $hook_suffix, [ $eyecatchCheckHook, $settingsHook ], true )
		);

		// 対象ページでなければ終了
		if ( ! $should_enqueue ) {
			return;
		}

		//run devで動作確認する場合は分岐させること
		// アセットを登録・読み込み
//		wp_enqueue_style(
//			'pixalia-admin-style',
//			PXBX_PLUGIN_URL . 'dist/main.css',
//			[],
//			filemtime( PXBX_PLUGIN_PATH . 'dist/main.css' )
//		);
		wp_enqueue_script(
			'pixalia-admin-script',
			PXBX_PLUGIN_URL . 'dist/main.js',
			[
				'wp-element',
				'wp-blocks',
				'wp-data',
				'wp-i18n',
				'wp-components',
				'wp-editor' // ロック機能(lockPostSaving)を使うために必要
			], // 依存スクリプト$
			filemtime( PXBX_PLUGIN_PATH . 'dist/main.js' ),
			true
		);

		wp_enqueue_style(
			'pixalia-admin-global-style', // ハンドル名は他とかぶらなければ何でもOK
			PXBX_PLUGIN_URL . 'assets/css/admin-style.css',
			[],
			filemtime( PXBX_PLUGIN_PATH . 'assets/css/admin-style.css' )
		);

		// 2. ★ここが重要！ JSに翻訳ファイルを紐付ける関数
		wp_set_script_translations(
			'pixalia-admin-script',            // 上記で登録したハンドル名と一致させる
			'pixalia-image-assistant',   // テキストドメイン
			PXBX_PLUGIN_PATH . 'languages' // 言語ファイルのパス
		);

		// JavaScriptに渡すデータを準備
		$data_to_pass = [
			'nonce' => wp_create_nonce( 'wp_rest' ), // REST APIやAJAXで使うNonce（トークン）
			'distUrl' => PXBX_PLUGIN_URL . 'dist/', // アセットのURL
			'needsBulkCheck' => false, // 一括チェックが必要かどうかのフラグ（初期値はfalse）
			'locale' => get_user_locale(), // 現在のユーザーの言語（ロケール）
			// 他にもAPIエンドポイントのURLなど、JS側で必要なデータはここに追加
		];

		$optionRepository = new OptionRepository();
		// 対応投稿タイプのリストを渡す
		$data_to_pass['defaultStyle'] = $optionRepository->getDefaultStyle();
		$data_to_pass['defaultAspectRatio'] = $optionRepository->getDefaultAspectRatio();

		$data_to_pass['apiKey'] = $optionRepository->getApiKey();
		$data_to_pass['ajaxUrl'] = admin_url( 'admin-ajax.php' );

		// 投稿編集画面またはアイキャッチチェック画面で渡すデータをセット
		if ( in_array( $hook_suffix, $postEditHooks, true ) || $eyecatchCheckHook === $hook_suffix ) {
			$postRepository = new PostRepository();
			$postId         = $this->get_current_post_id();
			if ( $postId ) {
				$postData = new PostData($postId);

				$currentResultArray = [];
				// ★ ページによってチェック結果の取得方法を変える
				if ( $eyecatchCheckHook === $hook_suffix ) {
					// 【アイキャッチチェック画面】=> 最新チェックを実行し、差分があれば保存
					$checker = new ImageChecker();
					/** @var ImageCheckResult $currentResult */
					$currentResult = $checker->check( $postId ); // 最新の結果を取得

					// 保存済みの値を取得
					$savedStatus = $postRepository->getImageStatus( $postId );
					$savedSource = $postRepository->getImageSource( $postId );

					// 最新結果と比較
					$statusChanged = ( $currentResult->status !== $savedStatus );
					$sourceChanged = ( $currentResult->setFromEnum !== $savedSource );

					// 差分があれば更新
					if ( $statusChanged ) {
						$postRepository->updateImageStatus( $postId, $currentResult->status );
					}
					if ( $sourceChanged ) {
						$postRepository->updateImageSource( $postId, $currentResult->setFromEnum );
					}

					// JSには最新の結果を配列で渡す
					$postData->checkResults = [
						'status'  => $currentResult->status->value,
						'setFrom' => $currentResult->setFromEnum->value,
					];
				} elseif ( in_array( $hook_suffix, $postEditHooks, true ) ) {
					// 投稿編集画面 -> 保存済みのメタデータを読み込む
					$statusEnum                = $postRepository->getImageStatus( $postId );
					$sourceEnum                = $postRepository->getImageSource( $postId );
					$postData->checkResults = [
						'status'  => $statusEnum->value,
						'setFrom' => $sourceEnum->value,
					];
				}
				$data_to_pass['postData'] = $postData;
			}
		}

		//設定ページで渡すデータをセット
		if ( $hook_suffix === $settingsHook ) {
			// 1. APIキーを渡す

			// 2. 一括チェックが今のバージョンでされているかを確認（未チェックならフラグを立てる）
			$lastCheckVersion = $optionRepository->getLastCheckVersion();

			if ($lastCheckVersion < PixaliaConst::LOGIC_VERSION ) {
				$data_to_pass['needsBulkCheck'] = true;
			}
		}

		// データをJavaScriptのグローバル変数としてインラインで追加
		wp_localize_script(
			'pixalia-admin-script', // ハンドル名
			'pixaliaPluginData',    // JSでの変数名（自動的に window.pixaliaPluginData になります）
			$data_to_pass           // 配列をそのまま渡す（json_encode不要）
		);
	}

	/**
	 * 現在の投稿IDを取得するヘルパー関数
	 * @return int|null
	 */
	private function get_current_post_id(): ?int {
		// 投稿一覧や編集画面のURLパラメータ (GET)
		// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- 画面表示のためのID取得であり、データ更新ではないため
		if ( isset( $_GET['post'] ) ) {
			// phpcs:ignore WordPress.Security.NonceVerification.Recommended
			return absint( $_GET['post'] );
		}

		// 保存処理中などのPOSTデータ
		// phpcs:ignore WordPress.Security.NonceVerification.Missing -- コンテキスト判定のための参照のみ
		if ( isset( $_POST['post_ID'] ) ) {
			// phpcs:ignore WordPress.Security.NonceVerification.Missing
			return absint( $_POST['post_ID'] );
		}

		// ダッシュボードからのリンク用 (GET)
		// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- 画面表示のためのID取得
		if ( isset( $_GET['post_id'] ) ) {
			// phpcs:ignore WordPress.Security.NonceVerification.Recommended
			return absint( $_GET['post_id'] );
		}

		return null;
	}
}
