# -*- coding: utf-8 -*-
# Copyright (C) 2014-2022  EDF R&D
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
#
# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
#
"""Statistiques maillage"""

import os
import logging

def getStatsMaillageFissure(maillage, referencesMaillageFissure, maillageFissureParams):
  """"Statistiques maillage"""

  logging.debug('start')

  if 'nomRep' in maillageFissureParams:
    nomRep = maillageFissureParams['nomRep']
  else:
    nomRep = os.path.curdir

  nomFicFissure     = maillageFissureParams['nomFicFissure']
  fichierStatMaillageFissure = os.path.join(nomRep, "{}.res".format(nomFicFissure))
  fichierNewRef = os.path.join(nomRep, "{}.new".format(nomFicFissure))
  logging.debug("fichierStatMaillageFissure=%s", fichierStatMaillageFissure)

  ok_maillage = False
  if maillage is not None:
    mesures = maillage.GetMeshInfo()
    d_resu = dict()
    for key, value in mesures.items():
      logging.debug( "key: %s value: %s", key, value)
      d_resu[str(key)] = value
    logging.debug("dico mesures %s", d_resu)

    text_2 = ""
    ok_maillage = True
    with open(fichierStatMaillageFissure, "w", encoding='utf-8') as fic_stat :

      # Le nombre de quadrangles ou d'hexaèdres doit être rigoureusement identique
      for key in ('Entity_Quad_Quadrangle', 'Entity_Quad_Hexa'):
        if d_resu[key] != referencesMaillageFissure[key]:
          text = "Ecart"
          ok_maillage = False
        else:
          text = "Valeur_OK"
        text += ": {} reference: {} calcul: {}".format(key,referencesMaillageFissure[key],d_resu[key])
        logging.info(text)
        fic_stat.write(text+"\n")
        text_2 += "                                          {} = {}, \\\n".format(key,d_resu[key])

      # Le nombre de noeuds, d'arêtes, de triangles, de tétraèdres ou de pyramides peut varier du fait des algorithmes. On tolère 5% d'écart.
      tolerance = 0.05
      for key in ('Entity_Node', 'Entity_Quad_Edge', 'Entity_Quad_Triangle', 'Entity_Quad_Tetra', 'Entity_Quad_Pyramid', 'Entity_Quad_Penta'):
        if d_resu[key] == referencesMaillageFissure[key]:
          text = "Valeur_OK"
        elif (d_resu[key] < (1.0 - tolerance)*referencesMaillageFissure[key]) \
          or (d_resu[key] > (1.0 + tolerance)*referencesMaillageFissure[key]):
          text = "Ecart de plus de {}%".format(tolerance*100.)
          ok_maillage = False
        else:
          text = "Valeur_OK à moins de {}%".format(tolerance*100.)
        text += ": {} reference: {} calcul: {}".format(key,referencesMaillageFissure[key],d_resu[key])
        logging.info(text)
        fic_stat.write(text+"\n")
        text_2 += "                                          {} = {}, \\\n".format(key,d_resu[key])

    if ok_maillage:
      text = "Calcul cohérent avec la référence."
    else:
      text = "Calcul différent de la référence.\n"
      text += "Voir le fichier {}\n".format(fichierStatMaillageFissure)
      text += "La nouvelle référence est disponible dans le fichier :\n{}\n".format(fichierNewRef)
      text += "Il faut l'insérer pour créer le dictionnaire 'referencesMaillageFissure' dans le paramétrage du cas."
#     Résultats de référence pour intégration dans le python du cas pour une mise à jour
      with open(fichierNewRef, "w") as fic_info :
        fic_info.write(text_2[:-4]+" \\")

    print (text.encode('utf-8'))

  return ok_maillage
