class Box {

  int _amountLedsX, _amountLedsY, _id, _prevVal, _prevLedsId, _boxId;
  int _activeLed = 0;
  
  float _posX, _posY, _ledDiameter;
  Led[] _leds;
  color _baseColor = color(255, 255, 255);
   color _OverColor = color(255, 0, 0);
  color _accentColor = color(125, 200, 100);
  color _randomBackgroundColor = color(random(255), random(255), random(255));;
  
  Box(int id, int amountLedsX, int amountLedsY, float posX, float posY, float ledDiameter) {

    _amountLedsX = amountLedsX;
    _amountLedsY = amountLedsY;
    _posX = posX;
    _posY  = posY;
    _ledDiameter = ledDiameter;
    _boxId = id;
    createBox();
    
  }

  void createBox() {

    _leds = new Led[_amountLedsX*_amountLedsY];

    for (int y =0; y<_amountLedsY; y++) {
      for (int x =0; x<_amountLedsX; x++) {
        float posLedX = x*_ledDiameter + _posX;
        float posLedY = y*_ledDiameter + _posY;
        _id = calculateID(x, y);
        _leds[_id] = new Led(posLedX, posLedY, _ledDiameter, _id);
      }
    }
  }

  void showRect() {
    rectMode(CORNER);
    fill(_randomBackgroundColor);
    rect(_posX, _posY, _amountLedsX * _ledDiameter, _amountLedsY * _ledDiameter);
  }

  Led getLed(int number) {
    return _leds[number];
  }
  

  void checkForHitRect(float xpos, float ypos, float rectWidth, float rectHeight) {
    showRect();
     rectMode(CENTER);
    for (int i=0; i < _amountLedsX*_amountLedsY; i++) {  
      if (_leds[i].checkRectOverLed(xpos,ypos, rectWidth,rectHeight)){
        _leds[i].setColor(_accentColor);
         println("Box nummer: " + _boxId + " led nummer " + i);     
      } else {
        _leds[i].setColor(_baseColor);
      }
      if(gameOver == true)
  {   _leds[i].setColor(_OverColor);}
      _leds[i].displayLed();
    }
    
  }
  
  void checkForHitCircle(float xpos, float ypos){
    showRect();
    for (int i=0; i < _amountLedsX*_amountLedsY; i++) {  
      if ( _leds[i].checkShapeOverLed(xpos, ypos)) {
        _leds[i].setColor(_accentColor);
         println("Box nummer: " + _boxId + " led nummer " + i);     
      } else {
        _leds[i].setColor(_baseColor);
      }
      _leds[i].displayLed();
    
  }
     
  }
  
  
  
  int calculateID(int x, int y) {
    if (y % 2 != 0) {
      // Odd rows run backwards
      int reverseX = (_amountLedsX - 1) - x;
      _id = (y * _amountLedsX) + reverseX;
      return _id;
    } else {
      // Even rows run forwards
      _id = (y * _amountLedsX) + x;
      return _id;
    }
  }
}
