# ==============================================================================
"""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 row in range(4)]

  # 3- remplir chacune des colonnes de ce tableau
  #    pour chaque colonnne de la matrice
  #         créer un tableau t 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):
    t = [mat[i][col] for i in range(nb_rows)]
    stat[0][col] = min(t)
    stat[1][col] = max(t)
    stat[2][col] = int(mean(t)*100)/100      # pour ne garder que deux décimales
    stat[3][col] = int(deviation(t)*100)/100 # pour ne garder que deux décimales

  # 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 """
  pass
  # 1 - créer un tableau avec les valeurs de array élevées au carré
  # 2 - calculer la moyenne de ce tableau
  # 3 - appliquer la formule de l'écart-type
  
# ------------------------------------------------------------------------------
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
  return  matstat(command)
# ==============================================================================
if __name__ == '__main__':
  userloop(parser, "Enter <filename> [filename ...]")
# ==============================================================================
