// Copyright 2024 The Pigweed Authors
//
// Licensed under the Apache License, Version 2.0 (the "License"); you may not
// use this file except in compliance with the License. You may obtain a copy of
// the License at
//
//     https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// License for the specific language governing permissions and limitations under
// the License.
#pragma once

#include <math.h>

#include <string_view>

#include "pw_color/color.h"
#include "pw_draw/font_set.h"
#include "pw_draw/sprite_sheet.h"
#include "pw_framebuffer/framebuffer.h"
#include "pw_geometry/size.h"
#include "pw_geometry/vector2.h"

/// @defgroup pw_draw

namespace pw::draw {

/// @ingroup pw_draw
///
/// Draw a line using Bresenham's line algorithm from point (x1, y1) to (x2,
/// y2).
void DrawLine(pw::framebuffer::Framebuffer& fb,
              int x1,
              int y1,
              int x2,
              int y2,
              pw::color::color_rgb565_t pen_color);

/// @ingroup pw_draw
///
/// Draw a circle at (center_x, center_y) with given radius and color. Only a
/// one-pixel outline is drawn if filled is false.
void DrawCircle(pw::framebuffer::Framebuffer& fb,
                int center_x,
                int center_y,
                int radius,
                pw::color::color_rgb565_t pen_color,
                bool filled);

/// @ingroup pw_draw
///
/// Draw a horizontal line from (x1, y) to (x2, y).
void DrawHLine(pw::framebuffer::Framebuffer& fb,
               int x1,
               int x2,
               int y,
               pw::color::color_rgb565_t pen_color);

/// @ingroup pw_draw
///
/// Draw a rectangle defined by two opposite corner points (x1, y1) and (x2,
/// y2).
void DrawRect(pw::framebuffer::Framebuffer& fb,
              int x1,
              int y1,
              int x2,
              int y2,
              pw::color::color_rgb565_t pen_color,
              bool filled);

/// @ingroup pw_draw
///
/// Draw a rectangle defined by an upper left point (x, y) and width height
/// parameters.
void DrawRectWH(pw::framebuffer::Framebuffer& fb,
                int x,
                int y,
                int w,
                int h,
                pw::color::color_rgb565_t pen_color,
                bool filled);

/// @ingroup pw_draw
///
/// Fill an entire framebuffer with a single color.
void Fill(pw::framebuffer::Framebuffer& fb,
          pw::color::color_rgb565_t pen_color);

/// @ingroup pw_draw
///
/// Draw a sprite at positon (x, y).
void DrawSprite(pw::framebuffer::Framebuffer& fb,
                int x,
                int y,
                pw::draw::SpriteSheet* sprite_sheet,
                int integer_scale);

void DrawTestPattern();

/// @ingroup pw_draw
///
/// Draw a single character with a given foreground and background color.
pw::geometry::Size<int> DrawCharacter(
    int ch,
    pw::geometry::Vector2<int> pos,
    pw::color::color_rgb565_t fg_color,
    pw::color::color_rgb565_t bg_color,
    const FontSet& font,
    pw::framebuffer::Framebuffer& framebuffer);

/// @ingroup pw_draw
///
/// Draw a string of characters onto a framebuffer. No text wrapping or line
/// break characters are handled.
pw::geometry::Size<int> DrawString(std::wstring_view str,
                                   pw::geometry::Vector2<int> pos,
                                   pw::color::color_rgb565_t fg_color,
                                   pw::color::color_rgb565_t bg_color,
                                   const FontSet& font,
                                   pw::framebuffer::Framebuffer& framebuffer);

}  // namespace pw::draw
