# ==============================================================================
"""LEAP FROG : implement the LeapFrog puzzle"""
# ==============================================================================
__author__  = "Christophe Schlick modified by Philippe Blasi"
__version__ = "0.0" # skeleton version (for mouse or keyboard interaction)
__date__    = "2022-11-12"
# ------------------------------------------------------------------------------
from ezTK import *
# ------------------------------------------------------------------------------
def main(frog=3):
  """create the main window and pack the widgets"""
  global win
  #win = Win(title='LEAP FROG', op=3, click=on_click) # mouse-based version
  win = Win(title='LEAP FROG', op=3, key=on_key) # keyboard-based version
  # ----------------------------------------------------------------------------
  # TODO (use 1 Frame, (2*frog+1) Bricks, 1 Button)
  # ----------------------------------------------------------------------------
  images = (Image('frog0.gif'),Image('frog1.gif'),Image('frog2.gif'))
  # créer la frame
  board = Frame(win)

  # la remplir de (2*frog+1) Bricks contenant les images de grenouilles
  # la fonction on_reset se chargera de choisir le bon état pour chaque case
  for i in range(2*frog+1):
    Brick(board, image=images, border=2)

  Button(win,text='RESET',command=on_reset)
  
  win.board = board # sauvegarde de la frame board
  win.frog = frog   # sauvegarde du nombre de grenouilles pour utilisation dans
                    # on_reset et move
  
  on_reset(); win.loop() # set initial configuration and start event loop
# ------------------------------------------------------------------------------
def on_reset() -> None:
  """callback function for the 'RESET' button"""
  # TODO (set initial position for all frogs on board)
  # les win.frog premières brick sont des grenouilles bleues, etat 1
  for i in range(win.frog):
    win.board[i].state = 1
  
  # la brick du centre est blanche, etat 0
  win.board[win.frog].state = 0
  
  # les win.frog dernières brick sont des grenouilles vertes, etat 2
  for i in range(win.frog+1,2*win.frog+1):
    win.board[i].state = 2
# ------------------------------------------------------------------------------
def on_click(widget:object, code:str, mods:str) -> None:
  """callback function for all mouse click events"""
  # TODO (check if mouse click is on a frog, then call 'move' for that frog)
  if widget.master != win.board or widget.index is None:
    return # nothing to do (mouse click is not on a grid cell)
  move(widget.index)
# ------------------------------------------------------------------------------
def on_key(widget, code, mods):
  """callback function for all keyboard events"""
  # TODO (check if pressed key is valid, then call 'move' for that key)

  # regarder le code de la touche pressée
  # si c'est 'Right', on appelle move avec la valeur -1
  # si c'est 'Left', on appelle move avec la valeur 1
  if code == 'Right':
      move(-1)
  elif code == 'Left':
      move(1)
  
# ------------------------------------------------------------------------------
def move(n:int) -> None:
    """move a frog according to n,
       a blue to the right if n == -1,
       a green to the left if n == 1"""

    # rechercher l'indice de la case blanche, etat 0, dans win.board ==> index_white
    board_size = 2*win.frog+1
    for i in range(board_size):
        if win.board[i].state == 0:
            index_white = i
            break  # on a trouvé la case blanche, on peut arrêter la boucle
    
    # essayer d'y déplacer la grenouille la plus proche
    # si n == -1, il faut déplacer une grenouille bleue, état 1
    #    celle en position index_white-1 ou en position index_white-2
    if n == -1:
        if index_white-1 >= 0 and win.board[index_white-1].state == 1:
            win.board[index_white-1].state = 0
            win.board[index_white].state = 1
        elif index_white-2 >= 0 and win.board[index_white-2].state == 1:
            win.board[index_white-2].state = 0
            win.board[index_white].state = 1
    # si n == 1, il faut déplacer une grenouille verte, état 2
    #    celle en position index_white+1 ou en position index_white+2
    else:
        if index_white+1 < board_size and win.board[index_white+1].state == 2:
            win.board[index_white+1].state = 0
            win.board[index_white].state = 2
        elif index_white+2 < board_size and win.board[index_white+2].state == 2:
            win.board[index_white+2].state = 0
            win.board[index_white].state = 2         
    

# ------------------------------------------------------------------------------
def move_click(n:int) -> None:
  """move frog located at index 'n', after checking if its move is valid"""
  # TODO (check if move is valid, then update corresponding frog position)
  board_size = 2*win.frog+1
  if win.board[n].state == 1:  # on bouge une grenouille bleue
    # regarder si la case n+1 est vide, si oui y déplacer la grenouille
    if n+1 < board_size and win.board[n+1].state == 0:
        win.board[n].state = 0
        win.board[n+1].state = 1        
    # sinon regarder si la case n+2 est vide, si oui y déplacer la grenouille
    elif n+2 < board_size and win.board[n+2].state == 0:
        win.board[n].state = 0
        win.board[n+2].state = 1
  elif win.board[n].state == 2:  # on bouge une grenouille verte
    # regarder si la case n-1 est vide, si oui y déplacer la grenouille
    if n-1 >= 0 and win.board[n-1].state == 0:
        win.board[n].state = 0
        win.board[n-1].state = 2        
    # sinon regarder si la case n-2 est vide, si oui y déplacer la grenouille
    elif n-2 >= 0 and win.board[n-2].state == 0:
        win.board[n].state = 0
        win.board[n-2].state = 2 
# ==============================================================================
if __name__ == '__main__':
  main() # create window with default game parameters: frog=3
  #main(7) # try with 7 frogs per color
# ==============================================================================
