#include "InfoAppMenu.h"

#include "AppMenu.h"
#include "../PlayerCursor.h"

#include <stack>
#include <memory>
#include <SFML/Graphics.hpp>


InfoAppMenu::InfoAppMenu(std::shared_ptr<MenuStack> menuStack, std::shared_ptr<Settings> settings, std::shared_ptr<sf::RenderWindow> renderWindow) :
    AppMenu(menuStack, settings, renderWindow),
    playerCursor({INFO_SECTIONS_COUNT}),
    sectionsName({
        "< ABOUT >",
        "< PIECES TYPES >",
        "< 0 DEGREES ROTATIONS >",
        "< ROTATION SYSTEM >",
        "< SCORING >"
    }),
    sectionsContent({
        "This game is written in C++,\n"
        "using SFML 3 for the GUI.\n"
        "It has been inspired by other\n"
        "stacker games, such as\n"
        "Techmino, jstris, tetr.io, etc.\n"
        "This project isn't affiliated\n"
        "to them in any ways.\n"
        "Current version: beta.",

        "There is multiple pieces type in\n"
        "the selection screen. Use theses\n"
        "categories for size of at least 7.\n"
        "Convex, Holeless and Others are\n"
        "all mutually exclusive.\n"
        "Others have holes inside them, and\n"
        "Convex are presumably easier to\n"
        "play with than Holeless.",

        "This games introduces 0 degrees\n"
        "rotations, which work by simpling\n"
        "moving the piece down and kicking\n"
        "it as is, allowing for new kinds\n"
        "of kicks.\n"
        "As a leniency mechanic, when a\n"
        "piece spawns it will automatically\n"
        "try a 0 degrees rotations if it\n"
        "spawned inside a wall.",

        "This game uses its own\n"
        "Rotation Sytem, called AutoRS.\n"
        "The rotation center is always the\n"
        "center of the piece by default.\n"
        "When kicking the piece, it will\n"
        "compute and try (most) position that\n"
        "touches the original piece,\n"
        "prioritizing sides over depth and\n"
        "firstly going down before going up.",

        "The score gained from a line clear\n"
        "doubles when clearing one more line.\n"
        "Clearing with a spin scores as much\n"
        "as clearing 2x more lines normally.\n"
        "B2B is granted by clearing at least\n"
        "4 lines or doing a spin or mini-spin,\n"
        "and doubles the score gained.\n"
        "A spin is detected when the piece is\n"
        "locked in place, a mini-spin simply\n"
        "when the last move was a kick."
    }) {

}

void InfoAppMenu::computeFrame() {
    this->updateMetaBinds();
    this->playerCursor.updatePosition();

    if (this->escReleased) {
        this->menuStack->pop();
    }
}

void InfoAppMenu::drawFrame() const {
    this->renderWindow->clear(sf::Color(200, 200, 200));

    sf::Text text(this->pressStartFont, "", this->settings->getWindowSizeMultiplier() * 2);
    text.setFillColor(sf::Color(0, 0, 0));
    text.setOutlineColor(sf::Color(255, 255, 255));

    this->placeTitle(text, this->playerCursor, this->sectionsName[this->playerCursor.getPosition().x], 10.f, this->playerCursor.getPosition());

    text.setLineSpacing((float) this->settings->getWindowSizeMultiplier() / 8);
    text.setOutlineThickness(0);
    this->placeText(text, {}, this->sectionsContent[this->playerCursor.getPosition().x], 5.f, 30.f, {});
    
    this->renderWindow->display();
}
