const terminal = @import("../terminal/main.zig");

// TODO: Test neverExtendBg function

/// Returns true if the row of this pin should never have its background
/// color extended for filling padding space in the renderer. This is
/// a set of heuristics that help making our padding look better.
pub fn neverExtendBg(
    row: terminal.page.Row,
    cells: []const terminal.page.Cell,
    styles: []const terminal.Style,
    palette: *const terminal.color.Palette,
    default_background: terminal.color.RGB,
) bool {
    // Any semantic prompts should not have their background extended
    // because prompts often contain special formatting (such as
    // powerline) that looks bad when extended.
    switch (row.semantic_prompt) {
        .prompt, .prompt_continuation => return true,
        .none => {},
    }

    for (0.., cells) |x, *cell| {
        // If any cell has a default background color then we don't
        // extend because the default background color probably looks
        // good enough as an extension.
        switch (cell.content_tag) {
            // If it is a background color cell, we check the color.
            .bg_color_palette, .bg_color_rgb => {
                const s: terminal.Style = if (cell.hasStyling()) styles[x] else .{};
                const bg = s.bg(cell, palette) orelse return true;
                if (bg.eql(default_background)) return true;
            },

            // If its a codepoint cell we can check the style.
            .codepoint, .codepoint_grapheme => {
                // For codepoint containing, we also never extend bg
                // if any cell has a powerline glyph because these are
                // perfect-fit.
                switch (cell.codepoint()) {
                    // Powerline
                    0xE0B0...0xE0C8,
                    0xE0CA,
                    0xE0CC...0xE0D2,
                    0xE0D4,
                    => return true,

                    else => {},
                }

                // Never extend a cell that has a default background.
                // A default background is applied if there is no background
                // on the style or the explicitly set background
                // matches our default background.
                const s: terminal.Style = if (cell.hasStyling()) styles[x] else .{};
                const bg = s.bg(cell, palette) orelse return true;
                if (bg.eql(default_background)) return true;
            },
        }
    }

    return false;
}
