/*:ja
 * @plugindesc v1.6 自動改行、自動非表示、表示切替機能付きカスタマイズ可能バトルログ
 * @author えむうｎ
 * @target MZ
 * @param X座標
 * @desc バトルログウィンドウのX座標
 * @default 0
 * @type number
 * 
 * @param Y座標
 * @desc バトルログウィンドウのY座標
 * @default 0
 * @type number
 * 
 * @param 幅
 * @desc バトルログウィンドウの幅
 * @default 816
 * @type number
 * 
 * @param 高さ
 * @desc バトルログウィンドウの高さ
 * @default 72
 * @type number
 * 
 * @param 不透明度
 * @desc バトルログウィンドウの不透明度 (0-255)
 * @default 255
 * @type number
 * @min 0
 * @max 255
 *
 * @param 行の高さ
 * @desc バトルログの各行の高さ
 * @default 36
 * @type number
 *
 * @param 自動非表示時間
 * @desc バトルログが自動的に非表示になるまでの時間（フレーム数、60フレーム = 1秒、0で無効）
 * @default 150
 * @type number
 *
 * @param バトルログ表示
 * @desc バトルログの表示/非表示を切り替えます
 * @default true
 * @type boolean
 *
 * @command setBattleLogVisibility
 * @text バトルログ表示切替
 * @desc バトルログの表示/非表示を切り替えます
 *
 * @arg visibility
 * @text 表示状態
 * @type boolean
 * @on 表示
 * @off 非表示
 * @default true
 *
 * @help 
 * このプラグインは、バトルログウィンドウをカスタマイズし、以下の機能を追加します：
 * - 自動改行
 * - 指定時間後の自動非表示
 * - バトルログの表示/非表示切り替え
 * 
 * プラグインパラメータで位置、サイズ、不透明度、行の高さ、自動非表示時間、
 * 表示/非表示を設定できます。
 * 
 * v1.6: プラグインコマンドでバトルログの表示/非表示を切り替える機能を追加しました。
 * 
 * プラグインコマンド:
 * バトルログ表示切替 - ゲーム中にバトルログの表示/非表示を切り替えます。
 */

(() => {
    const pluginName = "CustomizableBattleLog";
    const parameters = PluginManager.parameters(pluginName);

    const xPos = Number(parameters['X座標'] || 0);
    const yPos = Number(parameters['Y座標'] || 0);
    const width = Number(parameters['幅'] || 816);
    const height = Number(parameters['高さ'] || 72);
    const opacity = Number(parameters['不透明度'] || 255);
    const lineHeight = Number(parameters['行の高さ'] || 36);
    const autoHideDelay = Number(parameters['自動非表示時間'] || 150);
    let displayBattleLog = parameters['バトルログ表示'] === 'true';

    PluginManager.registerCommand(pluginName, "setBattleLogVisibility", args => {
        displayBattleLog = args.visibility === 'true';
        if ($gameParty.inBattle() && SceneManager._scene._logWindow) {
            SceneManager._scene._logWindow.updateVisibility();
        }
    });

    const _Window_BattleLog_initialize = Window_BattleLog.prototype.initialize;
    Window_BattleLog.prototype.initialize = function(rect) {
        _Window_BattleLog_initialize.call(this, rect);
        this.opacity = opacity;
        this.lineHeight = function() { return lineHeight; };
        this._autoHideTimer = 0;
        this.updateVisibility();
    };

    const _Scene_Battle_createLogWindow = Scene_Battle.prototype.createLogWindow;
    Scene_Battle.prototype.createLogWindow = function() {
        _Scene_Battle_createLogWindow.call(this);
        this._logWindow.move(xPos, yPos, width, height);
    };

    const _Window_BattleLog_addText = Window_BattleLog.prototype.addText;
    Window_BattleLog.prototype.addText = function(text) {
        if (displayBattleLog) {
            _Window_BattleLog_addText.call(this, text);
            const wrappedLines = this.wrapText(text);
            this._lines = this._lines.slice(-wrappedLines.length);
            this.refresh();
            this.show();
            this._autoHideTimer = autoHideDelay;
        }
    };

    Window_BattleLog.prototype.wrapText = function(text) {
        const words = text.split(' ');
        let line = '';
        const lines = [];

        for (let i = 0; i < words.length; i++) {
            const testLine = line + words[i] + ' ';
            if (this.textWidth(testLine) > this.innerWidth) {
                if (line) {
                    lines.push(line.trim());
                }
                line = words[i] + ' ';
            } else {
                line = testLine;
            }
        }
        if (line) {
            lines.push(line.trim());
        }

        return lines;
    };

    const _Window_BattleLog_update = Window_BattleLog.prototype.update;
    Window_BattleLog.prototype.update = function() {
        _Window_BattleLog_update.call(this);
        if (displayBattleLog) {
            this.updateAutoHide();
        }
    };

    Window_BattleLog.prototype.updateAutoHide = function() {
        if (this._autoHideTimer > 0) {
            this._autoHideTimer--;
            if (this._autoHideTimer === 0) {
                this.hide();
            }
        }
    };

    const _Window_BattleLog_clear = Window_BattleLog.prototype.clear;
    Window_BattleLog.prototype.clear = function() {
        _Window_BattleLog_clear.call(this);
        if (displayBattleLog) {
            this._autoHideTimer = 0;
        } else {
            this.hide();
        }
    };

    const _Window_BattleLog_setWaitMode = Window_BattleLog.prototype.setWaitMode;
    Window_BattleLog.prototype.setWaitMode = function(waitMode) {
        if (displayBattleLog) {
            this.show();
        }
        return _Window_BattleLog_setWaitMode.call(this, waitMode);
    };

    Window_BattleLog.prototype.showLine = function(text) {
        if (displayBattleLog) {
            Window_Base.prototype.showLine.call(this, text);
        }
    };

    Window_BattleLog.prototype.updateVisibility = function() {
        this.visible = displayBattleLog;
    };

    const _Scene_Battle_start = Scene_Battle.prototype.start;
    Scene_Battle.prototype.start = function() {
        _Scene_Battle_start.call(this);
        if (this._logWindow) {
            this._logWindow.updateVisibility();
        }
    };
})();