import TextAlignment from "./TextAlignment.js";

export default class TextLine
{
    constructor(text, paused)
    {
        this.text = text;
        this.paused = paused;
        this.estimatedTextWidth = null;
        this.colorText = 'red';
        this.colorShadow = 'black';
        this.colorBorder = 'black';
        this.font = 'sans-serif';
        this.alphaText = 1.0;
        this.size = 32;
        this.alignment = TextAlignment.LEFT;
        this.chars = this.text.length;
        this.hasShadow = false;
        this.hasBorder = false;
    }

    animate(msPerChar = 100)
    {
        this.chars = 0;

        let process = setInterval(
            () => {
                if (this.paused) {
                    return;
                }

                this.chars++;

                if (this.chars === this.text.length) {
                    clearInterval(process);
                }
            }, msPerChar
        );
    }

    draw(context, x, y)
    {
        context.font = this.size + 'px ' + this.font;
        context.globalAlpha = this.alphaText;

        if (this.estimatedTextWidth === null) {
            this.estimatedTextWidth = Math.ceil(context.measureText(this.text).width);
        }

        switch (this.alignment) {
            case TextAlignment.LEFT:
                break;
            case TextAlignment.CENTER:
                x -= this.estimatedTextWidth * 0.5;
                break;
            case TextAlignment.RIGHT:
                x -= this.estimatedTextWidth;
                break;
        }

        this.drawShadow(context, x, y);

        let text = this.text;

        if (this.chars !== null && this.chars < this.text.length) {
            text = this.text.substr(0, this.chars);
        }

        context.fillStyle = this.colorText;
        context.fillText(text, x, y + this.size);

        this.drawBorder(context, x, y, text);
    }

    drawBorder(context, x, y, text)
    {
        if (this.hasBorder) {
            context.strokeStyle = this.colorBorder;
            context.strokeWidth = '1px';
            context.strokeText(text, x, y + this.size);
        }
    }

    drawShadow(context, x, y)
    {
        if (this.hasShadow) {
            context.fillStyle = this.colorShadow;
            context.fillText(this.text.substr(0, this.chars), x + 2, y + this.size + 2);
        }
    }
}
