import { defineStore } from "pinia";
import boardConstructor from "@/classes/boardConstructor";
import { useGameStore } from "./game";

export const useBotStore = defineStore("bot", {
    state: () => ({
        items: {},
    }),
    actions: {
        generate() {
            const game = useGameStore();
            const board = new boardConstructor(game.boardSize, game.getAvailableItems());
            let items = board.generateItems();
            this.items = board.generateBoard(items);
            let playerItems = {};
            Object.values(this.items).forEach((item) => {
                playerItems[item.id] = { size: item.size, margin: item.margin };
            });
            game.opponent.id = "bot";
            game.opponent.items = playerItems;
            game.opponent.status = "ready";
        },
        async makeMove() {
            const game = useGameStore();
            if (game.winner != null) return
            await game.sleep(1000)
            let targetCell = this.getTargetCell()
            console.log('%c Bot move ', 'color:#e2a520;', targetCell);
            let move = await game.checkMove(targetCell, "bot");
            await game.completeMove(move)
            switch (move.item.type) {
                case "fish":
                    await this.makeMove();
                    break;
            }
        },
        async checkMove(targetCell) {
            const game = useGameStore();
            let move = {};
            let targetItem = Object.values(this.items).filter((item) =>
                item.cells.includes(targetCell)
            )[0];
            move.targetCell = targetCell;
            move.player = game.turn.player;
            move.opponent = game.turn.opponent;
            move.create = new Date();
            move.status = "move";
            if (targetItem != undefined) {
                move.item = {
                    id: targetItem.id,
                    type: targetItem.type,
                    name: targetItem.name,
                };
            } else {
                move.item = {
                    id: "empty",
                    type: "empty",
                    name: "empty",
                };
            }
            return move;
        },
        getTargetCell() {
            return this.mediumMode();
        },
        easyMode() {
            const game = useGameStore();
            let moves = [];
            game.moves.forEach((move) => {
                if (move.player == "bot") moves.push(move.targetCell);
            });
            let board = Array.from(
                Array(game.boardSize * game.boardSize).keys()
            );
            let availableMoves = board.filter((cell) => !moves.includes(cell));
            let targetCell =
                availableMoves[
                    Math.floor(Math.random() * availableMoves.length)
                ];
            return targetCell;
        },
        mediumMode() {
            const game = useGameStore();
            let moves = [];
            game.moves.forEach((move) => {
                if (move.player == "bot") moves.push(move.targetCell);
            });
            let board = Array.from(
                Array(game.boardSize * game.boardSize).keys()
            );
            let availableMoves = board.filter((cell) => !moves.includes(cell));
            let marginCells = this.getMarginCells()
            availableMoves = availableMoves.filter((cell) => !marginCells.includes(cell));
            let targetCell =
                availableMoves[
                    Math.floor(Math.random() * availableMoves.length)
                ];
            return targetCell;
        },
        getMarginCells() {
            const game = useGameStore();
            let items = {}
            game.moves.forEach((move) => {
                if (move.player != "bot" || move.item.id == 'empty') return
                if (items[move.item.id] == undefined) items[move.item.id] = 0
                items[move.item.id]++
            });
            let marginCells = []
            Object.keys(items).forEach((itemId) => {
                if (game.player.items[itemId].size == items[itemId]) {
                    game.player.items[itemId].marginCells.forEach((cell) => {
                        marginCells.push(cell)
                    })
                } 
            })
            return marginCells
        },
    },
    persist: true,
});
