<?php

namespace Pixalia\ImageAssistant\Admin\View;

use Pixalia\ImageAssistant\Base\Const\FilterQueryKeyConst;
use Pixalia\ImageAssistant\Base\Const\MetaKeyConst;
use Pixalia\ImageAssistant\Base\Const\PixaliaConst;
use Pixalia\ImageAssistant\Service\ImageChecker;
use Pixalia\ImageAssistant\Base\Enum\ImageCheck\ImageCheckResultStatusEnum;
use Pixalia\ImageAssistant\Base\Enum\ImageCheck\ImageSetFromEnum;
use Pixalia\ImageAssistant\Service\Container\ImageCheckResult;

use function __ as __;

/**
 * PostList Class
 *
 * 投稿一覧画面の表示をカスタマイズします。
 */
class PostList {

    private const ColumnName = 'pixalia_status';

    /**
     * コンストラクタ (コンストラクタプロパティプロモーションを使用)
     */
    public function __construct() {
    }

    /**
     * 投稿一覧に「画像ステータス」列を追加します。
     *
     * @param array<string, string> $columns 既存の列の配列
     *
     * @return array<string, string> 新しい列が追加された配列
     */
    public function add_columns( array $columns ): array {
        $newColumns   = [];
        $column_id    = self::ColumnName;
        $icon_svg     = PixaliaConst::POST_COLUMN_ICON;
        $tooltip_text = __( 'Eyecatch Image Status. Click details.', 'pixalia-image-assistant' );

        // data属性にツールチップテキストを設定
        $column_content = sprintf(
                '<span class="pixalia-column-header" data-tooltip="%s">
<img src="%s" alt="Pixalia Icon" style="width:16px; height:16px; vertical-align:middle;">
</span>',
                esc_attr( $tooltip_text ),
                esc_attr( $icon_svg )
        );

        foreach ( $columns as $key => $title ) {
            $newColumns[ $key ] = $title;
            if ( 'date' === $key ) {
                $newColumns[ $column_id ] = $column_content;
            }
        }

        if ( ! isset( $newColumns[ $column_id ] ) ) {
            $newColumns[ $column_id ] = $column_content;
        }

        return $newColumns;
    }

    /**
     * 追加した列の内容を描画します。
     *
     * @param string $column 現在の列の名前
     * @param int $postId 現在の投稿ID
     */
    public function render_custom_column( string $column, int $postId ) {
        if ( self::ColumnName !== $column ) {
            return;
        }

        // 1. メタデータからステータスとソースの両方を取得
        $statusValue = get_post_meta( $postId, MetaKeyConst::ImageStatus, true );
        $sourceValue = get_post_meta( $postId, MetaKeyConst::ImageSource, true );

        // 2. ステータス値に基づいて表示を決定
        //保存しているアイキャッチ画像ステータスをEnumに変換（未評価の場合はステータスが無いのでフォールバック）
        $statusEnum = ImageCheckResultStatusEnum::tryFrom( (string) $statusValue );
        if ( ! $statusEnum ) {
            $statusEnum = ImageCheckResultStatusEnum::UNCHECKED;
        }
        $sourceEnum = ImageSetFromEnum::tryFrom( (string) $sourceValue ); // ★ SourceもEnumに変換

        // 不正値 or 未チェックの場合のフォールバック
        if ( ! $statusEnum ) {
            $statusEnum = ImageCheckResultStatusEnum::NG;
        }
        if ( ! $sourceEnum ) {
            $sourceEnum = ImageSetFromEnum::None;
        }

        $statusIcon = $statusEnum->getEmoji();

        // 3. ダッシュボードへのリンク生成 (変更なし)
        $dashboardUrl = add_query_arg(
                [
                        'page'    => PixaliaConst::MENU_SLUG_EYECATCH_CHECK,
                        'post_id' => $postId,
                ],
                admin_url( 'admin.php' )
        );

        // 4. 表示 (変更なし)
        printf(
                '<a href="%s" title="%s">%s</a>',
                esc_url( $dashboardUrl ),
                esc_attr( __( 'View details in Pixalia Image Assistant', 'pixalia-image-assistant' ) ),
                esc_html( $statusIcon )
        );
    }

