// Copyright 2022 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.

#include "pw_draw/draw.h"

#include "gtest/gtest.h"
#include "pw_color/color.h"
#include "pw_color/colors_pico8.h"
#include "pw_draw/font_set.h"
#include "pw_draw/text_area.h"
#include "pw_framebuffer/rgb565.h"
#include "pw_log/log.h"
#include "pw_string/string_builder.h"

using namespace pw::draw;
using namespace pw::framebuffer;
using pw::color::color_rgb565_t;

namespace pw::draw {
namespace {

constexpr color_rgb565_t kBlack = 0x0;

void PrintFramebufferAsANSI(FramebufferRgb565* fb) {
  pw::StringBuffer<4096> line;
  pw::StringBuffer<128> color_string;

  for (int y = 0; y < fb->GetHeight(); y += 2) {
    line.clear();

    for (int x = 0; x < fb->GetWidth(); x++) {
      color_string.clear();
      auto row1_color = fb->GetPixel(x, y);
      pw::color::ColorRGBA row1(row1_color.ok() ? row1_color.value() : kBlack);
      auto row2_color = fb->GetPixel(x, y + 1);
      if (!row2_color.ok()) {
        color_string.Format("[m[38;2;%d;%d;%dm▀", row1.r, row1.g, row1.b);
      } else {
        pw::color::ColorRGBA row2(row2_color.value());
        color_string.Format("[m[38;2;%d;%d;%dm[48;2;%d;%d;%dm▀",
                            row1.r,
                            row1.g,
                            row1.b,
                            row2.r,
                            row2.g,
                            row2.b);
      }
      line.append(color_string.data());
    }
    line.append("[m\n");
    // TODO(tonymd): Log seems to drop characters, maybe a size limit?
    // PW_LOG_INFO("%s", line.data());
    printf("%s", line.data());
  }
}

TEST(DrawLine, Diagonal) {
  uint16_t data[4 * 4];
  FramebufferRgb565 fb(data, 4, 4, 4 * sizeof(data[0]));
  color_rgb565_t indigo = color::colors_pico8_rgb565[12];

  fb.Fill(0);

  DrawLine(&fb, 0, 0, fb.GetWidth(), fb.GetHeight(), indigo);
  PrintFramebufferAsANSI(&fb);

  // Check the diagonal is set to indigo, everything else should be 0.
  Result<color_rgb565_t> c;
  for (int x = 0; x < fb.GetWidth(); x++) {
    for (int y = 0; y < fb.GetHeight(); y++) {
      c = fb.GetPixel(x, y);
      ASSERT_TRUE(c.ok());
      if (x == y) {
        EXPECT_EQ(c.value(), indigo);
      } else {
        EXPECT_EQ(c.value(), 0);
      }
    }
  }
}

TEST(DrawHLine, Top) {
  uint16_t data[4 * 4];
  FramebufferRgb565 fb(data, 4, 4, 4 * sizeof(data[0]));
  color_rgb565_t indigo = color::colors_pico8_rgb565[12];
  fb.Fill(0);

  // Horizonal line at y = 0
  DrawHLine(&fb, 0, fb.GetWidth(), 0, indigo);
  PrintFramebufferAsANSI(&fb);

  // Check color at y = 0 is indigo, y = 1 should be 0.
  Result<color_rgb565_t> c;
  for (int x = 0; x < fb.GetWidth(); x++) {
    c = fb.GetPixel(x, 0);
    ASSERT_TRUE(c.ok());
    EXPECT_EQ(c.value(), indigo);
    c = fb.GetPixel(x, 1);
    ASSERT_TRUE(c.ok());
    EXPECT_EQ(c.value(), 0);
  }
}

TEST(DrawRect, Empty) {
  uint16_t data[5 * 5];
  FramebufferRgb565 fb(data, 5, 5, 5 * sizeof(data[0]));
  color_rgb565_t indigo = color::colors_pico8_rgb565[12];
  fb.Fill(0);

  // 4x4 rectangle, not filled
  DrawRect(&fb, 0, 0, 3, 3, indigo, false);
  PrintFramebufferAsANSI(&fb);

  Result<color_rgb565_t> c;
  c = fb.GetPixel(0, 0);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), indigo);
  c = fb.GetPixel(1, 0);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), indigo);
  c = fb.GetPixel(2, 0);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), indigo);
  c = fb.GetPixel(3, 0);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), indigo);
  c = fb.GetPixel(4, 0);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), 0);

  c = fb.GetPixel(0, 1);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), indigo);
  c = fb.GetPixel(1, 1);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), 0);
  c = fb.GetPixel(2, 1);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), 0);
  c = fb.GetPixel(3, 1);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), indigo);
  c = fb.GetPixel(4, 1);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), 0);

  c = fb.GetPixel(0, 2);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), indigo);
  c = fb.GetPixel(1, 2);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), 0);
  c = fb.GetPixel(2, 2);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), 0);
  c = fb.GetPixel(3, 2);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), indigo);
  c = fb.GetPixel(4, 2);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), 0);

  c = fb.GetPixel(0, 3);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), indigo);
  c = fb.GetPixel(1, 3);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), indigo);
  c = fb.GetPixel(2, 3);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), indigo);
  c = fb.GetPixel(3, 3);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), indigo);
  c = fb.GetPixel(4, 3);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), 0);

  c = fb.GetPixel(0, 4);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), 0);
  c = fb.GetPixel(1, 4);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), 0);
  c = fb.GetPixel(2, 4);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), 0);
  c = fb.GetPixel(3, 4);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), 0);
  c = fb.GetPixel(4, 4);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), 0);
}

