const questions = [
  {
    question: "Οι πρώτοι οργανισμοί που εμφανίστηκαν στη Γη ήταν",
    answer1: "ψάρια",
    answer2: "βακτήρια",
    correct: 1,
  },
  {
    question: "Η ατμόσφαιρα της Γης περιείχε οξυγόνο εξαρχής",
    answer1: "Σωστό",
    answer2: "Λάθος",
    correct: 1,
  },
  {
    question: "Τα φυτά αρχίζουν να εξαπλώνονται στην ξηρά πριν",
    answer1: "350 εκ. χρόνια",
    answer2: "600 εκ. χρόνια",
    correct: 0,
  },
  {
    question:
      "Η φυσική καταστροφή η οποία είχε ως αποτέλεσμα τη μεγαλύτερη μαζική εξαφάνιση πριν από 250 εκ. χρόνια, οφείλονταν σε",
    answer1: "παγετώνες",
    answer2: "ηφαιστειακές εκρήξεις",
    correct: 1,
  },
  {
    question: "Τα πρώτα θηλαστικά εμφανίστηκαν",
    answer1: "τον Μεσοζωικό αιώνα",
    answer2: "τον Καινοζωικό αιώνα",
    correct: 0,
  },
  {
    question:
      "Με την πτώση του αστεροειδούς πριν από 66 εκ. χρόνια εξαφανίστηκαν μόνο οι δεινόσαυροι",
    answer1: "Σωστό",
    answer2: "Λάθος",
    correct: 1,
  },
  {
    question:
      "Τα πρώτα απολιθωμένα χνάρια προγόνων των σημερινών ανθρώπων προέρχονται από",
    answer1: "την Αφρική",
    answer2: "την Ευρώπη",
    correct: 0,
  },
  {
    question: "Οι Νεάντερνταλ έζησαν στην",
    answer1: "Ασία",
    answer2: "Ευρώπη",
    correct: 1,
  },
  {
    question: "Τα μαμούθ έζησαν μαζί με",
    answer1: "τους ανθρώπους",
    answer2: "τους δεινόσαυρους",
    correct: 0,
  },
  {
    question: "Η τελευταία παγετώδης περίοδος έληξε πριν από",
    answer1: "115.000 χρόνια",
    answer2: "11.500 χρόνια",
    correct: 1,
  },
  {
    question: "Πού εμφανίστηκε αρχικά η ζωή στη Γη;",
    answer1: "Στους πρώτους ωκεανούς",
    answer2: "Στην ξηρά",
    correct: 0,
  },
  {
    question:
      "Σε πόσες μεγάλες περιόδους έχουν διαιρέσει οι επιστήμονες τον γεωλογικό χρόνο;",
    answer1: "3 περιόδους",
    answer2: "4 περιόδους",
    correct: 1,
  },
  {
    question:
      "Τι ποσοστό της γεωλογικής ιστορίας της Γης καλύπτει το Προκάμβριο;",
    answer1: "Περίπου 88%",
    answer2: "Περίπου 50%",
    correct: 0,
  },
  {
    question: "Ποιοι ήταν οι πρώτοι οργανισμοί που εμφανίστηκαν στη Γη;",
    answer1: "Τα βακτήρια",
    answer2: "Τα ψάρια",
    correct: 0,
  },
  {
    question:
      "Πριν από πόσα χρόνια περίπου άρχισαν τα κυανοβακτήρια να κάνουν φωτοσύνθεση;",
    answer1: "5 δισεκατομμύρια χρόνια",
    answer2: "2,8 δισεκατομμύρια χρόνια",
    correct: 1,
  },
  {
    question: "Πότε εμφανίστηκαν τα πρώτα αμφίβια;",
    answer1: "Κατά τον Παλαιοζωικό αιώνα",
    answer2: "Κατά τον Μεσοζωικό αιώνα",
    correct: 0,
  },
  {
    question:
      "Πότε σημειώθηκε η μεγαλύτερη φυσική καταστροφή στην ιστορία της Γης;",
    answer1: "Στο τέλος του Παλαιοζωικού αιώνα",
    answer2: "Στο τέλος του Μεσοζωικού αιώνα",
    correct: 0,
  },
  {
    question:
      "Ποιο ποσοστό των ειδών εξαφανίστηκε στη μεγαλύτερη φυσική καταστροφή;",
    answer1: "Περίπου 50%",
    answer2: "Περίπου 90%",
    correct: 1,
  },
  {
    question: "Ποιοι κυριαρχούσαν στην ξηρά κατά τον Μεσοζωικό αιώνα;",
    answer1: "Οι δεινόσαυροι",
    answer2: "Τα θηλαστικά",
    correct: 0,
  },
  {
    question: "Ποια ήταν η πιθανότερη αιτία εξαφάνισης των δεινοσαύρων;",
    answer1: "Παγετώδης περίοδος",
    answer2: "Πτώση αστεροειδούς",
    correct: 1,
  },
  {
    question: "Πότε εμφανίστηκαν οι πρώτοι πρόγονοι του ανθρώπου;",
    answer1: "Πριν 4-5 εκατομμύρια χρόνια",
    answer2: "Πριν 10 εκατομμύρια χρόνια",
    correct: 0,
  },
  {
    question:
      "Ποιο είδος ήταν ο πρώτος άνθρωπος που μετανάστευσε από την Αφρική;",
    answer1: "Homo sapiens",
    answer2: "Homo erectus",
    correct: 1,
  },
  {
    question: "Πότε συναντήθηκαν οι Νεάντερταλ με τον Homo sapiens;",
    answer1: "Πριν από 40.000 χρόνια",
    answer2: "Πριν από 100.000 χρόνια",
    correct: 0,
  },
  {
    question: "Πότε ξεκίνησε η Γεωργική Επανάσταση;",
    answer1: "Πριν από 10.000 χρόνια",
    answer2: "Πριν από 50.000 χρόνια",
    correct: 0,
  },
  {
    question: "Τι είναι τα στρωματόλιθοι;",
    answer1: "Είδος απολιθώματος δεινοσαύρου",
    answer2: "Σχηματισμοί που περιέχουν ίχνη από διεργασίες βακτηρίων",
    correct: 1,
  },
];

