#ifndef LOW_LEVEL_DISPLAY_H
#define LOW_LEVEL_DISPLAY_H

#include <stdint.h>
#include <stdbool.h>

// Display type enumeration
typedef enum {
    DISPLAY_TYPE_ST7796,
    DISPLAY_TYPE_ST7789,
    DISPLAY_TYPE_EPAPER
} DisplayType;

// Abstract display interface
class LowLevelDisplay {
public:
    virtual ~LowLevelDisplay() {}
    
    // Core display operations - all work with 1-bit monochrome buffers
    virtual bool init() = 0;
    virtual void clear(bool white = true) = 0;  // Clear to white or black
    virtual void draw_pixel(int x, int y, bool white) = 0;
    virtual void draw_buffer(const uint8_t* bit_buffer) = 0;  // 1-bit buffer (width*height/8 bytes)
    virtual void refresh() = 0;  // Update display (converts 1-bit to native format)
    
    // Display properties
    virtual int get_width() const = 0;
    virtual int get_height() const = 0;
    virtual DisplayType get_type() const = 0;
    virtual bool is_color() const = 0;
    
    // Optional: Backlight control (if supported)
    virtual void set_backlight(bool on) { (void)on; }
    
    // Optional: Brightness control (if supported)
    // brightness: 0-100 (percentage), 0=off, 100=full brightness
    virtual void set_brightness(uint8_t brightness) { (void)brightness; }
    virtual uint8_t get_brightness() const { return 100; }  // Default to full brightness
    
    // Optional: Orientation control (not commonly needed for bitmap displays)
    virtual void set_rotation(uint8_t rotation) { (void)rotation; }
    
    // Power saving hooks
    virtual void on_idle_2min() {}
    virtual void on_idle_10min() {}
    virtual void on_user_interaction() {}

    // Factory method - creates display based on type, using board_config.h for pins
    static LowLevelDisplay* create(DisplayType type, int width, int height);
};

#endif // LOW_LEVEL_DISPLAY_H
