/*:
 * @target MZ
 * @plugindesc メッセージウィンドウのフェイス画像機能を拡張するプラグイン
 * @author えむうん
 *
 * @param faceScale
 * @text フェイス画像のスケール
 * @desc フェイス画像の表示スケール（1.0で原寸大、0.5で半分のサイズ）
 * @default 1.0
 * @type number
 * @min 0.1
 * @max 2.0
 * @decimals 2
 *
 * @param faceBottomMargin
 * @text フェイス画像の下マージン
 * @desc フェイス画像の下端からウィンドウの下端までのマージン（ピクセル）
 * @default 0
 * @type number
 *
 * @param faceLeftMargin
 * @text フェイス画像の左マージン
 * @desc フェイス画像の左端からウィンドウの左端までのマージン（ピクセル）
 * @default 0
 * @type number
 *
 * @param faceOffsetX
 * @text フェイス画像のX座標オフセット
 * @desc フェイス画像のX座標を調整します（正の値で右へ、負の値で左へ移動）
 * @default 0
 * @type number
 * @min -1000
 * @max 1000
 *
 * @param faceOffsetY
 * @text フェイス画像のY座標オフセット
 * @desc フェイス画像のY座標を調整します（正の値で下へ、負の値で上へ移動）
 * @default 0
 * @type number
 * @min -1000
 * @max 1000
 *
 * @param textPadding
 * @text テキストのパディング
 * @desc フェイス画像とテキストの間のパディング（ピクセル）
 * @default 10
 * @type number
 *
 * @param debugMode
 * @text デバッグモード
 * @desc デバッグログを出力するかどうか
 * @default false
 * @type boolean
 *
 * @help
 * このプラグインは、メッセージウィンドウのフェイス画像機能を拡張し、
 * 位置調整、サイズ調整などの機能を提供します。
 * フェイス画像はウィンドウが完全に開いてから表示されます。
 */

(function() {
    'use strict';
    const pluginName = "CustomFaceDrawingMessage";
    const parameters = PluginManager.parameters(pluginName);

    const faceScale = Number(parameters['faceScale'] || 1.0);
    const faceBottomMargin = Number(parameters['faceBottomMargin'] || 0);
    const faceLeftMargin = Number(parameters['faceLeftMargin'] || 0);
    const faceOffsetX = Number(parameters['faceOffsetX'] || 0);
    const faceOffsetY = Number(parameters['faceOffsetY'] || 0);
    const textPadding = Number(parameters['textPadding'] || 10);
    const debugMode = parameters['debugMode'] === 'true';

    function debugLog(...args) {
        if (debugMode) {
            console.log('[CustomFaceDrawingMessage]', ...args);
        }
    }

    const _Window_Message_initialize = Window_Message.prototype.initialize;
    Window_Message.prototype.initialize = function(rect) {
        _Window_Message_initialize.call(this, rect);
        this._faceSprite = null;
        this._faceContainer = new PIXI.Container();
        this.addChild(this._faceContainer);
        this._customTextStartX = 0;
        this._actualFaceWidth = 0;
        this._faceBitmap = null;
        this._faceDrawnFlag = false;
        debugLog('Window_Message initialized', rect);
    };

    Window_Message.prototype.loadMessageFace = function() {
        const faceName = $gameMessage.faceName();
        if (faceName) {
            this._faceBitmap = ImageManager.loadFace(faceName);
        } else {
            this._faceBitmap = null;
        }
    };

    Window_Message.prototype.drawMessageFace = function() {
        const faceName = $gameMessage.faceName();
        const faceIndex = $gameMessage.faceIndex();
        debugLog('drawMessageFace called', faceName, faceIndex);

        if (faceName) {
            const bitmap = this._faceBitmap;
            if (bitmap && bitmap.isReady()) {
                this.drawCustomFaceNow(bitmap, faceIndex);
                this.adjustTextStartPosition();
            } else if (bitmap) {
                bitmap.addLoadListener(() => {
                    this.drawCustomFaceNow(bitmap, faceIndex);
                    this.adjustTextStartPosition();
                    if (this._textState) {
                        this._textState.x = this.newLineX();
                    }
                    this.refresh();
                });
            }
        } else if (this._faceSprite) {
            this._faceContainer.removeChild(this._faceSprite);
            this._faceSprite = null;
            debugLog('Face sprite removed');
        }
        this.adjustTextStartPosition();
    };

    Window_Message.prototype.drawCustomFaceNow = function(bitmap, faceIndex) {
        if (this._faceSprite) {
            this._faceContainer.removeChild(this._faceSprite);
        }
        const faceWidth = bitmap.width / 4;
        const faceHeight = bitmap.height / 2;
        const sw = faceWidth;
        const sh = faceHeight;
        const sx = faceIndex % 4 * faceWidth;
        const sy = Math.floor(faceIndex / 4) * faceHeight;
        
        const scaledWidth = faceWidth * faceScale;
        const scaledHeight = faceHeight * faceScale;

        let dx = faceLeftMargin;
        let dy = this.height - scaledHeight - faceBottomMargin;

        dx += faceOffsetX;
        dy += faceOffsetY;

        this._faceSprite = new Sprite();
        this._faceSprite.bitmap = new Bitmap(scaledWidth, scaledHeight);
        this._faceSprite.bitmap.blt(bitmap, sx, sy, sw, sh, 0, 0, scaledWidth, scaledHeight);
        this._faceSprite.x = dx;
        this._faceSprite.y = dy;
        this._faceSprite.alpha = 0;  // 初期状態では透明に設定
        this._faceContainer.addChild(this._faceSprite);

        // 実際のフェイス画像の幅を保存
        this._actualFaceWidth = scaledWidth;

        debugLog('Face drawn', {sx, sy, sw, sh, dx, dy, scale: faceScale, actualFaceWidth: this._actualFaceWidth});
    };

    Window_Message.prototype.adjustTextStartPosition = function() {
        if (this._faceSprite) {
            this._customTextStartX = this._actualFaceWidth + textPadding;
        } else {
            this._customTextStartX = 0;
        }
        this.resetFontSettings();
        debugLog('Text start position adjusted', {customTextStartX: this._customTextStartX});
    };

    const _Window_Message_update = Window_Message.prototype.update;
    Window_Message.prototype.update = function() {
        _Window_Message_update.call(this);
        this.updateFaceSprite();
    };

    Window_Message.prototype.updateFaceSprite = function() {
        if (this._faceSprite && !this._faceDrawnFlag && this.isOpen()) {
            this._faceSprite.alpha = 1;  // ウィンドウが開いたらフェイス画像を表示
            this._faceDrawnFlag = true;
            debugLog('Face sprite displayed');
        }
    };

    const _Window_Message_newPage = Window_Message.prototype.newPage;
    Window_Message.prototype.newPage = function(textState) {
        this._faceDrawnFlag = false;  // 新しいページで初期化
        _Window_Message_newPage.call(this, textState);
        this.loadMessageFace();
        this.drawMessageFace();
        textState.x = this.newLineX();
    };

    Window_Message.prototype.newLineX = function() {
        return this._customTextStartX || 0;
    };

    const _Window_Message_processNewLine = Window_Message.prototype.processNewLine;
    Window_Message.prototype.processNewLine = function(textState) {
        _Window_Message_processNewLine.call(this, textState);
        if (textState.text[textState.index] !== "\n") {
            textState.x = this.newLineX();
        }
    };

})();