module;
#include <print>

export module Rect;

// Für verkürzte Schreibweise
using BYTE = unsigned char;

// Struktur für Farbwerte
struct Color
{
    BYTE red;
    BYTE green;
    BYTE blue;
};

// Klassendefinition
export class Rect
{
    short xPos, yPos;       // Position
    short width, height;    // Groesse
    Color actColor;         // Farbe
 public:
    // ctor, ein dtor wird hier nicht benoetigt
    Rect(const short x, const short y, const short w, const short h,
        const BYTE r, const BYTE g, const BYTE b);
    // Verschieben
    void Move(const short x, const short y);
    // Groesse aendern
    void Resize(const short w, const short h);
    // Farbe umsetzen
    void setColor(const BYTE r, const BYTE g, const BYTE b);
    // Rechteck zeichnen
    void DrawIt() const;
};

// Definition der Memberfunktionen
// ctor
Rect::Rect(const short x, const short y, const short w, const short h,
           const BYTE r=0x10, const BYTE g=0x10, const BYTE b=0x10)
{
    xPos = x;
    yPos = y;
    width = w;
    height = h;
    actColor.red = r;
    actColor.green = g;
    actColor.blue = b ;
}
// Rechteck verschieben
inline void Rect::Move(const short x, const short y)
{
    xPos = x;
    yPos = y;
}
// Rechteck Groesse veraendern
inline void Rect::Resize(const short w, const short h)
{
    width = w;
    height = h;
}
// Rechteck-Farbe setzen
inline void Rect::setColor(const BYTE r, const BYTE g, const BYTE b)
{
    actColor.red = r;
    actColor.green = g;
    actColor.blue = b;
}
// Rechteck 'zeichnen'
void Rect::DrawIt() const
{
    std::println("Position: {},{}\nGroesse : {},{}\nRGB-Wert: {:#x},{:#x},{:#x}",
                xPos, yPos, width, height, actColor.red, actColor.green, actColor.blue);
}
