# ==============================================================================
"""BINHEX : show decimal, binary and hexadecimal representations for integers"""
# ==============================================================================
__author__  = "Philippe Blasi"
__version__ = "1.0"
__date__    = "2026-02-25"
__usage__   = """
User input : <value> [value...] where value:int is given in decimal
App output : show decimal, binary and hexa representation for all values"""
# ==============================================================================
from ezCLI import *
# ------------------------------------------------------------------------------
def dec2bin(value):
  """return the binary representation for a (decimal) integer"""
  if value == 0: # cas particulier du 0
    return "0B0"
  
  result = ""
  # define de used digits : "01"
  digits = "01"
  # succesively divide value by 2 until 0 is reached
  while value != 0:
    # each time, add the rest of the division to the string result
    rest = value % 2
    value = value // 2
    result = digits[rest] + result

  return "0B"+result
# ------------------------------------------------------------------------------
def dec2hex(value):
  """return the hexadecimal representation for a (decimal) integer"""
  if value == 0: # cas particulier du 0
    return "0X0"
  
  result = ""
  # define de used digits : "0123456789ABCDEF"
  digits = "0123456789ABCDEF"
  # succesively divide value by 16 until 0 is reached
  while value != 0:
    # each time, add the rest of the division to the string result
    rest = value % 16
    value = value // 16
    result = digits[rest] + result

  return "0X"+result
# ------------------------------------------------------------------------------
def parser(command):
  """parse 'command' into integers and apply binary/hexa conversion on them"""
  result = ""
  # recupérer les valeurs
  param = parse(command)

  if type(param) is tuple:  # cas pour plusieurs valeurs
    for val in param : # pour chaque valeur
      # vérifier que c'est un entier positif
      assert type(val) is int and val >= 0, "only positive integers are allowed"
      #   appeler dec2bin et dec2hex et construire la ligne de résultat
      #   utiliser une chaine formatée
      line = f"{val} = {dec2bin(val)} = {dec2hex(val)}\n"
      #   ajouter cette ligne au resultat final
      result = result + line

    return result.strip() # strip enlève le dernier \n

  # cas pour une seule valeur
  assert type(param) is int and param >= 0, "only positive integers are allowed"
  return f"{param} = {dec2bin(param)} = {dec2hex(param)}"
    
# ==============================================================================
if __name__ == "__main__":
  userloop(parser, "Enter <value> [value...]")
# ==============================================================================
