#pragma once

#include "PiecesList.h"
#include "Player.h"
#include "Game.h"

static const int FRAMES_PER_SECOND = 60; // the number of frames per second, all the values in the app were choosen with this number in mind


/**
 * The interface between an UI and the core of the app
 */
class Menu {
    private:
        std::shared_ptr<PiecesList> piecesList; // the list of pieces used by the app
        Player playerControls;                  // the controls of the player
        int boardWidth;                         // the width of the board for the next game
        int boardHeight;                        // the height of the board for the next game

    public:
        /**
         * Initializes the board size and player controls to their default values
         */
        Menu();

        /**
         * Starts a new game with the current settings
         * @return The game that has been created
         */
        Game startGame(Gamemode gamemode) const;

        /**
         * Sets the width of the board, which must be greater than 0
         * @return If the width has been changed
         */
        bool setBoardWidth(int width);

        /**
         * Sets the height of the board, which must be greater than 0
         * @return If the height has been changed
         */
        bool setBoardHeight(int height);
    
        /**
         * @return The width of the board
         */
        int getBoardWidth() const;

        /**
         * @return The height of the board
         */
        int getBoardHeight() const;

        /**
         * @return A reference to the player's controls
         */
        Player& getPlayerControls();

        /**
         * @return A reference to the player's controls
         */
        const Player& readPlayerControls() const;
    
        /**
         * @return A reference to the pieces list
         */
        PiecesList& getPiecesList();

        /**
         * @return A reference to the pieces list
         */
        const PiecesList& readPiecesList() const;
};