var questionsShown = [],
  notShownQuestions = structuredClone(questions),
  loop;

jQuery(document).ready(function ($) {
  var modal = $(".modal"),
    questionModal = $("#questionModal"),
    questionSelected = -1,
    checkAnswerBtn = null,
    lets_roll = $(".lets-roll"),
    instructions = $(".instructions"),
    turn_dom = $(".turn"),
    caret_dom = $(".caret"),
    main_container = $(".main-container"),
    roll_dice_button = $("#roll-dice"),
    dice_img = $("#dice_img"),
    dice_value_dom = $(".dice_value"),
    dice_value = 0,
    suspend_flag = true,
    nextTurn = "0",
    first_player = "Ομάδα 1",
    second_player = "Ομάδα 2",
    my_avatar = "",
    has_my_avatar_won = false,
    who_goes_first = "Ομάδα 1",
    flag = true,
    reached_end = false;

  var resetAll = function () {
    ((dice_value = 0),
      (suspend_flag = true),
      (nextTurn = "0"),
      (first_player = ""),
      (second_player = ""),
      (my_avatar = ""),
      (has_my_avatar_won = false),
      (who_goes_first = ""),
      (flag = true));
    reached_end = false;

    activeClickOnButton();
  };
  var snakeorladderobj = {
    "row1 col5": {
      type: "1", //1 means ladder
      end: "row2 col4",
    },
    "row3 col3": {
      type: "0", //0 means snake
      end: "row1 col2",
    },
    "row4 col1": {
      type: "0", //0 means snake
      end: "row3 col2",
    },
    "row5 col1": {
      type: "0", //0 means snake
      end: "row4 col4",
    },
    "row4 col3": {
      type: "1", //1 means ladder
      end: "row5 col4",
    },
  };
  // modal.addClass("show");

  $(".overlay").removeClass("loading");

  $(".play-again").click(function () {
    resetAll();
    $(".selection").show();
    $(".who-won").hide();
    modal.addClass("show");
    $(".player_in_board").remove();
  });

  window.addEventListener("load", function () {
    prestartGame("one", "Ομάδα 1");
    checkAnswerBtn = document.querySelector("#checkAnswer");
    checkAnswerBtn.addEventListener("click", checkAnswer);
  });

  // lets_roll.click(function () {
  //   var selected_avatar    = "",
  //       selected_who_first = "";
  //   instructions.removeClass("error");
  //   selected_avatar = $("input[name=choose-avatar]:checked").val();
  //   selected_who_first = $("input[name=who-first]:checked").val();

  //   if ( selected_avatar !== undefined && selected_who_first !== undefined ) {
  //     modal.removeClass("show");
  //     who_goes_first = selected_who_first;
  //     prestartGame(selected_avatar, selected_who_first);
  //   }
  //   else {
  //     instructions.addClass("error");
  //   }
  // });

  var prestartGame = function (avatar, who_first) {
    my_avatar = avatar;

    first_player = whichPlayerIsFirstRoll(avatar, who_first);

    if (first_player == 1) {
      second_player = 2;
    } else {
      second_player = 1;
    }
    nextTurn = first_player;

    //place avatar in box1 whose is first
    var box1 = $(".row1.col1").position();

    var top = box1.top + 10;
    var left = box1.left + 3;

    main_container.append(
      '<img data-currentboxrowcol="row1 col1" data-currentboxno="1" class = "player_in_board player' +
        first_player +
        '" src="imgs/avatar_body' +
        first_player +
        '.png" alt="player1" style="top:' +
        top +
        "px;left:" +
        left +
        'px">',
    );
    startTheGame();
  };

  var startTheGame = function () {
    roll_dice_button.click(function () {
      roll_dice();
    });
  };

  var roll_dice = function () {
    if (suspend_flag) {
      var no = startDiceAnimation(); //this animation is just for representative purpose.
    }
  };

  var startDiceAnimation = function () {
    suspendClickOnButton();
    var x;

    var tid = setInterval(function () {
      changeImgs();
    }, 50);

    var i = 0;

    var changeImgs = function () {
      i++;
      x = Math.floor(Math.random() * 6 + 1);

      dice_img.attr("src", "imgs/dice" + x + ".png");
      if (i > 10) {
        clearInterval(tid);
        dice_value = x;

        showQuestion();
      }
    };
  };

  var showQuestion = function () {
    if (notShownQuestions.length == 0)
      notShownQuestions = structuredClone(questions);

    let random = Math.floor(Math.random() * (notShownQuestions.length - 1));
    questionSelected = random;

    questionModal.addClass("show");
    document.querySelector("#question").innerHTML =
      notShownQuestions[questionSelected].question;
    document.querySelector("#answer1").innerHTML =
      notShownQuestions[questionSelected].answer1;
    document.querySelector("#answer2").innerHTML =
      notShownQuestions[questionSelected].answer2;
  };

  var checkAnswer = function () {
    if (checkAnswerBtn.disabled) return;

    let correct = false;
    let correctAnswer = notShownQuestions[questionSelected].correct;
    notShownQuestions.splice(questionSelected, 1);
    if (correctAnswer == 0) {
      if (document.querySelector("#answer1Value").checked == true)
        correct = true;
    } else {
      if (document.querySelector("#answer2Value").checked == true)
        correct = true;
    }

    document.querySelector("#answer1Value").checked = false;
    document.querySelector("#answer2Value").checked = false;

    const feedbackElement = document.querySelector("#feedback");
    if (correct == false) {
      feedbackElement.innerHTML = "Αυτή δεν είναι η σωστή απάντηση.";
      checkAnswerBtn.disabled = true;
      setTimeout(function () {
        checkAnswerBtn.disabled = false;
        questionModal.removeClass("show");
        activeClickOnButton();
        feedbackElement.innerHTML = "";

        moveThePlayer(0);
        // var b = changeTurn(nextTurn);
        // nextTurn = b[0];
      }, 1000);
    } else {
      feedbackElement.innerHTML = "Σωστά! Αυτή είναι η σωστή απάντηση.";
      checkAnswerBtn.disabled = true;
      setTimeout(function () {
        checkAnswerBtn.disabled = false;
        questionModal.removeClass("show");
        moveThePlayer(dice_value);
        feedbackElement.innerHTML = "";
      }, 1000);
    }
  };

  var suspendClickOnButton = function () {
    suspend_flag = false;
    roll_dice_button.addClass("not-active");
  };

  var activeClickOnButton = function () {
    suspend_flag = true;
    roll_dice_button.removeClass("not-active");
  };

  var endGame = function () {
    modal.find(".selection").hide();
    modal.find(".who-won").show();

    modal.addClass("show");

    var both_players = $(".player_in_board");
    for (var i = 0; i < both_players.length; i++) {
      var self = both_players[i];

      if ($(self).attr("data-currentboxno") == 25) {
        var who_won_temp = $(self).attr("src");

        var temp2 = {
          one: "1",
          two: "2",
        };

        if (who_won_temp.match(/\d+/) == temp2[my_avatar]) {
          has_my_avatar_won = true;
        }

        if (has_my_avatar_won) {
          $(".which-avatar-won").attr("src", "imgs/avatar1.png");
          $(".greetings").html("Συγχαρητήρια!");
          $(".won-or-lose").html("Κερδίσατε!");
        } else {
          $(".greetings").html("Συγχαρητήρια!");
          $(".which-avatar-won").attr("src", "imgs/avatar2.png");
          $(".won-or-lose").html("Κερδίσατε!");
        }
      }
    }
    reached_end = true;
  };

  var moveThePlayer = function (x) {
    var addition = Number(getCurrentBox()[1]) + x;
    var currentpos_arr = [];
    var current_position = "";
    var iti = 0;
    loop = window.setInterval(function () {
      hop(x);
    }, 500);

    hop = function (x) {
      if (iti < x) {
        var currentpos_arr = [];
        var current_position = "";
        currentpos_arr = getCurrentBox();

        current_position = currentpos_arr[0];

        var nexthop = getNextHop(current_position, currentpos_arr[1]);

        $(".player" + nextTurn).attr({
          "data-currentboxrowcol": nexthop,
          "data-currentboxno": Number(currentpos_arr[1]) + 1,
        });
        var temp_ = nexthop;
        nexthop = nexthop.replace(" ", ".");
        nexthop = $("." + nexthop).position();
        $(".player" + nextTurn).css({
          top: nexthop.top + 10,
          left: nexthop.left + 3,
        });

        if (temp_ == "row5 col5") {
          endGame();
        }
        iti++;
      } else {
        clearInterval(loop);
        checkInEndForSnakeOrLadder();
        window.setTimeout(function () {
          movePlayer2toStart();
          var b = changeTurn(nextTurn);
          nextTurn = b[0];

          activeClickOnButton();
          if (b[1] == "Η σειρά της ομάδας 1") {
            // window.setTimeout(function () {
            //   if ( !reached_end ) {
            //     roll_dice();
            //   }
            // }, 400);
          }
        }, 400);
      }
    };
  };

  var movePlayer2toStart = function () {
    if (flag) {
      var box1 = $(".row1.col1").position();

      var top = box1.top + 10;
      var left = box1.left + 3;

      main_container.append(
        '<img data-currentboxrowcol="row1 col1" data-currentboxno="1" class = "player_in_board player' +
          second_player +
          '" src="imgs/avatar_body' +
          second_player +
          '.png" alt="player2" style="top:' +
          top +
          "px;left:" +
          left +
          'px">',
      );
      flag = false;
    }
  };

  var changeTurn = function (x) {
    if (x == 1) {
      x = 2;
    } else {
      x = 1;
    }
    var a = [];
    caret_dom.toggleClass("nextturn");
    if (turn_dom.text() == "Η σειρά της ομάδας 2") {
      turn_dom.text("Η σειρά της ομάδας 1");
      a.push(x);
      a.push("Η σειρά της ομάδας 1");
      return a;
    } else {
      turn_dom.text("Η σειρά της ομάδας 2");
      a.push(x);
      a.push("Η σειρά της ομάδας 2");
      return a;
    }
  };

  var checkInEndForSnakeOrLadder = function () {
    var currentpos_arr = getCurrentBox();

    var ans = isOnSnakeOrLadder(
      getNumberFromRowString(currentpos_arr[0]),
      getNumberFromColString(currentpos_arr[0]),
    );

    if (ans.length > 0) {
      move(ans);
    }
  };

  var move = function (ans) {
    var nexthop = ans.replace(" ", ".");
    nexthop = $("." + nexthop).position();
    $(".player" + nextTurn).css({
      top: nexthop.top + 10,
      left: nexthop.left + 3,
    });
    $(".player" + nextTurn).attr({
      "data-currentboxrowcol": ans,
      "data-currentboxno": Number(getNumberOfBox(ans)),
    });
  };

  var getNumberOfBox = function (box) {
    box = box.replace(" ", ".");
    return $("." + box)
      .find("span")
      .text();
  };

  var getNextHop = function (c, no) {
    var r = getNumberFromRowString(c);
    var c = getNumberFromColString(c);

    if (r % 2 == 0) {
      c--;
    } else {
      c++;
    }

    if (Number(no) >= Number(r) * 5) {
      //means next row
      if (r % 2 == 0) {
        c = 1;
      } else {
        c = 5;
      }
      r++;
    }

    var temp = "row" + r + " col" + c;

    return temp;
  };
  var isOnSnakeOrLadder = function (r, c) {
    var current = "row" + r + " col" + c;
    for (pos in snakeorladderobj) {
      if (pos == current) {
        return snakeorladderobj[pos].end;
      }
    }
    return "";
  };

  var getNumberFromRowString = function (a) {
    return a.split(" ")[0].match(/\d+/)[0];
  };

  var getNumberFromColString = function (a) {
    return a.split(" ")[1].match(/\d+/)[0];
  };

  var getCurrentBox = function () {
    var a = [];

    a.push($(".player" + nextTurn).attr("data-currentboxrowcol"));
    a.push($(".player" + nextTurn).attr("data-currentboxno"));

    return a;
  };

  var getFinalBox = function (addedno, currentrow) {
    //current row helps decreasing the no of loops.

    var c = Number(currentrow);
    var start = (5 - (c + 2)) * 5;
    var boxs = $("ul li.box");

    for (var i = start; i < start + 15; i++) {
      var self = boxs[i];
      if ($(self).find("span").text() == addedno) {
        return $(self).attr("class").substr(4);
      }
    }
  };

  var whichPlayerIsFirstRoll = function (avatar, who_first) {
    //this function is because to clear the confusion of chosen avatar and first turn. This function
    //will return p1 or p2
    if (avatar === "one") {
      if (who_first === "Ομάδα 1") {
        turn_dom.html("Η σειρά της ομάδας 1");
        return "1";
      }
      if (who_first === "computer") {
        caret_dom.addClass("nextturn");
        turn_dom.html("Η σειρά της ομάδας 2");
        return "2";
      }
    }
    if (avatar === "two") {
      if (who_first === "Ομάδα 1") {
        caret_dom.addClass("nextturn");
        turn_dom.html("Η σειρά της ομάδας 1");
        return "2";
      }
      if (who_first === "Ομάδα 2") {
        turn_dom.html("Η σειρά της ομάδας 2");
        return "1";
      }
    }
  };
});
