var player;
var ennemy;
var my_id = 1;
var my_turn = false;
var environnement = "blanche";
var selectedCard = {
    type: ""
};
var isAttacking = false;
var attackingWith = {};
var lookingForSacrifices = false;

var turn = {
    toggle_availables: 1,
    plays_available: 1,
    reineEclipse: 0
}

var my_defausse = [];

function beginTour() {
    my_turn = true;
    turn.toggle_availables = 1;
    turn.plays_available = 1;
    turn.reineEclipse = 0;
    if (actions.findIndex((action) => action.name == "Adrenaline") != -1)
    {
        turn.plays_available = 2;
    }
    Pioche()
    if (actions.findIndex((action) => action.name == "Abondance") != -1) {
        Pioche()
    }
    if (monsters.findIndex((monstre) => monstre.name == "ReinedelEclipse") != -1) {
        turn.reineEclipse = 1;
    }
}

function Pioche() {
    //TODO PIOCHE
    socket.emit("pioche", {room : "{{ room }}" });
}

function PlayCard(card) {
    carte =  player.cartes[card];
    console.log(carte);
    if(canPlay() == false) {
        return;
    }
    if (selectedCard.name != carte.name) {//Si c'est une autre carte
        if (!lookingForSacrifices) { //Si on ne cherche pas de sacrifices
            $('.selected').removeClass("selected");
            if (carte.color == environnement) { //Si on est dans le bon coté
                if (carte.color == "noire" && carte.cout >= player.cartes.length) { //Si on a pas assez de carte à défausser
                    return
                }
                if (carte.color == "blanche" && player.cartes_ennemies.length + carte.cout > 7) {
                    //Si on fait piocher trop de carte à l'ennemis
                    return
                }
                selectedCard = carte; // on selectionne celle ci à la place
                $("#my_card" + card).addClass("selected");
                if (selectedCard.cout != 0) {
                    if (carte.color == "noire") {
                        lookingForSacrifices = true;
                        $(".cards:not(#my_card" + card + ")").addClass("possible_sacrifiés")
                    }
                    if (carte.color == "blanche") {
                        //TODO faire piocher l'adversaire
                        console.log("blanche")
                    }
                }
            }
        }
        else { //Si on cherche des sacrifices
            //Si on a pas déjà séléctionné cette carte 
            if (carteSacrifiées.findIndex((sacrifiés) => sacrifiés.name == carte.name) == -1)
            {
                if (carteSacrifiées.length < selectedCard.cout) {
                    carteSacrifiées.push(carte);
                    $("#my_card" + card).removeClass("possible_sacrifiés");
                    $("#my_card" + card).addClass("sacrifiés");
                }
            } else {
                //Sinon on la déselectionne
                $("#my_card" + card).addClass("possible_sacrifiés");
                $("#my_card" + card).removeClass("sacrifiés");
                carteSacrifiées.splice(carteSacrifiées.findIndex((sacrifiés) => sacrifiés.name == carte.name), 1);
            }
        }
    } else {//Si c'est la même 
        if (lookingForSacrifices == false) { //Si on déselectionne une carte qui ne demande pas de sacrifices
            ResetSelection();
        } else {
            ResetSelection();
            lookingForSacrifices = false;
            $(".possible_sacrifiés").removeClass("possible_sacrifiés");
            $(".sacrifiés").removeClass("sacrifiés");
            carteSacrifiées = [];
        }
    }
}

function LogCarte(card) {
    console.log(card);
}

let monsters = [{}, {}, {}];
let playableMonsters = [{}, {}, {}]
let ennemyMonsters = [{}, {}, {}]
let actions = [{}, {}];
let carteSacrifiées = [];
function PoseCreature(emplacement) {
    // console.log(selectedCard, '<div class="cards cartes" id="my_card' + selectedCard.index + '" onclick="PlayCard(' + selectedCard.index + ')">' + selectedCard.name + '<img src="/imgs/cartes/ReinedelEclipse.png" /></div>')
    let index = selectedCard.index;
    if (jQuery.isEmptyObject(monsters[emplacement])) { //s'il n'y a pas de monstre sur cet emplacement
        selectedCard.has_attacked = false;
        monsters[emplacement] = selectedCard;

        socket.emit("pose_creature", {carte : selectedCard, index : emplacement, room : "{{ room }}"})
        //mettre la carte dans l'emplacement avec #monster + emplacement .img.url = img;
        $("#monster" + (emplacement + 1) + " img")[0].src = "/imgs/cartes/" + selectedCard.name + ".png";
        //désincrémente l'action
        Played(index)
    }
}

function PoseActionContinue(emplacement) {
    selectedCard.proprietaire = my_id;
    if (jQuery.isEmptyObject(actions[emplacement]) == false && actions[emplacement].proprietaire == my_id) {
        my_defausse.push(actions[emplacement])
        $("#my_top_defausse")[0].src = "/imgs/cartes/" + arg.prochaine.name + ".png";
    }
    actions[emplacement] = selectedCard;
    socket.emit("pose_AC", {carte : selectedCard, index : emplacement, room : "{{ room }}"})
    //mettre la carte dans l'emplacement
    $("#action" + (emplacement + 1) + " img")[0].src = "/imgs/cartes/" + selectedCard.name + ".png";
    // effect[selectedCard.effet]();
    Played(selectedCard.index)
}
function PoseAi() {
    //TODO faire le call socket
    //la mettre dans la defausse
    //effectuer l'effet
    //désincrémente l'action
    Played(selectedCard.index)
}

