var gui;
$.ajaxSetup({
        async: false,
        cache: false,
});

function GUI() {
    this.oldState;
    this.newState;
    this.stateInitialised = false;
    this.deadbees = [];
    this.deadinsects = [];
    this.locToAnt = [];
}

function updateControlPanel() {
    tr = $('#antsTableRow');
    tr.find('td').each(function() {
        name = $(this).attr('data-name');
        cost = $(this).attr('data-cost');
        disabled = $(this).attr('data-disabled');
        if (disabled == 1 && gui.get_food() >= cost) {
            $(this).attr("data-disabled", 0).removeClass("ant-inactive");
        }
        else if (disabled == 0 && gui.get_food() < cost) {
            $(this).attr("data-disabled", 1).addClass("ant-inactive");
        }
    });
}
function drawControlPanel(food, places, ants) {
    tr = $('#antsTableRow');
    for (var id in ants) {
        ant = ants[id];
        if (ant["cost"] > food)
            tr.append('<td data-disabled="1" data-cost="' + ant["cost"] + '" data-img="' + ant["img"] + '" data-name="' + ant["name"] + '" id="ant_' + ant["name"]  + '" class="ant-row ant-inactive"><img class="ant-img" src="' + ant["img"] + '"> ' + ant["name"] + '<hr class="ant-row-divider" /><span class="badge ant-cost">' + ant["cost"] + '</span></td>');
        else
            tr.append('<td data-disabled="0" data-cost="' + ant["cost"] + '" data-img="' + ant["img"] + '" data-name="' + ant["name"] + '" id="ant_' + ant["name"] + '" class="ant-row"><img class="ant-img" src="' + ant["img"] + '"> ' + ant["name"] + '<hr class="ant-row-divider" /><span class="badge ant-cost">' + ant["cost"] + '</span></td>');
    }
    updateFoodCount();
    drawInitialPlaces();
}

function drawInitialPlaces() {
    pTable = $('.places-table');
    rows = gui.get_rows();
    places = gui.get_places();
    i = 0;
    tr = null;
    while (i <= rows) {
        pTable.append('<tr id="pRow' + i + '"></tr>');
        tr = pTable.find('#pRow' + i);
        for (col in places[i]) {
            random_sky = Math.floor(Math.random() * 3) + 1;
            random_ground = Math.floor(Math.random() * 3) + 1;
            if (places[i][col]["water"] == 1) {
                random_ground = "water";
            }
            tr.append('<td data-row="' + i  + '" data-col="' + col  + '" data-name="' + places[i][col]["name"]  + '" class="places-td" id="pCol' + col + '"><div class="tunnel-div"><div class="tunnel-img-container"></div><div style="background-image: url(\'assets/tiles/sky/' + random_sky + '.png\')"class="tunnel-goc-div"></div><div style="background-image: url(\'assets/tiles/ground/' + random_ground + '.png\')" class="tunnel-goc-div"></div></div></td>');
        }
        if (i == 0) {
            rowspan = rows + 1
            tr.append('<td id="beehive-td" rowspan="' + rowspan + '" class="place-beehive-td"></td>')
            td = tr.find('.place-beehive-td');
            for (bee in places["Hive"]["insects"]) {
                td.append('<img data-id="' + bee  + '" class="bee-img" src="assets/insects/bee.gif">');
            }
            pTable.find('.place-beehive-td').html()
        }
        i += 1;
    }
}


function updateFoodCount() {
    $('#foodCount').html(gui.get_food());
}

function startGame() {
    gui = new GUI();
    gui.startGame();
    gui.get_gameState(false);
    drawControlPanel(gui.get_food(), gui.get_places(), gui.get_antTypes());
    gui.strategyTime = gui.get_strategyTime();
    gui.interval = setInterval(gui.update.bind(gui), 500);
}

GUI.prototype.startGame = function() {
    $.ajax({
        type: 'POST',
        url: 'ajax/start/game',
        async: false,
    });
}
GUI.prototype.get_localGameState = function() {
    return this.newState;
}
GUI.prototype.get_gameState = function() {
    t = this;
    $.ajax({
      type: 'POST',
      url: 'ajax/fetch/state',
      async: false,
      success: function(state){
        if(!gui.initialised) gui.initialised = true
        t.updateState(state);
        return state;
      }
    })
    .fail(function(xhr, tStatus, e) {
        if(!gui.initialised){
          setTimeout(gui.get_gameState(), 500)
        }else{
          swal({
              title: "Error",
              text: e,
              type: "error",
              showConfirmButton: false,
              });
        }
    });
};

