// 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 <cstdint>

#include "gtest/gtest.h"
#include "pw_color/color.h"
#include "pw_color/colors_endesga32.h"
#include "pw_color/colors_pico8.h"
#include "pw_framebuffer/rgb565.h"
#include "pw_log/log.h"

using pw::color::color_rgb565_t;

namespace pw::framebuffer {
namespace {

TEST(FramebufferRgb565, Init) {
  uint16_t data[32 * 32];
  FramebufferRgb565 fb(data, 32, 32, 32 * sizeof(data[0]));
  EXPECT_EQ(fb.GetWidth(), 32);
  EXPECT_EQ(fb.GetHeight(), 32);
}

TEST(FramebufferRgb565, Fill) {
  uint16_t data[8 * 8];
  FramebufferRgb565 fb(data, 8, 8, 8 * sizeof(data[0]));
  color_rgb565_t* const pixel_data = fb.GetFramebufferData();
  color_rgb565_t indigo = 0x83b3;
  fb.Fill(indigo);
  // First pixel
  EXPECT_EQ(pixel_data[0], 0x83b3);
  // Last pixel
  EXPECT_EQ(pixel_data[8 * 8 - 1], 0x83b3);
}

TEST(FramebufferRgb565, SetPixelGetPixel) {
  uint16_t data[8 * 8];
  FramebufferRgb565 fb(data, 8, 8, 8 * sizeof(data[0]));
  color_rgb565_t* const pixel_data = fb.GetFramebufferData();
  color_rgb565_t indigo = 0x83b3;
  fb.Fill(0);
  for (int i = 0; i < 8; i++) {
    fb.SetPixel(i, i, indigo);
  }
  EXPECT_EQ(pixel_data[0], indigo);
  EXPECT_EQ(pixel_data[1], 0);
  EXPECT_EQ(pixel_data[8 * 8 - 2], 0);
  EXPECT_EQ(pixel_data[8 * 8 - 1], indigo);

  Result<color_rgb565_t> c;
  c = fb.GetPixel(0, 0);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), indigo);
  c = fb.GetPixel(0, 1);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), 0);
  c = fb.GetPixel(6, 7);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), 0);
  c = fb.GetPixel(7, 7);
  ASSERT_TRUE(c.ok());
  EXPECT_EQ(c.value(), indigo);
}

TEST(FramebufferRgb565, Blit) {
  uint16_t data[8 * 8];
  FramebufferRgb565 fb(data, 8, 8, 8 * sizeof(data[0]));
  color_rgb565_t indigo = color::colors_pico8_rgb565[12];
  fb.Fill(indigo);
  color_rgb565_t* const pixel_data = fb.GetFramebufferData();
  // First pixel
  EXPECT_EQ(pixel_data[0], indigo);
  // Last pixel
  EXPECT_EQ(pixel_data[8 * 8 - 1], indigo);

  uint16_t data2[4 * 4];
  FramebufferRgb565 fb2(data2, 4, 4, 4 * sizeof(data2[0]));
  color_rgb565_t orange = 0xfd00;
  fb2.Fill(orange);

  // Do the blits
  fb.Blit(fb2, -3, -3);

  fb.Blit(fb2, 2, 2);

  // TODO(tonymd): Include PrintFramebufferAsANSI from draw_test.cc
  // PrintFramebufferAsANSI(&fb);

  // One orange pixel in the upper left corner
  EXPECT_EQ(pixel_data[0], orange);
  EXPECT_EQ(pixel_data[1], indigo);
  EXPECT_EQ(pixel_data[8], indigo);
  EXPECT_EQ(pixel_data[9], indigo);

  // Center 4x4 square is orange
  // x = 1
  EXPECT_EQ(pixel_data[(8 * 1) + 1], indigo);
  EXPECT_EQ(pixel_data[(8 * 1) + 2], indigo);
  EXPECT_EQ(pixel_data[(8 * 1) + 3], indigo);
  EXPECT_EQ(pixel_data[(8 * 1) + 4], indigo);
  EXPECT_EQ(pixel_data[(8 * 1) + 5], indigo);
  EXPECT_EQ(pixel_data[(8 * 1) + 6], indigo);

  // x = 2
  EXPECT_EQ(pixel_data[(8 * 2) + 1], indigo);
  EXPECT_EQ(pixel_data[(8 * 2) + 2], orange);
  EXPECT_EQ(pixel_data[(8 * 2) + 3], orange);
  EXPECT_EQ(pixel_data[(8 * 2) + 4], orange);
  EXPECT_EQ(pixel_data[(8 * 2) + 5], orange);
  EXPECT_EQ(pixel_data[(8 * 2) + 6], indigo);

  // x = 5
  EXPECT_EQ(pixel_data[(8 * 5) + 1], indigo);
  EXPECT_EQ(pixel_data[(8 * 5) + 2], orange);
  EXPECT_EQ(pixel_data[(8 * 5) + 3], orange);
  EXPECT_EQ(pixel_data[(8 * 5) + 4], orange);
  EXPECT_EQ(pixel_data[(8 * 5) + 5], orange);
  EXPECT_EQ(pixel_data[(8 * 5) + 6], indigo);

  // x = 6
  EXPECT_EQ(pixel_data[(8 * 6) + 1], indigo);
  EXPECT_EQ(pixel_data[(8 * 6) + 2], indigo);
  EXPECT_EQ(pixel_data[(8 * 6) + 3], indigo);
  EXPECT_EQ(pixel_data[(8 * 6) + 4], indigo);
  EXPECT_EQ(pixel_data[(8 * 6) + 5], indigo);
  EXPECT_EQ(pixel_data[(8 * 6) + 6], indigo);
}

}  // namespace
}  // namespace pw::framebuffer
