#ifndef _RIVE_RENDER_TEXT_HPP_
#define _RIVE_RENDER_TEXT_HPP_

#ifdef WITH_RIVE_TEXT

#include "rive/text/text.hpp"

namespace rive
{
class Factory;

class RawText
{
public:
    RawText(Factory* factory);

    /// Returns true if the text object contains no text.
    bool empty() const;

    /// Appends a run to the text object. The foregroundColor is used for
    /// color glyphs (emoji) that reference the text's foreground color.
    void append(const std::string& text,
                rcp<RenderPaint> paint,
                rcp<Font> font,
                float size = 16.0f,
                float lineHeight = -1.0f,
                float letterSpacing = 0.0f,
                ColorInt foregroundColor = 0xFF000000);

    /// Resets the text object to empty state (no text).
    void clear();

    /// Draw the text using renderer. Second argument is optional to override
    /// all paints provided with run styles
    void render(Renderer* renderer, rcp<RenderPaint> paint = nullptr);

    TextSizing sizing() const;
    TextOverflow overflow() const;
    TextAlign align() const;
    float maxWidth() const;
    float maxHeight() const;
    float paragraphSpacing() const;

    void sizing(TextSizing value);

    /// How text that overflows when TextSizing::fixed is used.
    void overflow(TextOverflow value);

    /// How text aligns within the bounds.
    void align(TextAlign value);

    /// The width at which the text will wrap when using any sizing but
    /// TextSizing::auto.
    void maxWidth(float value);

    /// The height at which the text will overflow when using TextSizing::fixed.
    void maxHeight(float value);

    /// The vertical space between paragraphs delineated by a return character.
    void paragraphSpacing(float value);

    /// Returns the bounds of the text object (helpful for aligning multiple
    /// text objects/procredurally drawn shapes).
    AABB bounds();

private:
    void update();
    struct RenderStyle
    {
        rcp<RenderPaint> paint;
        bool isEmpty;
        ShapePaintPath path;
        ColorInt foregroundColor = 0xFF000000;
    };
    SimpleArray<Paragraph> m_shape;
    SimpleArray<SimpleArray<GlyphLine>> m_lines;

    StyledText m_styled;
    Factory* m_factory;
    std::vector<RenderStyle> m_styles;
    std::vector<RenderStyle*> m_renderStyles;
    bool m_dirty = false;
    float m_paragraphSpacing = 0.0f;

    TextOrigin m_origin = TextOrigin::top;
    TextSizing m_sizing = TextSizing::autoWidth;
    TextOverflow m_overflow = TextOverflow::visible;
    TextAlign m_align = TextAlign::left;
    TextWrap m_wrap = TextWrap::wrap;
    float m_maxWidth = 0.0f;
    float m_maxHeight = 0.0f;
    std::vector<OrderedLine> m_orderedLines;
    GlyphRun m_ellipsisRun;
    AABB m_bounds;
    rcp<RenderPath> m_clipRenderPath;

    // Color glyph draw commands for interleaving with style paths.
    struct RawTextDrawCommand
    {
        enum Type
        {
            kStylePath,
            kColorGlyph
        };
        Type type;
        RenderStyle* style = nullptr;
        struct ColorGlyphInfo
        {
            rcp<Font> font;
            GlyphID glyphId;
            Mat2D transform;
            ColorInt foregroundColor;
        };
        ColorGlyphInfo colorGlyph;
    };
    std::vector<RawTextDrawCommand> m_drawCommands;
};
} // namespace rive

#endif // WITH_RIVE_TEXT

#endif