GUI.prototype.get_winner = function() {
    return this.newState["winner"];
}
GUI.prototype.get_rows = function() {
    return this.newState["rows"];
}

GUI.prototype.updateState = function(s) {
    this.oldState = this.newState;
    this.newState = s;
}

GUI.prototype.get_antTypes = function() {
    return this.newState["ant_types"];
}

GUI.prototype.get_places = function() {
    return this.newState["places"];
}

GUI.prototype.get_food = function() {
    return this.newState["food"];
}
GUI.prototype.selectAnt = function(name, img) {
    this.selected_ant = { name: name, img: img };
}
GUI.prototype.get_beeToId = function() {
    return this.newState["beeToId"];
}
GUI.prototype.get_beeLocations = function() {
    return this.newState["beeLocations"];
}
GUI.prototype.get_oldBeeLocations = function() {
    return this.oldState["beeLocations"];
}
GUI.prototype.deselectAnt = function() {
    currentSelected = this.get_selectedAnt();
    this.selected_ant = null;
    if (currentSelected) {
        $('#antsTableRow').find("[data-name = '" + currentSelected["name"] + "']").removeClass("ant-selected");
    }
}
GUI.prototype.get_selectedAnt = function() {
    return this.selected_ant;
}
GUI.prototype.get_time = function() {
    return this.newState["time"];
}
GUI.prototype.is_gameOver = function() {
    return this.newState["gameOver"];
}
GUI.prototype.updateTime = function() {
     $('#timeCount').html(this.get_time());
}
GUI.prototype.get_strategyTime = function() {
    return this.newState["strategyTime"];
}
GUI.prototype.get_deadbees = function() {
    return this.newState["deadbees"];
}
GUI.prototype.get_deadinsects = function() {
    return this.newState["deadinsects"];
}
GUI.prototype.clearBoard = function(){
  $(".places-table > tbody").empty();
}
GUI.prototype.clearAntTypes = function(){
  $("#antsTableRow").empty();
}

GUI.prototype.restartGame = function(){
  this.clearBoard();
  this.clearAntTypes();
  startGame();
}

$('#antsTableRow').on('click', ".ant-row", function() {
    if ($(this).attr('data-disabled') == 1) {
        swal({
            title: "Cannot Select " + $(this).attr('data-name') + " Ant",
            text: "You do not have enough food.",
            type: "error",
        });
        return false;
    }
    currentSelected = gui.get_selectedAnt();
    if (currentSelected) {
        $('#antsTableRow').find("[data-name = '" + currentSelected["name"] + "']").removeClass("ant-selected");
    }
    $(this).addClass('ant-selected');
    gui.selectAnt($(this).attr('data-name'), $(this).attr('data-img'));
});


$("#playBtn").on('click', function() {
    $(this).addClass('animated fadeOutLeft');
    $('#header-title').addClass('animated fadeOutUp');
    $('#hero-head').addClass('animated bounceOutDown').one('webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend', function() {
        $('#hero-head').hide();
        //Load the game wrapper and bg
        $('#gameWrapper').show().addClass('animated bounceInDown');
    });
    startGame();
});

$('#exitBtn').on('click', function() {
    clearInterval(gui.interval);
    $.post("ajax/exit");
    swal({
        title: "Terminated",
        text: "The Web GUI has been killed.",
        type: "warning",
        showConfirmButton: false,
        });
});

$('.places-table').on('click', '.places-td', function() {
    //Check to see if an insect is selected
    t = this
    selectedAnt = gui.get_selectedAnt();
    //Deselect ant
    gui.deselectAnt();
    if (!selectedAnt) {
        swal({
            title: "Error",
            text: "You need to select an insect first.",
            type: "error",
        });
    }
    if (selectedAnt["food"] > gui.get_food()) {
        swal({
            title: "Error",
            text: "Not enough food remains to place " + selectedAnt["name"],
            type: "error",
        });
    }
    $.ajax({
        method: "POST",
        url: "ajax/deploy/ant",
        data: { pname: $(this).attr("data-name"), ant: selectedAnt["name"]},
    })
        .done(function(response) {
            if (response["error"]) {
                swal({
                    title: "Error",
                    text: response["error"],
                    type: "error",
                });
            }
            else {
                //$(t).find('.tunnel-img-container').html('<img data-id="' + response["id"]  +'" class="active-ant" src="' + selectedAnt["img"]  + '">');
                r = $(t).attr("data-row");
                c = $(t).attr("data-col");
                if (!gui.locToAnt[r]) gui.locToAnt[r] = [];
                if(!gui.locToAnt[r][c]){
                  gui.locToAnt[r][c] = [response["id"]];
                }else{
                  // container
                  gui.locToAnt[r][c].unshift(response["id"]);
                }
                gui.update();
            }
        });
});

