class Box {
  constructor(world, x, y, w, h, options) {
    // add box to physics simulation
    this.physicsBox = Matter.Bodies.rectangle(x, y, w, h, options);
    Matter.Composite.add(world, this.physicsBox);

    // add DOM box at the same coordinates
    this.div = document.createElement("box");
    document.body.appendChild(this.div);
    this.div.style.width = w + "px";
    this.div.style.height = h + "px";
    this.width = w;
    this.height = h;
    this.update();
  }

  update() {
    let pos = this.physicsBox.position;
    let angle = this.physicsBox.angle;
    let degrees = angle * (180 / Math.PI);

    let x = this.physicsBox.bounds.min.x;
    let y = this.physicsBox.bounds.min.y;
    this.div.style.transform = `translate(${x}px, ${y}px) rotate(${degrees}deg)`;

    // old uses position
    // this.div.style.transform = `translate(${pos.x - this.width / 2}px, ${pos.y - this.height / 2    }px) rotate(${degrees}deg)`;
  }
}

let engine;
let boxes = [];

setupMatter();
addObjects();
gameLoop();

function setupMatter() {
  engine = Matter.Engine.create({ enableSleeping: true });
}

function addObjects() {
  boxes.push(
    new Box(engine.world, 250, 20, 40, 40, { restitution: 0.8 }),
    new Box(engine.world, 300, 350, 40, 40, { restitution: 0.8 }),
    new Box(engine.world, 320, 70, 40, 40, { restitution: 0.8 }),
    new Box(engine.world, 0, 400, 1200, 60, { isStatic: true }),
    new Box(engine.world, 260, 50, 40, 40),
    new Box(engine.world, 330, 300, 40, 40),
    new Box(engine.world, 350, 170, 40, 40),
    new Box(engine.world, 160, 150, 40, 40),
    new Box(engine.world, 190, 300, 40, 40),
    new Box(engine.world, 250, 270, 40, 40),
  );
}

function gameLoop() {
  // update the physics world
  Matter.Engine.update(engine, 1000 / 60);
var sleepingCount = 0;
  // update the DOM world
  for (let b of boxes) {
    b.update();
if (b.physicsBox.isSleeping)
{
    sleepingCount += 1;
}
  }
console.debug("sleeping count:", sleepingCount);
  requestAnimationFrame(() => this.gameLoop());
}