class GameSetup extends GameMode {

  java.util.LinkedList<Button> buttons;
  Button leftCharacterToLeft;
  Button leftCharacterToRight;
  Button rightCharacterToLeft;
  Button rightCharacterToRight;
  Button nextScreen;
  Button gameSchwierigkeit;
  Button help;
  int buttonSizeX;
  int buttonSizeY;
  int iceBergSizeX;
  int iceBergSizeY;
  int value; // für Schwierigkeit
  int newHeight;
  int otherButtonsX;
  int otherButtonsY;
  PImage sSchwierigkeit;
  String helpText;

  PImage GameSetupBack;

  PVector iceBergLeft;
  PVector iceBergRight;

  Boolean showHelpDialogue;


  GameSetup() {
    // Liste aller Buttons auf dem Screen
    GameSetupBack = loadImage("assets/Setup_background.png");
    if (aspectRatio != 1.6) {
      GameSetupBack.resize(width, height);
    } else {
      newHeight = ScreenHeight/10*9;
      GameSetupBack.resize(ScreenWidth, newHeight);
    }
    buttons = new java.util.LinkedList<Button>();
    //man hat 5 Buttons, zwei zum Auswählen von den Players und einen zum Bestätigen
    //Die Buttons werden zuerst erstellt und dann in die Liste aller Buttons gefügt
    //LeftCharacterToLeft bedeutet hier der Character auf der linken Seite wird durch
    //den linken Nachbarn ausgetauscht usw. 
    iceBergSizeX = ScreenHeight/3;
    iceBergSizeY = ScreenHeight/3;
    iceBergLeft = new PVector(ScreenWidth/2-ScreenWidth/3.65, ScreenHeight/2 - iceBergSizeY/4);
    iceBergRight = new PVector(ScreenWidth/2+ScreenWidth/3.65, ScreenHeight/2 - iceBergSizeY/4);
    //Derzeitige Größe der Buttons 
    buttonSizeX = iceBergSizeX/3*74/114; //Wegen dem Verhältnis der Buttons
    buttonSizeY = iceBergSizeX/3;
    // Die buttons für Character wechseln werden in Abhängikeit von der Position von den Eisbergen gezeichnet damit es auf jedem Screen funktioniert.
    leftCharacterToLeft = new Button("knopf_dreieck.png", (int)iceBergLeft.x - iceBergSizeX/2, (int)iceBergLeft.y + iceBergSizeY/2 + (int)(buttonSizeY*1.3), buttonSizeX, buttonSizeY, true);
    buttons.add(leftCharacterToLeft);
    leftCharacterToRight = new Button("knopf_dreieck_2.png", (int)iceBergLeft.x + iceBergSizeX/2 - buttonSizeX, (int)iceBergLeft.y + iceBergSizeY/2 +(int)(buttonSizeY*1.3), buttonSizeX, buttonSizeY, true);
    buttons.add(leftCharacterToRight);
    rightCharacterToLeft= new Button("knopf_dreieck.png", (int)iceBergRight.x - iceBergSizeX/2, (int)iceBergRight.y + iceBergSizeY/2 + (int)(buttonSizeY*1.3), buttonSizeX, buttonSizeY, true);
    buttons.add(rightCharacterToLeft);
    rightCharacterToRight= new Button("knopf_dreieck_2.png", (int)iceBergRight.x + iceBergSizeX/2 - buttonSizeX, (int)iceBergRight.y + iceBergSizeY/2 + (int)(buttonSizeY*1.3), buttonSizeX, buttonSizeY, true);
    buttons.add(rightCharacterToRight);
    otherButtonsX = iceBergSizeX/3*273/114;
    otherButtonsY = iceBergSizeY/3;
    nextScreen = new Button("knopf_viereck.png", ScreenWidth/2 - otherButtonsX/2, ScreenHeight/2 - otherButtonsY/4 - otherButtonsY*2, otherButtonsX, otherButtonsY, false);
    buttons.add(nextScreen);
    gameSchwierigkeit = new Button("knopf_viereck.png", ScreenWidth/2 - otherButtonsX/2, ScreenHeight/2-otherButtonsY, otherButtonsX, otherButtonsY, false);
    buttons.add(gameSchwierigkeit);
    help = new Button("knopf_viereck.png", ScreenWidth/2 - otherButtonsX/2, ScreenHeight/2 + otherButtonsY/4, otherButtonsX, otherButtonsY, false);
    buttons.add(help);
    value = 0;
    showHelpDialogue = false;
    helpText = ("drücke 'w', 'a', 's', 'd' um den linken Eisberg \n" +
      "oder die Pfeiltasten um den rechten Eisberg zu steuern \n" 
      + "Sammel Eisschollen ein um nicht zu schrumpfen \n"
      + "Sammel den Eispickel ein um dem Gegner Eisschollen zu stehlen  \n" 
      + "Sammel den Booster um schneller zu werden \n"
      + "Im heißen Wasser schrumpft man schneller \n");
  }


