# ==============================================================================
"""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'))

  board = Frame(win)
  for i in range(2*frog+1):
    Brick(board, border=3, image=images)

  Button(win,text='RESET',command=on_reset)

  win.frog = frog # save the number of frogs
  win.board = board # save the master of the frog bricks
  
  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)
  
  # frog first brick at state 1 for blue frogs
  for i in range(win.frog):
    win.board[i].state = 1
    
  # 1 brick in the middle at state 0 for blank image
  win.board[win.frog].state = 0

  # frog last brick at state 2 for green frogs
  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)
  # voir exemple C6B_event ouvert à gauche de mon écran
  if widget.master != win.board or widget.index is None:
    return # nothing to do (mouse click is not on a grid cell)
  
  move_click(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)

  # si le code de la touche est 'Right', on va déplacer une grenouille bleue
  # vers la droite
  # si le code de la touche est 'Left', on va déplacer une grenouille verte
  # vers la gauche
  # pour ce faire, on appelle la fonction move avec la valeur -1 ou 1
  if code == 'Right':
      move(-1)
  elif code == 'Left':
      move(1)
# ------------------------------------------------------------------------------
def move(n:int) -> None:
  """move frog according the n, to le right if n == -1, to the left il n == 1"""
  # TODO (check if move is valid, then update corresponding frog position)
  board_size = 2*win.frog+1

  # trouver l'indice index_white de la case blanche (etat 0) ==> boucle for
  for i in range(board_size):
      if win.board[i].state == 0:
          index_white = i
          break  # une fois la case trouver, on peut quitter la boucle

  # si c'est un déplacement de grenouille bleue (etat 1) vers la droite (n == -1)
  # essayer de déplacer une grenouille bleue située une ou deux cases avant
  # index_white-1 ou 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 c'est un déplacement de grenouille verte vers la gauche (n == 1)
  # essayer de déplacer une grenouille verte située une ou deux cases après
  # index_white+1 ou 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

  # si c'est une grenouille bleu, état 1, il faut voir si elle peut aller
  # en case n+1 ou n+2. Attention à ne pas sortir des bornes du tableau.
  if win.board[n].state == 1:
      if n+1 < board_size and win.board[n+1].state == 0:
          win.board[n].state   = 0
          win.board[n+1].state = 1
      elif n+2 < board_size and win.board[n+2].state == 0:
          win.board[n].state   = 0
          win.board[n+2].state = 1
  # si c'est une grenouille verte, état 2, il faut voir si elle peut aller
  # en case n-1 ou n-2.  Attention à ne pas sortir des bornes du tableau.
  elif win.board[n].state == 2:
      if n-1 >= 0 and win.board[n-1].state == 0:
          win.board[n].state   = 0
          win.board[n-1].state = 2
      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
# ==============================================================================































