# ==============================================================================
"""MATSTAT : perform statistical operations on a matrices stored in CSV files"""
# ==============================================================================
__author__  = "Christophe Schlick modified by Philippe Blasi"
__version__ = "1.0"
__date__    = "2022-11-12"
__usage__   = """
User input : <filename> [filename ...]
             where filename = text file containing a set of integer or float values
App output : The matrix stored in each provided CSV file is displayed with
             additional rows showing the result of statistical operations
             performed on each column: min, max, mean and deviation"""
# ==============================================================================
from ezCLI import *
# ------------------------------------------------------------------------------
def matstat(name:str) -> str:
    """perform statistical operations on a matrices stored in file 'name'"""
  #try:
    # 1 - lire le fichier csv
    mat = read_csv(name)
    nb_row = len(mat)
    nb_col = len(mat[0])
    # 2 - créer la chaine de caractère contenant la grille avec le contenu du fichier csv
    grid1 = "_" * 80 + "\n" + f"Content of '{name}'" + "\n" + grid(mat)
    # 3 - créer un tableau avec 4 ligne et le même nombre de colonne pour contenir le résulat
    #     des calculs statistiques : min, max, moyenne (mean) et écart-type (deviation)
    stat = [[0 for col in range(nb_col)] for row in range(4)]
    # 4 - remplir chaque colonne de ce tableau
    #     pour chaque colonne de mat
    #        creer un tableau t contenant cette colonne
    #        calculer les statistiques sur ce tableau pour remplir la colonne de stat
    for col in range(nb_col):
      t = [mat[i][col] for i in range(nb_row)]
      stat[0][col] = min(t)
      stat[1][col] = max(t)
      stat[2][col] = sum(t)/len(t)
      t_carre = [val**2 for val in t]
      stat[3][col] = sum(t_carre)/len(t_carre) - stat[2][col]**2
    # 5 - créer la chaine de caractère contenant la grille avec le contenu de tableau de statistiques
    grid2 = '\nFrom top to bottom, results for operators min, max, mean, deviation\n' + grid(stat)
    # 6 - renvoyer les deux chaines.
    return grid1 + grid2
  #except:
    return f"{name} : cannot read file"
# ------------------------------------------------------------------------------
def parser(command:str) -> str:
  """parse 'command' and return content of provided files with line numbering"""
  filenames = parse(command); #inspect()

  if type(filenames) is str:
    return matstat(filenames)
  else:
    return '\n'.join([matstat(name) for name in filenames])

##  res_final = ""
##
##  if type(filenames) is str:
##    res_final = numlines(filenames) + "\n"
##  else:
##    # pour chaque name de filenames
##    for name in filenames:
##      #   appeler count sur ce name de fichier et recupérer le résultat
##      res = matstat(name)
##      #   ajouter ce résultat au resultat final en une insérant un retour à la ligne
##      res_final += res + "\n"
##    
##  return res_final
# ==============================================================================
if __name__ == '__main__':
  userloop(parser, "Enter <filename> [filename ...]")
# ==============================================================================
