/*:
 * @plugindesc 最適化されたランダム選択肢表示と即時コモンイベント起動プラグイン
 * @author YourName
 * @target MZ
 * 
 * @command setChoiceOptions
 * @text 選択肢オプション設定
 * @desc 選択肢のランダム化とコモンイベント起動を設定します。
 *
 * @arg randomCount
 * @text ランダム表示数
 * @type number
 * @min 0
 * @desc ランダムに表示する選択肢の数（0でランダム化無効、省略で全て表示）
 * @default 0
 *
 * @arg eventIds
 * @text コモンイベントID群
 * @type string
 * @desc カンマ区切りでコモンイベントIDを指定。例: 1,2,3,0,5 (0は無効)
 * @default 0
 * 
 * @help
 * このプラグインは、選択肢のランダム表示と
 * 各選択肢へのコモンイベント即時割り当てを組み合わせたものです。
 * 
 * 使用方法：
 * 1. イベントエディタで通常通り選択肢を設定します。
 * 2. 選択肢の直前にプラグインコマンド「選択肢オプション設定」を配置します。
 * 3. ランダム表示数とコモンイベントIDを設定します。
 *    - ランダム表示数が0の場合、ランダム化は行われません。
 *    - コモンイベントIDが全て0の場合、コモンイベント機能は無効になります。
 * 4. 選択肢を表示するイベントコマンドを配置します。
 * 
 * 注意：
 * - 設定は直後の選択肢表示にのみ適用されます。
 * - コモンイベントIDの指定は、ランダム化前の選択肢の順序に対応させてください。
 * - 「デフォルト」や「キャンセル」の設定は、ランダム化後の順序に応じて変更されます。
 * - コモンイベントは選択肢が表示されている間のみ機能します。
 */

(() => {
    const pluginName = "OptimizedRandomChoiceEventPlugin";

    let currentOptions = {
        randomCount: 0,
        eventIds: []
    };

    PluginManager.registerCommand(pluginName, "setChoiceOptions", args => {
        currentOptions.randomCount = Number(args.randomCount) || 0;
        currentOptions.eventIds = args.eventIds.split(',').map(id => Number(id));
        console.log(`選択肢オプションを設定しました。ランダム表示数: ${currentOptions.randomCount}, コモンイベントID: ${currentOptions.eventIds.join(', ')}`);
    });

    const _Game_Message_prototype_setChoices = Game_Message.prototype.setChoices;
    Game_Message.prototype.setChoices = function(choices, defaultType, cancelType) {
        let finalChoices = choices;
        let finalEventIds = currentOptions.eventIds;

        if (currentOptions.randomCount > 0) {
            const shuffleResult = shuffleArray(choices, currentOptions.eventIds);
            finalChoices = shuffleResult.choices;
            finalEventIds = shuffleResult.eventIds;

            if (currentOptions.randomCount < finalChoices.length) {
                finalChoices = finalChoices.slice(0, currentOptions.randomCount);
                finalEventIds = finalEventIds.slice(0, currentOptions.randomCount);
            }

            // デフォルトとキャンセルの設定を調整
            defaultType = defaultType < 0 ? defaultType : finalChoices.indexOf(choices[defaultType]);
            cancelType = cancelType < 0 ? cancelType : finalChoices.indexOf(choices[cancelType]);
        }

        _Game_Message_prototype_setChoices.call(this, finalChoices, defaultType, cancelType);
        
        // イベントトリガーの設定を保存
        this._eventIds = finalEventIds;

        // オプションをリセット
        currentOptions = { randomCount: 0, eventIds: [] };

        console.log(`選択肢数: ${finalChoices.length}, 設定されたイベントID: ${this._eventIds.join(', ')}`);
    };

    const _Window_ChoiceList_select = Window_ChoiceList.prototype.select;
    Window_ChoiceList.prototype.select = function(index) {
        const previousIndex = this.index();
        _Window_ChoiceList_select.call(this, index);
        
        if (this.isOpen() && index !== previousIndex && index >= 0 && index < this._list.length) {
            const eventId = $gameMessage._eventIds[index];
            if (eventId > 0) {
                this.triggerCommonEvent(eventId);
            }
        }
    };

    Window_ChoiceList.prototype.triggerCommonEvent = function(eventId) {
        const commonEvent = $dataCommonEvents[eventId];
        if (commonEvent) {
            const interpreter = new Game_Interpreter();
            interpreter.setup(commonEvent.list, 0);
            interpreter.update();
            console.log(`選択肢 ${this.index() + 1} にカーソルが移動しました。コモンイベント ${eventId} を起動します。`);
        }
    };

    function shuffleArray(array, associatedArray) {
        const shuffled = array.slice();
        const shuffledAssociated = associatedArray.slice();
        for (let i = shuffled.length - 1; i > 0; i--) {
            const j = Math.floor(Math.random() * (i + 1));
            [shuffled[i], shuffled[j]] = [shuffled[j], shuffled[i]];
            [shuffledAssociated[i], shuffledAssociated[j]] = [shuffledAssociated[j], shuffledAssociated[i]];
        }
        return { choices: shuffled, eventIds: shuffledAssociated };
    }
})();