using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DxBlazorApplication2.AS400Kommunikation
{
    public class AS400Satzart
    {

        private string satzart;
        private Dictionary<string, int> namen;
        private List<AS400SocketField> felder;
        private AS400SocketSpecializedHandler handler;
        private AS400PreviewContainer container;
        public string Satzart 
        {
            get {  return satzart; }
        }

        public AS400Satzart(AS400Satzart sa)
        {
            satzart = sa.satzart;
            namen = sa.namen;
            felder = sa.felder;
            handler = sa.handler;
            // Achtung! Der Container (= Inhalt des aktuellen Satzes) müsste eigentlich kopiert werden
            // Da der aber bei jedem Empfang neu kreiert wird, passiert in der Kopie nichts
            container = sa.container;
        }

        public AS400Satzart(string Satzart, AS400SocketSpecializedHandler Handler)
        {
            satzart = Satzart;
            handler = Handler;
            container = null;

            namen = new Dictionary<string, int>();
            felder = new List<AS400SocketField>();

            /*            string[] zeilen = System.IO.File.ReadAllLines(@"D:\Test\H8240DS" + satzart + ".TXT", System.Text.Encoding.UTF7);
                        for (i1 = 2; i1 < zeilen.Length; i1++) // Ab Zeile 3 -> Überschrift und XXSART ignorieren
                        {
                            namen.Add(zeilen[i1].Substring(2, 8).Trim(), i1 - 2);
                            felder.Add(new LaPoSocketField(zeilen[i1]));
                        }
                        felder[0].Satzart = Satzart;
            */
        }

        public string Prefix()
        {
            if (felder == null) return null;
            if (felder.Count < 1) return null;
            return felder[0].Name.Substring(0, 2);
        }
        public void AddFeld(string zeile)
        {
            namen.Add(zeile.Substring(2, 8).Trim(), felder.Count);
            felder.Add(new AS400SocketField(zeile));
            felder[0].Satzart = satzart;
        }

        public void ZerlegeSatz(string line)
        {
            container = handler.ToPreviewContainer(line, felder);
        }
        public string GetString(string FeldName)
        {
            return container.GetField(namen[FeldName]).TrimEnd();
        }
        public double GetDouble(string FeldName)
        {
            return container.GetDoubleField(namen[FeldName]);
        }
        public DateTime GetDate(string FeldName)
        {
            return container.GetDateField(namen[FeldName]);
        }
        public DateTime GetTime(string FeldName)
        {
            return container.GetDateField(namen[FeldName]);
        }
        public void SetString(string FeldName, string Inhalt)
        {
            container.felder[namen[FeldName]] = Inhalt;
        }
        public void SetDouble(string FeldName, double Inhalt)
        {
            container.felder[namen[FeldName]] = Inhalt.ToString();
        }

        public void Clear()
        {
            int i1;
            container = new AS400PreviewContainer();
            for (i1 = 0; i1 < felder.Count; i1++)
            {
                if (felder[i1].Type == "S" || felder[i1].Type == "P")
                {
                    container.AddNextField("0");
                }
                else
                {
                    container.AddNextField("");
                }
            }
        }

        public AS400PreviewContainer Container
        {
            get
            {
                return container;
            }
        }
        public List<AS400SocketField> Felder
        {
            get
            {
                return felder;
            }
        }
    }
}
