using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;
using System.IO;

namespace LLNet.GUI
{
    public class ISOMsg
    {
        #region "variables privadas"
        /// <summary>
        /// Este hash table se usa para almacenar el mensaje 
        /// ISO8583Xml decodificado. 
        /// De esta forma:
        /// key: identificador del campo (0 a 64)
        /// Contenido: Valor en ASCII del campo
        /// </summary>
        private Hashtable hshTable;
        #endregion

        #region "constructores"
        /// <summary>
        /// Este constructor es generico, para instanciar el hashTable
        /// </summary>
        public ISOMsg()
        {
            hshTable = new Hashtable();
        }
        #endregion

        #region "propiedades"
        /// <summary> Almacena el valor del campo ISO8583 XML
        /// </summary>
        /// <param name="id">Id del campo ISO8583</param>
        /// <param name="value">Contenido del campo en formato ASCII</param>
        public void setString(int id, string value)
        {
            try
            {
                hshTable.Add(id, value);
            }
            catch (Exception ex)
            {

            }
        }

        /// <summary> Obtiene el valor del campo ISO8583 XML
        /// </summary>
        /// <param name="id">Id del campo ISO8583</param>
        /// <returns>Contenido del campo en formato ASCII</returns>
        public string getString(int id)
        {
            try
            {
                return (hshTable.ContainsKey(id) ? hshTable[id].ToString() : "");
            }
            catch (Exception ex)
            {
                return "";
            }
        }
        #endregion

        #region "funciones publicas"

        /// <summary> Valida si el campo existe en la trama
        /// </summary>
        /// <param name="id">Id del campo ISO8583</param>
        /// <returns>true: existe , false: no existe</returns>
        public Boolean hasField(int id)
        {
            try
            {
                return (hshTable.ContainsKey(id));
            }
            catch (Exception ex)
            {
                return false;
            }
        }

        /// <summary> Returna un string con el mensaje ISO8583 XML
        /// </summary>
        /// <returns>string: Mensaje ISO8583</returns>
        public string toString()
        {
            try
            {
                StringBuilder sb = new StringBuilder();
                sb.Append("<isomsg>" + Convert.ToChar(0x0d) + Convert.ToChar(0x0a));
                for (int i = 0; i < 65; i++)
                {
                    if (hasField(i))
                    {
                        sb.Append("  <field id=" + "\"" + i.ToString() + "\" value=\"" + getString(i) + "\"/>" + Convert.ToChar(0x0d) + Convert.ToChar(0x0a));
                    }
                }
                sb.Append("</isomsg>" + Convert.ToChar(0x0d) + Convert.ToChar(0x0a));
                return sb.ToString();
            }
            catch (Exception ex)
            {
                return "";
            }

        }

        /// <summary> Desempaqueta el mensaje ISO8583 XML
        /// </summary>
        /// <param name="XMLString">Mensaje ISO8583 XML</param>
        /// <returns></returns>
        public static ISOMsg unpack(string XMLString)
        {
            ISOMsg m = new ISOMsg();
            try
            {
                StringReader strReader = new StringReader(XMLString);
                string element = "";
                int id = 0;
                string value = "";
                int index1, index2, index3, index4 = 0;
                while (true)
                {
                    element = strReader.ReadLine();
                    if (element != null)
                    {
                        if (!(element.IndexOf("isomsg") > 0))
                        {
                            index1 = element.IndexOf('"', 1);
                            index2 = element.IndexOf('"', index1 + 1);
                            id = int.Parse(element.Substring(index1 + 1, index2 - (index1 + 1)));
                            index3 = element.IndexOf('"', index2 + 1);
                            index4 = element.IndexOf('"', index3 + 1);
                            value = element.Substring(index3 + 1, index4 - (index3 + 1));
                            m.setString(id, value);
                        }
                    }
                    else
                    {
                        break;
                    }
                }
                return m;
            }
            catch (Exception ex)
            {
                return null;
            }

        }

        #endregion
    }
}
