#ifndef PAINT_HPP_INCLUDED
#define PAINT_HPP_INCLUDED

#include <vector>
#include "Types/Convex.hpp"
#include "Types/Tile.hpp"

namespace Paint
{
    struct Pixel
    {
        std::uint8_t Red;
        std::uint8_t Green;
        std::uint8_t Blue;
        std::uint8_t Alpha;
    };

    std::uint32_t* GetPixels();
    void Clear();
    void DrawDot(const Point& P, double Radius, std::uint8_t Red, std::uint8_t Green, std::uint8_t Blue, std::uint8_t Alpha);
    void DrawPoint(const Point& P, std::uint8_t Red, std::uint8_t Green, std::uint8_t Blue, std::uint8_t Alpha);
    void DrawPoints(const std::vector<Point>& Points, std::uint8_t Red, std::uint8_t Green, std::uint8_t Blue, std::uint8_t Alpha);
    void DrawLine(const Point& A, const Point& B, std::uint8_t Red, std::uint8_t Green, std::uint8_t Blue, std::uint8_t Alpha);
    void DrawLines(const std::vector<Point>& A, const std::vector<Point>& B, std::uint8_t Red, std::uint8_t Green, std::uint8_t Blue, std::uint8_t Alpha);
    void DrawBox(const Box& B, std::uint8_t Red, std::uint8_t Green, std::uint8_t Blue, std::uint8_t Alpha);
    void DrawSquare(const Box& B, std::uint8_t Red, std::uint8_t Green, std::uint8_t Blue, std::uint8_t Alpha);
    void DrawConvex(const Convex& C, std::uint8_t Red, std::uint8_t Green, std::uint8_t Blue, std::uint8_t Alpha);
    void DrawTile(const Tile& T, std::uint8_t Red, std::uint8_t Green, std::uint8_t Blue, std::uint8_t Alpha);
    void DrawModel(const std::vector<Point>& Model, std::uint8_t Red, std::uint8_t Green, std::uint8_t Blue, std::uint8_t Alpha);
    void DrawString(const std::string& String, const Point& P, std::uint8_t Red, std::uint8_t Green, std::uint8_t Blue, std::uint8_t Alpha);
    void DrawPixels(const std::vector<Pixel> Pixels, std::uint32_t Width, std::uint32_t Height, const Point& P);
    void SwapBuffer();
}

#endif // PAINT_HPP_INCLUDED