TEST(DrawRect, Filled) {
  uint16_t data[5 * 5];
  FramebufferRgb565 fb(data, 5, 5, 5 * sizeof(data[0]));
  color_rgb565_t indigo = color::colors_pico8_rgb565[12];
  fb.Fill(0);

  // 4x4 rectangle, filled
  DrawRect(&fb, 0, 0, 3, 3, indigo, true);
  PrintFramebufferAsANSI(&fb);

  Result<color_rgb565_t> c;
  c = fb.GetPixel(0, 0);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), indigo);
  c = fb.GetPixel(1, 0);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), indigo);
  c = fb.GetPixel(2, 0);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), indigo);
  c = fb.GetPixel(3, 0);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), indigo);
  c = fb.GetPixel(4, 0);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), 0);

  c = fb.GetPixel(0, 1);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), indigo);
  c = fb.GetPixel(1, 1);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), indigo);
  c = fb.GetPixel(2, 1);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), indigo);
  c = fb.GetPixel(3, 1);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), indigo);
  c = fb.GetPixel(4, 1);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), 0);

  c = fb.GetPixel(0, 2);
  EXPECT_EQ(c.value(), indigo);
  c = fb.GetPixel(1, 2);
  EXPECT_EQ(c.value(), indigo);
  c = fb.GetPixel(2, 2);
  EXPECT_EQ(c.value(), indigo);
  c = fb.GetPixel(3, 2);
  EXPECT_EQ(c.value(), indigo);
  c = fb.GetPixel(4, 2);
  EXPECT_EQ(c.value(), 0);

  c = fb.GetPixel(0, 3);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), indigo);
  c = fb.GetPixel(1, 3);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), indigo);
  c = fb.GetPixel(2, 3);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), indigo);
  c = fb.GetPixel(3, 3);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), indigo);
  c = fb.GetPixel(4, 3);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), 0);

  c = fb.GetPixel(0, 4);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), 0);
  c = fb.GetPixel(1, 4);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), 0);
  c = fb.GetPixel(2, 4);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), 0);
  c = fb.GetPixel(3, 4);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), 0);
  c = fb.GetPixel(4, 4);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), 0);
}

TEST(DrawRectWH, WidthHeightCorrect) {
  uint16_t data[5 * 5];
  FramebufferRgb565 fb(data, 5, 5, 5 * sizeof(data[0]));
  color_rgb565_t indigo = color::colors_pico8_rgb565[12];
  fb.Fill(0);

  // 4x4 rectangle, not filled
  DrawRectWH(&fb, 0, 0, 4, 4, indigo, false);
  PrintFramebufferAsANSI(&fb);

  Result<color_rgb565_t> c;
  c = fb.GetPixel(0, 0);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), indigo);
  c = fb.GetPixel(1, 0);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), indigo);
  c = fb.GetPixel(2, 0);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), indigo);
  c = fb.GetPixel(3, 0);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), indigo);
  c = fb.GetPixel(4, 0);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), 0);

  c = fb.GetPixel(0, 1);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), indigo);
  c = fb.GetPixel(1, 1);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), 0);
  c = fb.GetPixel(2, 1);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), 0);
  c = fb.GetPixel(3, 1);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), indigo);
  c = fb.GetPixel(4, 1);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), 0);

  c = fb.GetPixel(0, 2);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), indigo);
  c = fb.GetPixel(1, 2);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), 0);
  c = fb.GetPixel(2, 2);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), 0);
  c = fb.GetPixel(3, 2);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), indigo);
  c = fb.GetPixel(4, 2);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), 0);

  c = fb.GetPixel(0, 3);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), indigo);
  c = fb.GetPixel(1, 3);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), indigo);
  c = fb.GetPixel(2, 3);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), indigo);
  c = fb.GetPixel(3, 3);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), indigo);
  c = fb.GetPixel(4, 3);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), 0);

  c = fb.GetPixel(0, 4);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), 0);
  c = fb.GetPixel(1, 4);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), 0);
  c = fb.GetPixel(2, 4);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), 0);
  c = fb.GetPixel(3, 4);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), 0);
  c = fb.GetPixel(4, 4);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), 0);
}

