# ==============================================================================
"""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"""
  #print(widget, code, mods)
  # TODO (check if pressed key is valid, then call 'move' for that key)
# ------------------------------------------------------------------------------
def move(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 = win.frog*2+1
  # la grenouille cliquée est win.board[n]
  # si c'est une grenouille bleue, etat 1
  if win.board[n].state == 1:
    # 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:  # 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
# ==============================================================================