function setAttackingWith(index) {
    if (canAttack(playableMonsters[index]))
    {
        $(".selected").removeClass("selected");
        attackingWith = playableMonsters[index];
        attackingWith.index = index;
        $("#monster" + index).addClass("selected");
    }
}

function Attack(index) {
    if (index < 3) {
        ennemyMonsters[index].pv -= playableMonsters[attackingWith.index].attack;
        if (actions.findIndex((action) => card.name == "LuneRouge") != -1) {
            playableMonsters[attackingWith.index].pv -= ennemyMonsters[index].attack;
            if (ennemyMonsters[index].name == "Faucheuse") {
                //détruit notre carte
                DestroyMonster(attackingWith.index, 'our')
            }
            if (playableMonsters[attackingWith.index].pv <= 0) {
                // détruit notre carte
                DestroyMonster(attackingWith.index, 'our')
            }
        }
        //TODO annim
        //TODO mettre à jour les graph
        if (ennemyMonsters[index].pv <= 0 || playableMonsters[attackingWith.index].name == "Faucheuse") {
            if (actions.findIndex((action) => card.name == "CheminDamne") != -1) {
                //détruit notre carte
                DestroyMonster(attackingWith.index, 'our')
            }
            //detruit ennemy_monster
            DestroyMonster(index, 'other')
            //va dans la défausse
        }
    } else {
        if (ennemyMonsters.findIndex((monster) => monster.name != "FideleDefenseur") == -1) {
            ennemy.pv -= playableMonsters;
            if (ennemy.pv == 0) {
                console.log("gagné !");
            }
        }
        // if (ennemyMonsters[index].name == "Faucheuse" && actions.findIndex((action) => card.name == "LuneRouge") != -1) {
        //     console.log("gameover");
        // }
    }
    playableMonsters[attackingWith.index].has_attacked = true;
    //TODO faire le call socket
    showPlayableCards(player.cartes);
}

function DestroyMonster(index, which) {
    if (which == "our") {
        my_defausse.push(playableMonsters[index]);
        $("#my_top_defausse")[0].src = "/imgs/cartes/" + arg.prochaine.name + ".png";
        playableMonsters[index] = {};
        monsters[index] = {};
        $("#monster" + index + 1).remove();
    } else {
        $("#ennemy_monster" + index + 1).remove();
        ennemyMonsters[index] = {}
        // faire le call socket
    }
}

function Played(index) {
    player.cartes.splice(index);
    ResetSelection();
    $(".possible_sacrifiés").removeClass("possible_sacrifiés");
    $(".sacrifiés").removeClass("sacrifiés");
    $("#my_card" + index).remove();
    $(".selectionnable").removeClass('selectionnable');
    carteSacrifiées.forEach(carte => {
        $("#my_card" + carte.index).remove()
        my_defausse.push(carte);
        $("#my_top_defausse")[0].src = "/imgs/cartes/" + carte.name + ".png";
        player.cartes.splice(carte.index, 1)
    });
    carteSacrifiées = []
    if (turn.reineEclipse == 0){
        turn.toggle_availables--; //On enlève la possibilité de switcher
    } else {
        turn.reineEclipse = 0 //a part s'il y a la reineEclipse
    }
    turn.plays_available--; //On enlève un tour
    if (turn.plays_available == 0) {
        //phase d'attaque
        isAttacking = true;
    }
    showPlayableCards(player.cartes)
}

const socket = io();
socket.emit("here", { room :"{{ room }}"});
socket.on('deck', function(arg) {
    player = arg;
    ennemy = {
        pv : 10
    }
    environnement = "noire";
    feedHand(arg.cartes, arg.cartes_ennemies)
    $("main").css("background-image", "url(/imgs/plateau/nuit.jpg)")
    console.log("je joue en second")
})

socket.on('begin', function(arg) {
    console.log(arg);
    player = arg;
    ennemy = {
        pv : 10
    }
    my_id = 0;
    my_turn = true;
    feedHand(arg.cartes, arg.cartes_ennemies)
    console.log("Je commence");
    beginTour();
});

socket.on("pose_creature", function(arg) {
    console.log("ennemi a posé une créature")
    ennemyMonsters[arg.index] = arg.carte;
    $("#ennemy_monster" + arg.index + 1 + " img").src = "imgs/cartes/" + arg.carte.name + ".png"
})
socket.on("pose_AC", function(arg) {
    console.log("ennemi a posé une action")
    //TODO s'il y avait déjà une action à nous
    actions[arg.index] = arg.carte;
    $("#action" + arg.index + 1 + " img").src = "imgs/cartes/" + arg.carte.name + ".png"
})

socket.on("pioche", (arg) => {
    player.cartes.push(arg.carte);
    //TODO carte au dessus
    $(".cards").remove();
    $(".ennemy_cards").remove();
    feedHand(player.cartes, player.cartes_ennemies);
    $("#prochaine")[0].src = "/imgs/cartes/" + arg.prochaine.name + ".png";
})

socket.on("ennemy_pioche", (arg) => {
    player.cartes_ennemies.push(arg.carte);
    $(".cards").remove();
    $(".ennemy_cards").remove();
    feedHand(player.cartes, player.cartes_ennemies);
})