#pragma once

#include "Gamemode.h"
#include "Player.h"
#include "LineClear.h"


/**
 * Computes the parameters of the game depending on the current gamemode and the player's controls,
 * this is basically where all the hard-coded values are stored
 */
class GameParameters {
    private:
        Gamemode gamemode;   // the current gamemode
        Player controls;     // the player's controls
        int clearedLines;    // the number of cleared lines
        int level;           // the current level
        int grade;           // the current amount of points
        int nextQueueLength; // the number of pieces visibles in the next queue
        bool boneBlocks;     // wheter all blocks are bone blocks
        bool invisibleBoard; // wheter the board is invisible
        int gravity;         // the gravity at which pieces drop
        int lockDelay;       // the time before the piece lock in place
        int forcedLockDelay; // the forced time before the piece lock in place
        int ARE;             // the time before the next piece spawn
        int lineARE;         // the time before the next piece spawn, after clearing a line
        int DAS;             // the time before the piece repeats moving
        int ARR;             // the rate at which the piece repeats moving
        int SDR;             // the rate at which the piece soft drops

    public:
        /**
         * Sets the current gamemode and the player's controls
         */
        GameParameters(Gamemode gamemode, const Player& controls);

        /**
         * Resets all stats and parameters
         */
        void reset();

        /**
         * Counts the newly cleared lines and update level and stats if needed
         */
        void lockedPiece(const LineClear& lineClear);

        /**
         * Checks if the game ended based on the current states and time passed, accorind to the gamemode
         * @return If the player has won
         */
        bool hasWon(int framesPassed) const;

    private:
        /**
         * Updates all the parameters
         */
        void updateStats();

    public:
        /**
         * @return The current number of cleared line
         */
        int getClearedLines() const;

        /**
         * @return The current level
         */
        int getLevel() const;
        
        /**
         * @return The current grade
         */
        int getGrade() const;

        /**
         * @return The length of the next queue
         */
        int getNextQueueLength() const;

        /**
         * @return Wheter the blocks are currently bone blocks
         */
        bool getBoneBlocks() const;

        /**
         * @return Wheter the board is currently invisible
         */
        bool getInvisibleBoard() const;
        
        /**
         * @return The current gravity for a 20-line high board
         */
        int getGravity() const;

        /**
         * @return The current lock delay
         */
        int getLockDelay() const;

        /**
         * @return The current forced lock delay
         */
        int getForcedLockDelay() const;

        /**
         * @return The current ARE
         */
        int getARE() const;

        /**
         * @return The current line ARE
         */
        int getLineARE() const;
        
        /**
         * @return The current DAS
         */
        int getDAS() const;

        /**
         * @return The current ARR
         */
        int getARR() const;

        /**
         * @return The current SDR
         */
        int getSDR() const;
};
