import pygame
import argparse
import time
from os.path import exists, join, splitext

from pygame.locals import QUIT
from simulation.interface import Interface
from simulation.board import Board
from simulation.player import Player
from simulation.logic.main import Blob_Manager


def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('--height', type=int, default=40,
                        help='Board height resolution (default = 40)')
    parser.add_argument('--width', type=int, default=100,
                        help='Board width resolution (default = 100)')
    parser.add_argument('-s', '--scale', type=int, default=10,
                        help='Scaling from board resolution to window resolution (default = x10)')
    parser.add_argument('--init_from', type=str,
                        help='Initialize game from a save. Pass the board filename')
    parser.add_argument('--save_dir', type=str, default="save/",
                        help='Directory where saves are stored.')
    parser.add_argument('--computing_ratio', type=int, default=1,
                        help='how many times computing loop is done before drawing GUI')

    args = parser.parse_args()

    default_dir = "simulation/default"
    player_file = join(default_dir, "player.json")
    blob_file = join(default_dir, "blob.json")

    if args.init_from is not None:
        board_file = join(args.save_dir, args.init_from)
        assert exists(board_file)
        root_name = splitext(board_file)[0]

        board = Board(args.width, args.height)
        board.load(args.save_dir + args.init_from)

        if exists(root_name + ".player.json"):
            player_file = root_name + ".player.json"

        if exists(root_name + ".blob.json"):
            blob_file = root_name + ".blob.json"
    else:
        board = Board(args.width, args.height)

    blob = Blob_Manager(board, blob_file)
    player = Player(board, blob, player_file)

    gui = Interface(board, player, blob, args.scale, args.save_dir)

    init_counter = 100
    timer = time.time()
    counter = init_counter

    init_computing_ratio = args.computing_ratio
    ended = False
    while not ended:
        computing_ratio = init_computing_ratio
        while computing_ratio > 0:
            if gui.play or gui.do_step:
                blob.move()
                board.next_turn()
                gui.do_step = False

            for event in pygame.event.get():
                if event.type == QUIT:
                    ended = True
                else:
                    gui.event_listener(event)

            computing_ratio -= 1

        gui.draw()

        pygame.time.wait(10)

        counter -= 1
        if counter == 0:
            timing = time.time() - timer
            print("Loop mean time : {:.3f}s per iteration".format(timing / init_counter))
            counter = init_counter
            timer = time.time()


if __name__ == "__main__":
    main()