#pragma once

#include <QObject>
#include <QColor>
#include <QRect>
#include <QList>
#include <QRegularExpression>
#include <QString>

class CodeEditor;
class QPainter;
class QPaintEvent;
class QMouseEvent;

// ---------------------------------------------------------------------------
// ColorIndicator – Zeichnet kleine Farbquadrate neben CSS-Farbwerten und
// öffnet einen QColorDialog wenn der Nutzer darauf klickt.
//
// Unterstützte Formate:
//   #rgb  #rrggbb  #rrggbbaa
//   rgb(r, g, b)   rgba(r, g, b, a)
//   hsl(h, s%, l%) hsla(h, s%, l%, a)
//   140 benannte CSS-Farben (red, blue, cornflowerblue, ...)
// ---------------------------------------------------------------------------
class ColorIndicator : public QObject
{
    Q_OBJECT

public:
    explicit ColorIndicator(CodeEditor *editor);

    // Wird aus CodeEditor::paintEvent aufgerufen
    void paint(QPainter &painter, QPaintEvent *event);

    // Wird aus CodeEditor::mousePressEvent aufgerufen
    // Gibt true zurück wenn der Klick auf einem Farbquadrat war
    bool handleMousePress(QMouseEvent *event);

private:
    struct ColorMatch
    {
        QRect   rect;       // Position des Quadrats im Viewport
        QColor  color;      // Erkannte Farbe
        int     blockNumber;
        int     posInBlock; // Zeichenposition des Farbwerts im Block
        int     length;     // Länge des Farbwerts im Text
    };

    void            rebuildCache();
    QList<ColorMatch> findColorsInBlock(const QString &text,
                                         int blockNumber) const;

    static QColor   parseColor(const QString &token);
    static QColor   parseHex(const QString &s);
    static QColor   parseRgb(const QString &s);
    static QColor   parseRgba(const QString &s);
    static QColor   parseHsl(const QString &s);
    static QColor   parseHsla(const QString &s);

    CodeEditor             *m_editor = nullptr;
    QList<ColorMatch>       m_cache;
    int                     m_cacheFirstBlock = -1;
    int                     m_cacheLastBlock  = -1;

    // Kombinierter Regex für alle Farbformate
    static const QRegularExpression s_colorRegex;
};
