<?php

if ( ! defined( 'ABSPATH' ) ) {

    exit;

}



/**

 * RSS データを AI プロンプトに注入するクラス

 *

 * 振る舞い:

 *   - プロンプトに {{rss_articles}} プレースホルダがあれば、その位置に注入する

 *   - プレースホルダが無ければ、プロンプト末尾に連結する

 *   - pick モードでは AI に selected_rss_index を返すよう指示文を付与

 *   - digest モードでは「全件を踏まえて」と指示文を付与

 *   - どちらのモードでも「source_url を本文に出力しない」と明示する

 */

class AIAP_RSS_Composer {



    const PLACEHOLDER = '{{rss_articles}}';



    /**

     * プロンプトに RSS データを注入する

     *

     * @param string $prompt

     * @param array  $articles  pick_unused() の戻り値

     * @param string $mode      'pick' | 'digest'

     * @return string

     */

    public static function inject( $prompt, array $articles, $mode ) {

        $prompt = (string) $prompt;

        if ( empty( $articles ) ) {

            return $prompt;

        }

        $block = self::build_block( $articles, $mode );



        if ( strpos( $prompt, self::PLACEHOLDER ) !== false ) {

            return str_replace( self::PLACEHOLDER, $block, $prompt );

        }

        return $prompt . "\n\n" . $block;

    }



    /**

     * 記事配列＋指示文のブロック文字列を組み立てる

     *

     * @param array  $articles

     * @param string $mode

     * @return string

     */

    private static function build_block( array $articles, $mode ) {

        $lines = array( '## 参考ニュース候補', '' );

        $n     = 0;

        foreach ( $articles as $a ) {

            $n++;

            $lines[] = '[' . $n . ']';

            $lines[] = 'title: '        . ( isset( $a['title'] )       ? (string) $a['title']       : '' );

            $lines[] = 'description: '  . ( isset( $a['description'] ) ? (string) $a['description'] : '' );

            $lines[] = 'published_at: ' . ( isset( $a['pub_date'] )    ? (string) $a['pub_date']    : '' );

            $lines[] = 'source_url: '   . ( isset( $a['link'] )        ? (string) $a['link']        : '' );

            $lines[] = '';

        }



        if ( $mode === 'digest' ) {

            $lines[] = '上記のニュース複数件を踏まえて、トピックを横断的にまとめたオリジナルな解説記事を執筆してください。';

            $lines[] = '本文中に source_url のリンクを出力しないでください。';

        } else {

            // 既定は pick モード

            $lines[] = '上記のニュース候補から最も独自記事化しやすく興味深い 1 件を選び、その記事を題材にオリジナルな解説記事を執筆してください。';

            $lines[] = '選んだ番号を JSON 出力に "selected_rss_index" (1〜N の数字) として必ず含めてください。';

            $lines[] = '本文中に source_url のリンクを出力しないでください。';

        }



        return implode( "\n", $lines );

    }



    /**

     * 投稿作成ログ用の RSS サマリ文字列を生成する

     *

     * 出力例:

     *   pick   → "pick / 記事タイトル（最大80カラム幅で省略）"

     *   digest → "digest / 3"

     *

     * @param array  $consumed  使用された記事の配列（poster で確定された $rss_consumed）

     * @param string $mode      'pick' | 'digest'

     * @return string  空配列の場合は ''

     */

    public static function build_log_summary( array $consumed, $mode ) {

        if ( empty( $consumed ) ) {

            return '';

        }

        if ( $mode === 'pick' ) {

            $title = isset( $consumed[0]['title'] ) ? (string) $consumed[0]['title'] : '';

            $title = wp_strip_all_tags( $title );

            $title = AIAP_Compat::mb_strimwidth( $title, 0, 80, '…', 'UTF-8' );

            return 'pick / ' . $title;

        }

        return 'digest / ' . count( $consumed );

    }

}