GUI.prototype.moveBees = function() {
    newLocation = this.get_beeLocations();
    oldLocation = this.get_oldBeeLocations();
    for (bee in oldLocation) {
        if (oldLocation[bee] != newLocation[bee]) {
            loc = $('.places-table').find('td[data-name="' + newLocation[bee]  + '"]');
            img = $('.bee-img[data-id="' + bee  + '"]');
            if (img.css("position") != "absolute") {
                $('.place-beehive-td').css({width: $('.place-beehive-td').width()});
                currentLocTop = img.position().top;
                currentLocLeft = img.position().left;
                img.css({"margin-top": "40px", "top": currentLocTop, "left": currentLocLeft, "position": "absolute"});
            }
            position = loc.position();
            img.animate(position, 1000);
        }
    }
    db = this.get_deadbees();
    for (b in db) {
        if ($.inArray(db[b], this.deadbees) == -1) {
            //We have some bee killing to do
            $('.bee-img[data-id="' + db[b] + '"]').hide("explode", {pieces: 16}, 1000);
            this.deadbees.push(db[b]);
        }
    }
}

GUI.prototype.removeAnts = function() {
    di = this.get_deadinsects();
    for (a in di) {
        if ($.inArray(a, this.deadinsects) == -1) {
            //We have some ant killing to do lol -CS

            img = $('.places-table').find('.active-ant[data-id="' + di[a] + '"]')
            img.hide("explode", {pieces: 16}, 1000);
            if(img[0]){
              td = img[0].closest("td");
              r = $(td).attr("data-row");
              c = $(td).attr("data-col");
              gui.locToAnt[r][c].shift();
            }
            this.deadinsects.push(di[a]);
        }
    }
}
GUI.prototype.update = function() {
    if (this.is_gameOver()) {
        clearInterval(this.interval);
        if (gui.get_winner()) {
            swal({
                title: "Congratulations",
                text: "You successfully defeated the bees!",
                type: "success",
                confirmButtonColor: "#0b752b",
                confirmButtonText: "Restart?"
              },
              this.restartGame.bind(this)
            );
        } else {
            swal({
                title: "Tough Luck",
                text: "You lost and the bees live on.",
                type: "warning",
                confirmButtonColor: "#0b752b",
                confirmButtonText: "Restart?"
              },
              this.restartGame.bind(this)
            );
        }
        return;
    }
    this.get_gameState();
    updateControlPanel();
    this.updateTime();
    updateFoodCount();
    this.moveBees();
    this.removeAnts();
    places = this.get_places();
    for (r in places) {
        if (r == "Hive") {
            continue;
        }
        for (c in places[r]) {
            if ("type" in places[r][c]["insects"]) {
              ant = places[r][c]["insects"];
              antImgTag =  make_img_tag(ant["img"],{"data-id":gui.locToAnt[r][c][0], "class":"active-ant", "container":ant["container"]})
              if(ant["container"] && ant["contains"]){
                antImgTag = make_img_tag(places[r][c]["insects"]["contains"]["img"], {"class":"contained-ant"}) + antImgTag;
              }
              $('.places-table').find('.places-td[data-row="' + r  + '"][data-col="' + c  + '"]').find('.tunnel-img-container').html(antImgTag);
            }
        }
    }
}

GUI.prototype.fireOff = function(){
  beeLocations = this.get_beeLocations();
  beeGrid = []
  places = this.oldState.places;
  height = keys(places).length - 1;
  width = keys(places['0'].length);
  ants = [];
  for(var i = 0; i < height; ++i){
    beeGrid.push(new Array(width));
  }
  for(var i = 0; i < beeLocations.length; ++i){
    location = beeLocations[i].split('_');
    beeGrid[ location[1] ][ location[2] ] = true;
  }
  for(var i = 0; i < height; ++i){
    for(var j = 0; j < width; ++j){
      ants = location[i+""][j+""]["insects"];
    }
  }
}

// particles.js
function shoot_from(a, b){
  console.log("fired from " + a + " to " + b);
}

//utils.js
function make_img_tag(src, attributes){
  tag = "<img src = '" + src + "'";
  for(var attr in attributes) tag += ' ' + attr + " = " + attributes[attr];
  tag += ">"
  return tag
}