  void draw() {
    textSize(60);
    if (aspectRatio == 1.6) {
      background(0);
      image(GameSetupBack, 0, (ScreenHeight-newHeight)/2);
    } else {
      background(GameSetupBack);
    }
    fill(255);
    //text("GameSetup", width/2, height/2); 
    //alle Buttons werden gezeichnet und es wird getestet ob sich die Maus über den Buttons befindet
    for (int i = 0; i < buttons.size(); i++) {
      buttons.get(i).draw();
    }
    textSize(15);
    fill(0);
    textAlign(CENTER);
    image(startSchrift, nextScreen.x, nextScreen.y);
    image(helpSchrift, help.x, help.y);
    switch(schwierigkeit) {
    case 0: 
      sSchwierigkeit = beginner;
      break;
    case 1:
      sSchwierigkeit = advanced;
      break;
    case 2:
      sSchwierigkeit = pro;
    }
    image(sSchwierigkeit, gameSchwierigkeit.x+(gameSchwierigkeit.sizeX-sSchwierigkeit.width)/2, gameSchwierigkeit.y);
    drawIceBergs(currentCharacter1, 1);
    drawIceBergs(currentCharacter2, 2);

    if (showHelpDialogue) {
      fill(255, 230);
      rect(help.x - ScreenWidth/8+help.sizeX/2, help.y + help.sizeY + help.sizeY/4, ScreenWidth/4, ScreenHeight/4);
      fill(0);
      textSize(20);
      text(helpText, help.x - ScreenWidth/8+help.sizeX/2, help.y + help.sizeY+ help.sizeY/4, ScreenWidth/4, ScreenHeight/4);
    }
  }

  void mouseClicked() {
    int buttonClicked = -1;
    for (int i = 0; i < buttons.size(); i++) {
      //Hier wird getestet welcher Button (also Index welchen Buttons) geklickt wurde
      if (buttons.get(i).mouseOver(mouseX, mouseY)) {
        buttonClicked = i;
      }
    }

    if (!showHelpDialogue) {
      //verschiedene Fälle für die Unterscheidung welcher Button geklickt wurde
      switch (buttonClicked) {

        //kein Button gedrückt
      case -1: 
        break;

        //Button leftCharacterToLeft geklickt
      case 0: 
        {
          buttons.get(0).clicked();
          if (currentCharacter1 > 1) {
            currentCharacter1--;
          } else {
            currentCharacter1 = 4;
          }
          //println("leftCharacterToLeft gedrückt");
          break;
        }

        //Button leftCharacterToRight geklickt
      case 1: 
        {
          buttons.get(1).clicked();
          if (currentCharacter1 < 4) {
            currentCharacter1++;
          } else {
            currentCharacter1 = 1;
          }
          //println("leftCharacterToRight");
          break;
        }

        //Button rightCharacterToLeft geklickt
      case 2: 
        {
          buttons.get(2).clicked();
          if (currentCharacter2 > 1) {
            currentCharacter2--;
          } else {
            currentCharacter2 = 4;
          }
          //println("rightCharacterToLeft");
          break;
        }

        //Button rightCharacterToRight geklickt
      case 3: 
        {
          buttons.get(3).clicked();
          if (currentCharacter2 < 4) {
            currentCharacter2++;
          } else {
            currentCharacter2 = 1;
          }
          //println("rightCharacterToRight");
          break;
        }

        //Button nextScreen geklickt
      case 4: 
        {
          buttons.get(4).clicked();
          println("nextScreen");
          gameMode = new Intro(); //sets the gameMode to Intro
          break;
        }
        //Schwierigkeitsbutton  
      case 5: 
        {
          buttons.get(5).clicked();
          if (value < 2) {
            value++;
          } else {
            value = 0;
          }
          changeSchwierigkeit(value);
          break;
        }
        // help
      case 6:
        {
          showHelpDialogue = true;
        }
      }
    } else {
      showHelpDialogue = false;
    }
  }

  void drawIceBergs(int currentCharacter, int id) {

    int positionX = 0;
    int positionY = 0;

    if (id == 1) {
      positionX = (int)iceBergLeft.x;
      positionY = (int)iceBergLeft.y;
    }
    if (id == 2) {
      positionX = (int)iceBergRight.x;
      positionY = (int)iceBergRight.y;
    }

    imageMode(CENTER);
    switch(currentCharacter) {
    case 1: 
      {
        image(character1, positionX, positionY, iceBergSizeX, iceBergSizeY);
        image(eyes1, positionX, positionY, iceBergSizeX, iceBergSizeY);
        break;
      }
    case 2: 
      {
        image(character2, positionX, positionY, iceBergSizeX, iceBergSizeY);
        image(eyes2, positionX, positionY, iceBergSizeX, iceBergSizeY);
        break;
      }
    case 3: 
      {
        image(character3, positionX, positionY, iceBergSizeX, iceBergSizeY);
        image(eyes3, positionX, positionY, iceBergSizeX, iceBergSizeY);
        break;
      }
    case 4: 
      {
        image(character4, positionX, positionY, iceBergSizeX, iceBergSizeY);
        image(eyes4, positionX, positionY, iceBergSizeX, iceBergSizeY);
        break;
      }
    }  
    imageMode(CORNER);
  }

  void changeSchwierigkeit(int _case) {
    switch(_case) {
    case 0: 
      schwierigkeit = Schwierigkeit.LOW; 
      break;
    case 1: 
      schwierigkeit = Schwierigkeit.NORM;
      break;
    case 2: 
      schwierigkeit = Schwierigkeit.PRO;
      break;
    }
  }
}
