/**
 * @file ScrollBar.h
 * @brief Vertical scrollbar widget for indicating scroll position in long content
 * @details This header defines the ScrollBar class which provides a visual scrollbar
 *          widget for indicating the current position within scrollable content.
 *          The scrollbar displays a thumb that moves proportionally to represent
 *          the current scroll position and visible area relative to the total content.
 * @author System Control Team
 * @date 2025-06-14
 */

#pragma once

#include "MenuOptions.h"
#include "Widget.h"

/**
 * @class ScrollBar
 * @brief A vertical scrollbar widget that represents scroll position and range
 * @details This final class inherits from Widget and provides visual feedback for
 *          scrollable content. It displays a vertical track with a movable thumb
 *          that indicates the current position within a scrollable range. The thumb
 *          size is proportional to the visible area relative to the total content,
 *          and its position reflects the current scroll offset.
 *
 * The scrollbar automatically calculates thumb dimensions and position based on
 * the provided scroll values (current, minimum, maximum). It is designed to be
 * used alongside scrollable content like menus or lists to provide visual
 * feedback about scroll state.
 *
 * @note This class is marked as final and cannot be inherited from.
 *
 * @see Widget
 * @see menu_options_t
 */
class ScrollBar final : public Widget
{
  public:
    /**
     * @brief Constructs a ScrollBar with specified position and dimensions
     * @param options Pointer to menu options configuration structure
     * @param x X coordinate position of the scrollbar on screen
     * @param y Y coordinate position of the scrollbar on screen
     * @param width Width of the scrollbar in pixels
     * @param height Height of the scrollbar in pixels
     *
     * @pre options must not be nullptr and must remain valid for the scrollbar's lifetime
     * @pre width and height must be greater than 0
     * @pre x and y must be valid screen coordinates
     * @post ScrollBar is initialized with the specified geometry and ready for use
     *
     * @note The scrollbar does not take ownership of the options structure and
     *       assumes it remains valid throughout the scrollbar's lifetime.
     */
    ScrollBar(const menu_options_t *options, size_t x, size_t y, size_t width, size_t height);

    /**
     * @brief Renders the scrollbar to the screen
     * @details Overrides the base Widget render method to draw the scrollbar track
     *          and thumb. The appearance is determined by the current scroll state
     *          and the menu options configuration.
     *
     * @pre u8g2 display context must be initialized and ready for drawing
     * @post Scrollbar's visual representation is drawn to the display buffer
     *
     * @note This method is called during each frame's render cycle. The scrollbar
     *       track and thumb are drawn based on the current scroll values set by refresh().
     */
    void Render() override;

    /**
     * @brief Updates the scrollbar state with new scroll values
     * @param value Current scroll position value (must be between min and max)
     * @param max Maximum scroll value (total content size)
     * @param min Minimum scroll value (default: 0, typically the start of content)
     *
     * @pre value must be between min and max (inclusive)
     * @pre max must be greater than or equal to min
     * @post Scrollbar thumb position and size are recalculated based on new values
     *
     * @details This method recalculates the thumb's height and vertical position
     *          based on the provided scroll range and current position. The thumb
     *          height represents the proportion of visible content to total content,
     *          while its position represents the current scroll offset within the range.
     *
     * @note Call this method whenever the scroll state changes to keep the
     *       scrollbar visualization synchronized with the actual content position.
     */
    void refresh(size_t value, size_t max, size_t min = 0);

  private:
    // Position and dimensions
    size_t m_x;      ///< X coordinate of the scrollbar's left edge
    size_t m_y;      ///< Y coordinate of the scrollbar's top edge
    size_t m_width;  ///< Width of the scrollbar track in pixels
    size_t m_height; ///< Height of the scrollbar track in pixels

    // Scroll state values
    size_t m_value; ///< Current scroll position within the range [m_min, m_max]
    size_t m_max;   ///< Maximum scroll value representing the end of content
    size_t m_min;   ///< Minimum scroll value representing the start of content

    // Calculated thumb properties (updated by refresh())
    size_t m_thumbHeight; ///< Calculated height of the scroll thumb in pixels
    size_t m_thumbY;      ///< Calculated Y position of the scroll thumb relative to track
};