#include "playerinterface.hpp"
#include <iostream>

namespace snakeplusplus 
{
    PlayerInput::PlayerInput(void)
    {
        lastPlayerInput = kNone;
    }

    PlayerDirection PlayerInput::GetPlayerInput(void)
    {
        if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left))
            lastPlayerInput = kLeft;
        if (sf::Keyboard::isKeyPressed(sf::Keyboard::Up))
            lastPlayerInput = kUp;
        if (sf::Keyboard::isKeyPressed(sf::Keyboard::Down))
            lastPlayerInput = kDown;
        if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right))
            lastPlayerInput = kRight;
        return lastPlayerInput;
    }

    bool PlayerOutput::IsOpen(void)
    {
        return isWindowAlive;
    }

    PlayerOutput::PlayerOutput(void)
    {
        float kWidth = 1025 / kGridSize;
        float kHeight = 725 / kGridSize;
        gameBoundaries = sf::Vector2f(kWidth, kHeight); 
        gameVideoSettings = sf::VideoMode(1025, 725);
        drawObject.setSize(sf::Vector2f(kGridSize, kGridSize));
        return;
    }

    void PlayerOutput::CheckContinue(void)
    {
        sf::Event event;
        while (true)
        {
            while (gameWindow.pollEvent(event))
            {
                if ((event.type == sf::Event::Closed) || 
                    (sf::Keyboard::isKeyPressed(sf::Keyboard::Escape)))
                    gameWindow.close();
                return;
            }
            if (sf::Keyboard::isKeyPressed(sf::Keyboard::Enter))
                return;
            sf::sleep(delay);
        }
    }

    void PlayerOutput::DisplayEndScreen(void)
    {
        gameWindow.clear();
        sf::Vector2f textPosition(gameBoundaries);
        textPosition.x = textPosition.x / 2;
        textPosition.y = textPosition.y / 2;
        sf::Text gameOverText;
        gameOverText.setString("Game Over");
        gameOverText.setCharacterSize(30);
        gameOverText.setPosition(textPosition);
        gameWindow.draw(gameOverText);
        gameWindow.display();
        // if (!PlayerWantsToContinue())
        //     return;
        // player = Snake();
        // playerFood.GenerateNewFood(GetGameBoundaries());
        // gameWindow.clear();
        return;
    }

    void PlayerOutput::DisplayGameState(std::vector< std::vector<char> >* gameBoard)
    {
        CheckWindowEvents();
        sf::Vector2i location(0,0);
        char letterOnBoard;
        for (; location.y < gameBoundaries.y; location.y++)
        {
            for (; location.x < gameBoundaries.x; location.x++)
            {
                letterOnBoard = gameBoard->at(location.y).at(location.y);
                if (letterOnBoard == 'o')
                    DrawSnake(static_cast<sf::Vector2f>(location));
                else if (letterOnBoard == 'x')
                    DrawFood(static_cast<sf::Vector2f>(location));
                else
                    DrawEmpty(static_cast<sf::Vector2f>(location));
            }
        }
        gameWindow.display();
        sf::sleep(delay);
        return;
    }

    void PlayerOutput::StartGameWindow(void)
    {
        gameWindow.create(gameVideoSettings, "SnakePlusPlus");
        isWindowAlive = true;
        return;
    }

    void PlayerOutput::CheckWindowEvents(void)
    {
        sf::Event event;
        while (gameWindow.pollEvent(event))
        {
            if ((event.type == sf::Event::Closed) || 
                (sf::Keyboard::isKeyPressed(sf::Keyboard::Escape)))
                gameWindow.close();
        }
    }

    void PlayerOutput::DrawEmpty(sf::Vector2f location)
    {
        location *= static_cast<float>(kGridSize);
        drawObject.setPosition(location);
        drawObject.setFillColor(sf::Color::Black);
        gameWindow.draw(drawObject);
        return;
    }

    void PlayerOutput::DrawFood(sf::Vector2f location)
    {
        location *= static_cast<float>(kGridSize);
        drawObject.setPosition(location);
        drawObject.setFillColor(sf::Color::Red);
        gameWindow.draw(drawObject);
        return;
    }

    void PlayerOutput::DrawSnake(sf::Vector2f location)
    {
        location *= static_cast<float>(kGridSize);
        drawObject.setPosition(location);
        drawObject.setFillColor(sf::Color::Green);
        gameWindow.draw(drawObject);
        return;
    }
}