# -*- coding: iso-8859-1 -*-

import scicalc_param as param
from base.scicalc_debug import *
from pprint import pformat
import tools.fraction as fraction
from exts.geometry.geometry_objects import *

#------------------------------------------------------------------------------
class Formater:
  #----------------------------------------------
  def __init__(self, resultat):
    self.res = self.formater(resultat)

  def __repr__(self):
    """
    Retourne la représentation textuelle du résultat
    """
    return "%s" % self.res

  def getClass(self, resultat):
    """
    Retourne le nom de la classe (ou type) du résultat
    """
    strName = str(resultat.__class__).split('.').pop()
    return strName.replace('type', '').strip("'<> ")

  def formater(self, resultat):
    """
    Formate le résultat sous forme de chaîne de caractères. Prends en compte les
    différents types d'objets et de classes manipulées par SciCalc.
    """
    className = self.getClass(resultat)
    debug(True, className)
    if type(resultat) == type(1.2):
      if param.fraction == True:
        debug(param.debug, 'fraction')
        resultat = fraction.DecToFraction(resultat)
      else:
        debug(param.debug, 'float')
      return str(resultat)
    elif type(resultat) == type(1L):
      debug(param.debug, 'long integer')
      return str(pformat(resultat).strip())
    elif type(resultat) == type(1):
      debug(param.debug, 'integer')
      return str(pformat(resultat).strip())
    elif className == 'circle':
      debug(param.debug, 'circle')
      res = {'rayon': resultat.r, 'diametre': resultat.d, 'surface': resultat.a, 'perimetre': resultat.p}
      return self.formater(res)
    elif className == 'sphere':
      debug(param.debug, className)
      res = {'rayon': resultat.r, 'diametre': resultat.d, 'surface': resultat.s, 'volume': resultat.v}
      return self.formater(res)
    elif className == 'cylinder':
      debug(param.debug, className)
      res = {'rayon': resultat.r, 'hauteur': resultat.h, 'base': resultat.b, 'surface': resultat.s, 'volume': resultat.v, 'perimetre': resultat.p}
      return self.formater(res)
    elif className == 'rectangle' or className == 'square':
      debug(param.debug, className)
      res = {'longueur': resultat.x, 'largeur': resultat.y, 'surface': resultat.a, 'perimetre': resultat.p, 'iyy': resultat.iyy, 'izz': resultat.izz, 'diagonale': resultat.d}
      return self.formater(res)
    elif className == 'triangle' and (resultat.h == None):
      debug(param.debug, className)
      res = {'a': resultat.a, 'b': resultat.b, 'c': resultat.c, 'perimetre': resultat.p, 'surface': resultat.s, 'rayon cercle circonscrit': resultat.rc, 'rayon cercle inscrit': resultat.ri}
      return self.formater(res)
    elif className == 'triangle' and (resultat.r == None):
      debug(param.debug, className)
      res = {'base': resultat.x, 'hauteur': resultat.h, 'surface': resultat.s}
      return self.formater(res)
    elif className == 'cube':
      debug(param.debug, className)
      res = {'longeur': resultat.x, 'surface': resultat.s, 'volume': resultat.v, 'sommet': resultat.sommet, 'face': resultat.face, 'arete': resultat.arete, 'perimetre': resultat.p}
      return self.formater(res)
    elif className == 'pyramid' and (resultat.x == None):
      debug(param.debug, className)
      res = {'base': resultat.b, 'hauteur': resultat.h, 'volume': resultat.v}
      return self.formater(res)
    elif className == 'pyramid' and (resultat.x != None) :
      debug(param.debug, className)
      res = {'longueur': resultat.x, 'largeur': resultat.y, 'base': resultat.b, 'hauteur': resultat.h, 'volume': resultat.v}
      return self.formater(res)
    elif className == 'cone':
      debug(param.debug, className)
      res = {'base': resultat.b, 'hauteur': resultat.h, 'rayon': resultat.r, 'diametre': resultat.d, 'surface': resultat.s, 'volume': resultat.v}
      return self.formater(res)
    elif className == 'prism' and (resultat.x == None) :
      debug(param.debug, className)
      res = {'base': resultat.b, 'hauteur': resultat.h, 'volume': resultat.v}
      return self.formater(res)
    elif className == 'prism' and (resultat.x != None) :
      debug(param.debug, className)
      res = {'longueur': resultat.x, 'largeur': resultat.y, 'base': resultat.b, 'hauteur': resultat.h, 'volume': resultat.v}
      return self.formater(res)
    elif className == 'polyhedron':
      debug(param.debug, className)
      res = {'sommets': resultat.sommet, 'cotes (par face)': resultat.cote, 'aretes': resultat.arete, 'surface': resultat.area, 'volume': resultat.volume}
      return self.formater(res)
    else:
      debug(param.debug, 'other')
      return str(pformat(resultat).strip())