TEST(DrawCircle, Empty) {
  uint16_t data[7 * 7];
  FramebufferRgb565 fb(data, 7, 7, 7 * sizeof(data[0]));
  color_rgb565_t indigo = color::colors_pico8_rgb565[12];
  fb.Fill(0);

  DrawCircle(&fb, 3, 3, 3, indigo, false);

  PrintFramebufferAsANSI(&fb);

  // ..xxx..
  // .x...x.
  // x.....x
  // x.....x
  // x.....x
  // .x...x.
  // ..xxx..

  Result<color_rgb565_t> c;
  c = fb.GetPixel(0, 0);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), 0);
  c = fb.GetPixel(1, 0);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), 0);
  c = fb.GetPixel(2, 0);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), indigo);
  c = fb.GetPixel(3, 0);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), indigo);
  c = fb.GetPixel(4, 0);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), indigo);
  c = fb.GetPixel(5, 0);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), 0);
  c = fb.GetPixel(6, 0);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), 0);

  c = fb.GetPixel(0, 1);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), 0);
  c = fb.GetPixel(1, 1);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), indigo);
  c = fb.GetPixel(2, 1);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), 0);
  c = fb.GetPixel(3, 1);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), 0);
  c = fb.GetPixel(4, 1);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), 0);
  c = fb.GetPixel(5, 1);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), indigo);
  c = fb.GetPixel(6, 1);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), 0);

  c = fb.GetPixel(0, 2);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), indigo);
  c = fb.GetPixel(1, 2);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), 0);
  c = fb.GetPixel(2, 2);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), 0);
  c = fb.GetPixel(3, 2);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), 0);
  c = fb.GetPixel(4, 2);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), 0);
  c = fb.GetPixel(5, 2);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), 0);
  c = fb.GetPixel(6, 2);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), indigo);

  c = fb.GetPixel(0, 3);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), indigo);
  c = fb.GetPixel(1, 3);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), 0);
  c = fb.GetPixel(2, 3);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), 0);
  c = fb.GetPixel(3, 3);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), 0);
  c = fb.GetPixel(4, 3);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), 0);
  c = fb.GetPixel(5, 3);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), 0);
  c = fb.GetPixel(6, 3);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), indigo);

  c = fb.GetPixel(0, 4);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), indigo);
  c = fb.GetPixel(1, 4);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), 0);
  c = fb.GetPixel(2, 4);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), 0);
  c = fb.GetPixel(3, 4);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), 0);
  c = fb.GetPixel(4, 4);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), 0);
  c = fb.GetPixel(5, 4);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), 0);
  c = fb.GetPixel(6, 4);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), indigo);

  c = fb.GetPixel(0, 5);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), 0);
  c = fb.GetPixel(1, 5);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), indigo);
  c = fb.GetPixel(2, 5);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), 0);
  c = fb.GetPixel(3, 5);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), 0);
  c = fb.GetPixel(4, 5);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), 0);
  c = fb.GetPixel(5, 5);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), indigo);
  c = fb.GetPixel(6, 5);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), 0);

  c = fb.GetPixel(0, 6);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), 0);
  c = fb.GetPixel(1, 6);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), 0);
  c = fb.GetPixel(2, 6);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), indigo);
  c = fb.GetPixel(3, 6);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), indigo);
  c = fb.GetPixel(4, 6);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), indigo);
  c = fb.GetPixel(5, 6);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), 0);
  c = fb.GetPixel(6, 6);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), 0);
}

TEST(DrawText, WithFgBg) {
  uint16_t data[(5 * 6) * (3 * 8)];
  FramebufferRgb565 fb(data, 5 * 6, 3 * 8, (5 * 6) * sizeof(data[0]));
  fb.Fill(0);

  pw::draw::TextArea text_area(&fb, &font6x8);
  text_area.SetForegroundColor(color::colors_pico8_rgb565[COLOR_PINK]);
  text_area.SetBackgroundColor(0);
  text_area.DrawText("Hell\noT\nhere.\nWorld");

  PrintFramebufferAsANSI(&fb);
}

}  // namespace
}  // namespace pw::draw