    /**
     * 絞り込みドロップダウンを表示するメソッド
     * 'restrict_manage_posts' フックに登録されます。
     */
    public function add_filter_dropdown(): void {
        $screen = get_current_screen();
        /** @var array $allowedPostTypes */
        $allowedPostTypes = get_option( PixaliaConst::OPTION_POST_TYPES, [ 'post' ] );
        if ( ! $screen || ! in_array( $screen->post_type, $allowedPostTypes, true ) ) {
            return;
        }

        // phpcs:ignore WordPress.Security.NonceVerification.Recommended
        $currentFilter = isset( $_GET[ FilterQueryKeyConst::PixaliaImageFilter ] )
            // phpcs:ignore WordPress.Security.NonceVerification.Recommended
                ? sanitize_text_field( wp_unslash( $_GET[ FilterQueryKeyConst::PixaliaImageFilter ] ) )
                : '';
        ?>
        <label for="pixalia-image-filter" class="screen-reader-text">
            <?php
            esc_html_e( 'Filter by Image Status', 'pixalia-image-assistant' ); ?>
        </label>
        <select name="<?php
        echo esc_attr( FilterQueryKeyConst::PixaliaImageFilter ); ?>" id="pixalia-image-filter" class="postform">
            <option value=""><?php
                esc_html_e( 'Filter by image status', 'pixalia-image-assistant' ); ?></option>
            <?php
            foreach ( ImageCheckResultStatusEnum::cases() as $statusEnum ): ?>
                <option value="<?php
                echo esc_attr( $statusEnum->value ); ?>" <?php
                selected( $currentFilter, $statusEnum->value ); ?>>
                    <?php
                    echo esc_html( $statusEnum->getEmoji() ); ?>
                    <?php
                    // Enumの値に応じて翻訳されたテキストを取得
                    $text = match ( $statusEnum ) {
                        ImageCheckResultStatusEnum::OK => __( 'Set', 'pixalia-image-assistant' ),
                        ImageCheckResultStatusEnum::WARNING => __( 'Possible Fallback', 'pixalia-image-assistant' ),
                        ImageCheckResultStatusEnum::NG => __( 'Not Set', 'pixalia-image-assistant' ),
                        ImageCheckResultStatusEnum::UNCHECKED => __( 'Not Checked', 'pixalia-image-assistant' ),
                    };
                    echo esc_html( $text );
                    ?>
                </option>
            <?php
            endforeach; ?>
        </select>
        <?php
    }

    /**
     * 選択されたフィルターに基づいてメインクエリを変更するメソッド
     * 'parse_query' フックに登録されます。
     *
     * @param \WP_Query $query メインのWP_Queryオブジェクト
     */
    public function modify_query( \WP_Query $query ): void {
        if ( ! is_admin() || ! $query->is_main_query() ) {
            return;
        }

        $screen = get_current_screen();
        /** @var array $allowedPostTypes */
        $allowedPostTypes = get_option( PixaliaConst::OPTION_POST_TYPES, [ 'post' ] );
        if ( ! $screen || 'edit' !== $screen->base || ! in_array( $screen->post_type, $allowedPostTypes, true ) ) {
            return;
        }
        // phpcs:ignore WordPress.Security.NonceVerification.Recommended
        if ( isset( $_GET[ FilterQueryKeyConst::PixaliaImageFilter ] ) === false ) {
            return;
        }
        // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- 投稿一覧の絞り込みフィルタ（GETリクエスト）のためNonce確認は不要
        $filterValue = isset( $_GET[ FilterQueryKeyConst::PixaliaImageFilter ] )
            // phpcs:ignore WordPress.Security.NonceVerification.Recommended
                ? sanitize_text_field( wp_unslash( $_GET[ FilterQueryKeyConst::PixaliaImageFilter ] ) )
                : '';
        // ★ フィルターが空なら、ここで処理を終了
        if ( empty( $filterValue ) ) {
            return;
        }

        // ★ ここで $metaQuery を初期化
        /** @var array $metaQuery */
        $metaQuery = $query->get( 'meta_query' ) ?: [];

        // 有効なステータス値かEnumを使ってチェック
        $validStatuses = array_map( fn( $case ) => $case->value, ImageCheckResultStatusEnum::cases() );

        // ★ フィルター値が有効なステータスかまず確認
        if ( ! in_array( $filterValue, $validStatuses, true ) ) {
            return; // 無効な値なら何もしない
        }

        if ( $filterValue === ImageCheckResultStatusEnum::UNCHECKED->value ) {
            // 「未チェック」が選択された場合
            $metaQuery[] = [
                    'key'     => MetaKeyConst::ImageStatus,
                    'compare' => 'NOT EXISTS',
            ];
        } else {
            // それ以外のステータス（OK, Warning, NG）が選択された場合
            $metaQuery[] = [
                    'key'     => MetaKeyConst::ImageStatus,
                    'value'   => $filterValue,
                    'compare' => '=',
            ];
        }

        $query->set( 'meta_query', $metaQuery );
    }
}
