#include "Textbox.h"

#include <SDL.h>
#include <utf8/unchecked.h>

textboxclass::textboxclass(void)
{
    w = 0;
    h = 0;
    tl = 0;
    prev_tl = 0;
    tm = 0;
    timer = 0;

    xp = 0;
    yp = 0;
    r = 0;
    g = 0;
    b = 0;

    flipme = false;

    rand = 0;
}

void textboxclass::centerx(void)
{
    resize();
    xp = 160 - (w / 2);
    resize();
}
void textboxclass::centery(void)
{
    resize();
    yp = 120 - (h / 2);
    resize();
}

void textboxclass::adjust(void)
{
    resize();
    if (xp < 10) xp = 10;
    if (yp < 10) yp = 10;
    if (xp + w > 310) xp = 310 - w;
    if (yp + h > 230) yp = 230 - h;
    resize();
}

void textboxclass::initcol(int rr, int gg, int bb)
{
    r = rr;
    g = gg;
    b = bb;
    tl = 0.5;
}

void textboxclass::update(void)
{
    prev_tl = tl;
    if (tm == 0)
    {
        tl += .1f;
        if (tl >= 1)
        {
            tl = 1;
            tm = 1;
        }
    }
    else if (tm == 2)
    {
        tl -= .1f;
        if (tl <= 0.5)
        {
            tl = 0.5;
            //this textbox will be removed by updatetextboxes() later
        }
    }
    if (timer > 0)
    {
        timer--;
        if (timer == 0) tm = 2;
    }
}

void textboxclass::remove(void)
{
    tm = 2;
    tl = 1.0f; //Remove mode
}

void textboxclass::removefast(void)
{
    tm = 2;
    tl = 0.4f; //Remove mode
}

void textboxclass::resize(void)
{
    //Set the width and height to the correct sizes
    int max = 0;
    for (size_t iter = 0; iter < lines.size(); iter++)
    {
        unsigned int len = utf8::unchecked::distance(lines[iter].begin(), lines[iter].end());
        if (len > (unsigned int)max) max = len;
    }

    // 16 for the borders
    w = max*8 + 16;
    h = lines.size()*8 + 16;
}

void textboxclass::addline(const std::string& t)
{
    lines.push_back(t);
    resize();
    if ((int) lines.size() >= 12) lines.clear();
}

void textboxclass::pad(size_t left_pad, size_t right_pad)
{
    // Pad the current text with a certain number of spaces on the left and right
    for (size_t iter = 0; iter < lines.size(); iter++)
    {
        lines[iter] = std::string(left_pad, ' ') + lines[iter] + std::string(right_pad, ' ');
    }
    resize();
}

void textboxclass::padtowidth(size_t new_w)
{
    /* Pad the current text so that each line is new_w pixels wide.
     * Each existing line is centered in that width. */
    resize();
    size_t chars_w = SDL_max(w-16, new_w) / 8;
    for (size_t iter = 0; iter < lines.size(); iter++)
    {
        size_t n_glyphs = utf8::unchecked::distance(lines[iter].begin(), lines[iter].end());
        signed int padding_needed = chars_w - n_glyphs;
        if (padding_needed < 0)
        {
            continue;
        }
        size_t left_pad = padding_needed / 2;
        size_t right_pad = padding_needed - left_pad;

        lines[iter] = std::string(left_pad, ' ') + lines[iter] + std::string(right_pad, ' ');
    }
    resize();
}

void textboxclass::centertext()
{
    padtowidth(w-16);
}
