#pragma once
class BlockSettings {
    public:
        BlockSettings() {}

        /**
         * Checks if the block is solid ground, meaning players and objects will
         * not fall through.
         * 
         * @return true if the block is solid, false otherwise.
         */
        bool isSolid() {
            return isSolid_;
        }

        /**
         * Checks if the block has collision, disallowing players to pass through it.
         * 
         * @return true if the block has collision, false otherwise.
         */
        bool hasCollision() {
            return hasCollision_;
        }
        
        /**
         * Checks if the block is affected by gravity, meaning it will fall down
         * until it reaches stable ground.
         * 
         * @return true if the block is affected by gravity, false otherwise.
         */
        bool hasGravity() {
            return hasGravity_;
        }
        
        /**
         * Checks if the block can be pushed by players.
         * 
         * @return true if the block can be pushed, false otherwise.
         */
        bool isPushable() {
            return isPushable_;
        }

        /**
         * Checks if the block is lethal to players, causing them to be killed instantly upon contact.
         * 
         * @return true if the block is lethal, false otherwise.
         */
        bool isLethal() {
            return isLethal_;
        }

        /**
         * Checks if the block is brittle, meaning it will fall or break 
         * when a player passes over it.
         * 
         * @return true if the block is brittle, false otherwise.
         */
        bool isBrittle() {
            return isBrittle_;
        }

        /**
         * Checks if the block is climbable from the top, allowing players above to climb down.
         * 
         * @return true if the block is climbable from the top, false otherwise.
         */
        bool isClimbableFromTop() {
            return isClimbableFromTop_;
        }
        
        /**
         * Checks if the block is climbable from the bottom, allowing players to climb up.
         * 
         * @return true if the block is climbable from the bottom, false otherwise.
         */
        bool isClimbableFromBottom() {
            return isClimbableFromBottom_;
        }

        friend class BlockSettingsBuilder;

    private:
        bool isSolid_ = true;
        bool isPushable_ = false;
        bool isClimbableFromTop_ = false;
        bool isClimbableFromBottom_ = false;
        bool isLethal_ = false;
        bool isBrittle_ = false;
        bool hasCollision_ = false;
        bool hasGravity_ = false;
};
class BlockSettingsBuilder {
    public:
        /**
         * Marks the block non-solid, letting players and objects fall through.
         * 
         * @return BlockSettingsBuilder with changed settings
         */
        BlockSettingsBuilder nonSolid() {
            blockSettings.isSolid_ = false;
            return *this;
        }
        /**
         * Makes the block pushable by players.
         *
         * @return BlockSettingsBuilder with changed settings
         */
        BlockSettingsBuilder pushable() {
            blockSettings.isPushable_ = true;
            return *this;
        }
        /**
         * Marks the block as collidable, disallowing players to pass through it.
         *
         * @return BlockSettingsBuilder with changed settings
         */
        BlockSettingsBuilder collidable() {
            blockSettings.hasCollision_ = true;
            return *this;
        }
        /**
         * Marks the block as affected by gravity, making it fall down until it reaches stable ground.
         *
         * @return BlockSettingsBuilder with changed settings
         */
        BlockSettingsBuilder gravity() {
            blockSettings.hasGravity_ = true;
            return *this;
        }
        /**
         * Makes the block lethal to players, killing them instantly if they touch it.
         *
         * @return BlockSettingsBuilder with changed settings
         */
        BlockSettingsBuilder lethal() {
            blockSettings.isLethal_ = true;
            return *this;
        }
        /**
         * Makes the block brittle, making it fall down when a player passes over it.
         *
         * @return BlockSettingsBuilder with changed settings
         */
        BlockSettingsBuilder brittle() {
            blockSettings.isBrittle_ = true;
            return *this;
        }
        /**
         * Marks the block as climbable from the top, allowing players above to climb down.
         *
         * @return BlockSettingsBuilder with changed settings
         */
        BlockSettingsBuilder climbableFromTop() {
            blockSettings.isClimbableFromTop_ = true;
            return *this;
        }
        /**
         * Marks the block as climbable from the bottom, allowing players below to climb up.
         * 
         * @return BlockSettingsBuilder with changed settings
         */
        BlockSettingsBuilder climbableFromBottom() {
            blockSettings.isClimbableFromBottom_ = true;
            return *this;
        }
        /**
         * Returns the built BlockSettings object.
         *
         * @return BlockSettings object with the set properties
         */
        BlockSettings build() {
            return blockSettings;
        }
    private:
        BlockSettings blockSettings = BlockSettings();
};
