# ==============================================================================
"""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 *
from math import sqrt
# ------------------------------------------------------------------------------
def matstat(name:str) -> str:
  """perform statistical operations on a matrices stored in file 'name'"""
  pass
  # 1 - lire le fichier cvs ==> exemple B4A_csvfile.py
  try:
    mat = read_csv(name)
  except OSError:
    return f"{name} : cannot read file"

  nb_rows = len(mat)
  nb_cols = len(mat[0])
  
  # 2 - créer une tableau 2D (4 lignes, même nombre de colonnes que le tableau
  #     lu depuis le fichier pour les stocker les statisques par colonne
  #     min, max, moyenne(mean) écart-type (deviation)
  stat = [[0.0 for col in range(nb_cols)] for i in range(4)]

  # 3- remplir chacune des colonnes de ce tableau
  #    pour chaque colonnne de la matrice
  #         créer un tableau array contenant les valeurs de cette colonne
  #         calculer les statistiques sur ce tableau pour remplir la colonne stat
  #          fonctions min, max, sum, len
  # optionnel : faire des fonction mean et deviation pour calculer ces valeurs
  for col in range(nb_cols):
    array = [mat[row][col] for row in range(nb_rows)]
    stat[0][col] = min(array)
    stat[1][col] = max(array)
    stat[2][col] = int(mean(array)*100)/100 # pour se limiter à deux décimales
    stat[3][col] = int(deviation(array)*100)/100

  # 4 - créer la chaine de caractère contenant les deux grilles et les messages
  return grid(mat) + '\n' + grid(stat)
# ------------------------------------------------------------------------------
def mean(array:list) -> float:
  """ return the mean of the values of array """
  # utiliser les fonction sum et len pour avoir la moyenne
  return sum(array)/len(array)
# ------------------------------------------------------------------------------
def deviation(array:list) -> float:
  """ return the deviation of the values of array """
  # 1 - créer un tableau avec les valeurs de array élevées au carré
  # array2 = [array[i]**2 for i in range(len(array))]
  array2 = [val**2 for val in array]
  
  # 2 - calculer la moyenne de ce tableau
  mean_square = mean(array2)

  # 3 - appliquer la formule de l'écart-type
  return sqrt(mean_square - mean(array)**2)
  
# ------------------------------------------------------------------------------
def parser(command:str) -> str:
  """parse 'command' and return content of provided files with line numbering"""
  pass
  # version de base : appeler matstat avec la commande
  # sinon, récuperer la version de B3_numlines
  tuple_name = parse(command) ;# inspect()
  if type(tuple_name) is str:
    result = matstat(tuple_name)
  else:
    result = ''
    # pour chaque fichier, appeler count et ajouter le résultat à une chaine
    # de caractère en revenant à la ligne ('\n') entre chaque appel
    for name in tuple_name:
      result += matstat(name) + '\n'

    # version avec création d'un tableau de chaines de charactère
    #tab_res=[matstat(name) for name in tuple_name] ; inspect()
    #result = "\n".join(tab_res)

  return result 
# ==============================================================================
if __name__ == '__main__':
  userloop(parser, "Enter <filename> [filename ...]")
# ==============================================================================
