#pragma once

#include <SFML/Graphics.hpp>
#include <TGUI/Core.hpp>
#include <TGUI/Backend/SFML-Graphics.hpp>
#include <TGUI/AllWidgets.hpp>
#include <iostream>
#include <math.h>

class Speed
{
public:
    double m_speed {};
    getSpeed () {return m_speed;}
    setSpeed (double speed) {m_speed=speed;}
    Speed ()=default;
};


tgui::ListBox::Ptr popupMenu;

// Called when selecting an item in the pop-up menu
double popupMenuCallback(tgui::String item)
{
    std::cout << item << std::endl;
    if (item == "Increase speed") {return 2.0;}
    else if (item == "Decrease speed") {return 0.5;}
    return 1.0;
}

// Called when a right click is detected while popup menu isn't shown
void rightClickCallback(tgui::BackendGui& gui, tgui::Vector2f position)
{
    popupMenu = tgui::ListBox::create();
    popupMenu->addItem("Increase speed");
    popupMenu->addItem("Decrease speed");
    popupMenu->setItemHeight(40);
    popupMenu->setPosition(position);
    popupMenu->setSize(200, popupMenu->getItemHeight() * popupMenu->getItemCount());
    popupMenu->onItemSelect(&popupMenuCallback);
    gui.add(popupMenu);
}


// Key inputs to move
void shipMove (double& x, double& y, double& s, double& a, double sp)
{
    double pi = 3.14159265358979323846;
    if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left))
    {
        a = a - 0.5 * sp;
    }
    if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right))
    {
        a = a + 0.5 * sp;
    }
    if (sf::Keyboard::isKeyPressed(sf::Keyboard::Up))
    {
        x += cos (2*pi*(a-90)/360)*sp;
        y += sin (2*pi*(a-90)/360)*sp;
    }
    if (sf::Keyboard::isKeyPressed(sf::Keyboard::Down))
    {
        x -= cos (2*pi*(a-90)/360)*sp;
        y -= sin (2*pi*(a-90)/360)*sp;
    }

//    std::cout << "uhel je: " << a << std::endl;
}

int main()
{


    // definitions
    double shipSize = 100;
    double shipX = 200;
    double shipY = 200;
    double shipRotate = 0;
    double sizeCoefStart = 1;
    double sizeCoef = sizeCoefStart;
    double sizeCoefDelta = 3;
    int counterStart = 10;
    int counter = counterStart;
    double speed {0.5};

    // create the window
    sf::ContextSettings settings;
    settings.antialiasingLevel = 8;

    sf::RenderWindow window(sf::VideoMode(800, 600), "My window" , sf::Style::Default, settings);  // sf::Style::Fullscreen);
    tgui::Gui gui(window);
    window.setFramerateLimit(12000);
    sf::Clock clock;
    float fps;
    std::string stringFps;

    //FPS
     sf::Font font;
     font.loadFromFile("DejaVuSans.ttf");
     sf::Text text;
     text.setPosition(400.0f,10.0f);
     text.setCharacterSize(24);
     text.setFillColor(sf::Color::Red);
     text.setFont(font);
     int fpsCount = 0;
     float fpsSum = 0;

    // run the program as long as the window is open
    while (window.isOpen())
    {
        // check all the window's events that were triggered since the last iteration of the loop
        sf::Time elapsed = clock.restart();
        fps = 1/elapsed.asSeconds();
        fpsSum = fpsSum * fpsCount;
        fpsSum += fps;
        ++fpsCount;
        fpsSum = fpsSum / fpsCount;
        if (fpsCount > fpsSum) fpsCount=fpsSum;
        stringFps = "FPS: " + std::to_string(fps);
      //  std::cout << stringFps << '\n';

        sf::Event event;
        while (window.pollEvent(event))
        {
            // "close requested" event: we close the window
            if (event.type == sf::Event::Closed)
                window.close();
            else if (event.type == sf::Event::MouseWheelMoved)
            {
                //std::cout << "mys     : " << event.mouseWheel.delta << std::endl;
                //std::cout << "sizeCoef: " << sizeCoef << std::endl;
                shipSize = shipSize + sizeCoef*event.mouseWheel.delta;
                sizeCoef = sizeCoef + sizeCoefDelta;
            }


            // Check if there is a pop-up menu
            if (popupMenu)
            {
                // When mouse is released, remove the pop-up menu
                if (event.type == sf::Event::MouseButtonReleased && event.mouseButton.button == sf::Mouse::Left)
                {
                    gui.remove(popupMenu);
                    popupMenu = nullptr;
                }

                // When mouse is pressed, remove the pop-up menu only when the mouse is not on top of the menu
                if (event.type == sf::Event::MouseButtonPressed)
                {
                    if (!popupMenu->isMouseOnWidget(tgui::Vector2f(event.mouseButton.x, event.mouseButton.y)))
                    {
                        gui.remove(popupMenu);
                        popupMenu = nullptr;
                    }
                }
            }

            // Perhaps we have to open a menu
            else if (event.type == sf::Event::MouseButtonPressed && event.mouseButton.button == sf::Mouse::Right)
            {
                rightClickCallback(gui, tgui::Vector2f(event.mouseButton.x, event.mouseButton.y));
            }

            gui.handleEvent(event);
        }

        counter --;
        if (counter < 0)
        {
            counter = counterStart;
            sizeCoef = sizeCoefStart;
        }

       // std::cout << "Mouse: " << event.mouseWheel.delta << "   Koef: " << sizeCoef << std::endl;

        // clear the window with black color
        window.clear(sf::Color::Black);


        // draw everything here...
        // window.draw(...);

        sf::CircleShape  ship (shipSize, 3);
        ship.setOutlineThickness (2.f);
        ship.setOutlineColor(sf::Color::Red);
        ship.setOrigin(ship.getRadius(),ship.getRadius());
        ship.setPosition( shipX, shipY );
//        std::cout << "ship center:" << shipCenterX << "," << shipCenterY << std::endl;

        ship.setFillColor(sf::Color::White);


        sf::Vector2f position = ship.getPosition();
//        std::cout << "ship position:" << position.x << "," << position.y << std::endl;

        ship.rotate(shipRotate);
//        shipRotate ++;

        shipMove (shipX,shipY,shipSize,shipRotate,speed);

///////////////////
/*
        sf::CircleShape  ship1 (100, 3);
        ship1.setOutlineThickness (50.f);
        ship1.setOutlineColor(sf::Color::Blue);
        ship1.setOrigin(100,100);
        ship1.setPosition( 100, 100 );
        sf::Color shipColor(0,0,0);

        for(int i{0};i<100;++i)
        {
            shipColor.r = (i);
            shipColor.b = (i);
            shipColor.b = (i);
            ship1.setFillColor(shipColor);
            ship1.setPosition(100+i,100+i);
            ship1.setOrigin(100+i,100+i);
            ship1.setOutlineColor(shipColor);
            window.draw (ship1);
        }
*////////////////////////////////////////////////

        window.draw(ship);
        text.setString ("FPS: " + std::to_string(fpsSum));
        window.draw(text);
        gui.draw();
        // end the current frame
        window.display();
    }

    return 0;
}
