#include <string>
#include <cstring>
#include <memory>
#include <cstdlib>

#include "matrix-test.hpp"

using namespace blit;

const uint16_t screen_width = 320;
const uint16_t screen_height = 240;


/* setup */
void init() {
  /*
      screen.alpha = 255;
      screen.mask = nullptr;
      screen.pen = rgba(39, 39, 54);
      screen.clear();*/
}


float angle = 0.0f;

float deg2rad(float a) {
  return a * (pi / 180.0f);
}

void draw(std::array<Vec2, 4> vecs, std::vector<Mat3> trs) {
  int s = (150) / trs.size();
  Pen p(255, 255, 255, 32);

  auto o = Vec2(80, 60);

  screen.pen = p;
  screen.line(vecs[0] + o, vecs[1] + o);
  screen.line(vecs[1] + o, vecs[2] + o);
  screen.line(vecs[2] + o, vecs[3] + o);
  screen.line(vecs[3] + o, vecs[0] + o);


  for (auto &tr : trs) {
    p.a += s;

    for (auto &v : vecs) {
      v *= tr;
    }

    auto o = Vec2(80, 60);

    screen.pen = p;
    screen.line(vecs[0] + o, vecs[1] + o);
    screen.line(vecs[1] + o, vecs[2] + o);
    screen.line(vecs[2] + o, vecs[3] + o);
    screen.line(vecs[3] + o, vecs[0] + o);
  }

  // then apply the translations in reverse and ensure we end up back at the start
  for (int i = trs.size() - 1; i >= 0; i--) {
    Mat3 tr = trs[i];

    tr.inverse();
    for (auto &v : vecs) {
      v *= tr;
    }

    screen.pen = Pen(255, 0, 0);
    screen.line(vecs[0] + o, vecs[1] + o);
    screen.line(vecs[1] + o, vecs[2] + o);
    screen.line(vecs[2] + o, vecs[3] + o);
    screen.line(vecs[3] + o, vecs[0] + o);
  }
}

void render(uint32_t time_ms) {
  
  screen.pen = Pen(20, 30, 40);
  screen.clear();

  std::array<Vec2, 4> vecs = {
    Vec2(-10, -10),
    Vec2(10, -10),
    Vec2(10, 10),
    Vec2(-10, 10)
  };

  draw(
    vecs,       
    { Mat3::translation(Vec2(20, 20)),
      Mat3::scale(Vec2(2, 2)),
      Mat3::rotation(angle),
      Mat3::translation(Vec2(10, 10)) 
    }
  );
  /*
  draw(
    vecs,
    mat3::scale(vec2(2, 2)) *
    mat3::translation(vec2(10, 10)) *
    mat3::rotation(angle)
  );*/

  

//    screen.text("angle: " + std::to_string(int(angle)), minimal_font, rect(0, 0, 160, 10));


}

void update(uint32_t time) {
  angle++;
}