# ==============================================================================
"""FIBOPLUS : generate the Fibonacci sequence with several options"""
# ==============================================================================
__author__  = "Christophe Schlick modified by Philippe Blasi"
__version__ = "1.0" # use 'parse' function with default values
__date__    = "2022-11-12"
__usage__   = """
User input : ['n =' <n>] ['u =' <u>] ['v =' <v>] ['file =' <filename>]
             - n:int = number of terms for the sequence (defaut = 10)
             - u:int = value of the first term (default = 0)
             - v:int = value of the second term (default = 1)
             - filename:str = name of output file (default = output on screen)
App ouput : Fibonacci sequence defined by user arguments

Note: to use all default values, simply enter <SPACE> as command"""
# ==============================================================================
from ezCLI import *
# ------------------------------------------------------------------------------
def fibo(n:int, u:int, v:int) -> int:
  """compute the nth term of the Fibonacci sequence starting from (u,v)"""
  # modifier pour ajouter u et v
  a, b = u, v
  for p in range(n):
    a, b = b, a+b
  return a
# ------------------------------------------------------------------------------
def fibos(n:int, u:int, v:int) -> str:
  """return the 'n' first terms of the Fibonacci starting from (u,v)"""
  # modifier pour ajouter u et v
  lines = ''
  for p in range(n+1):
    lines += f"fibo({p}) = {fibo(p,u,v)}\n"
  return lines.strip()
  # Alternative implementation using list comprehension
  #return '\n'.join(f"fibo({p}) = {fibo(p,u,v)}" for p in range(n+1))
# ------------------------------------------------------------------------------
def parser(command:str) -> str:
  """parse 'command' and return Fibonacci sequence of provided arguments"""
  default = 'n=10 u=0 v=1 filename='
  args = parse(command,default)#; inspect()
  # récuperer les valeurs paramètres n,u,v,file dans le dictionnaire args
  n        = args['n']
  u        = args['u']
  v        = args['v']
  filename = args['filename']

  # vérifier les types des paramètres avec des assert
  assert type(n) is int and n >= 0, "<n> must be a positive integer"
  assert type(u) is int, "<u> must be an integer"
  assert type(v) is int, "<v> must be an integer"
  assert type(filename) is str, "<filename> must be a string"

  # appeler fibos avec les bons paramètres et stocker sa valeur de retour
  result = fibos(n,u,v)

  # si on a donné un nom de fichier, écrire le résultat dans ce fichier et
  # retourner le message Fibonacci sequence (__ values) written in file '__'
  if filename != '':
    write_txt(filename, result)
    return f"Fibonacci sequence ({n} values) written in file '{filename}'"
  else: # sinon renvoyer comme d'habitude le résultat
    return result

  
  
  
# ==============================================================================
if __name__ == '__main__':
  userloop(parser)
# ==============================================================================
