using DevExpress.Blazor.Internal.ComponentStructureHelpers;
using DevExpress.Data.Helpers;
using System.Collections.Generic;
using System.Drawing;

namespace DxBlazorApplication2.AS400Kommunikation
{
    public class AS400Connector : IDisposable
    {
        private string aktSatzart = null;
        private string line;
        private AS400SocketSpecializedHandler handler;
        private Dictionary<string, AS400Satzart> saHandler;

        public AS400Connector()
        {
            handler = null;
            saHandler = null;
        }
        public AS400Connector(string programmNummer)
        {
            Open(programmNummer);
        }
        public bool Open(string programmNummer)
        {
            handler = new AS400SocketSpecializedHandler(programmNummer, null, false, "*TEMP");
            saHandler = new Dictionary<string, AS400Satzart>();

            // Satzarten erzeugen
            while (true)
            {
                line = handler.ReadLine();
                if (line.Substring(0, 2) == "01")
                {
                    aktSatzart = line.Substring(2, 2);
                    saHandler.Add(aktSatzart, new AS400Satzart(aktSatzart, handler));
                }
                else if (line.Substring(0, 2) == "02")
                {
                    // extractField knallt wenn der Text fehlt...
                    saHandler[aktSatzart].AddFeld(line.PadRight(24));
                }
                else break;
            }
            return Connected;
        }

        public void Dispose()
        {
            Close();
        }

        public void Close()
        {
            if (handler != null)
            {
                handler.closeConnection();
                handler = null;
            }
        }

        public bool Connected
        {
            get
            {
                if (handler == null)
                    return false;
                return handler.Connected;
            }
        }

        // Gibt eine Kopie des aktuellen Satzes zurück
        public AS400Satzart AktSatz()
        {
            if (saHandler.ContainsKey(aktSatzart))
                return new AS400Satzart(saHandler[aktSatzart]);
            return null;
        }
        // Gibt eine Kopie der gewünschten Satzart zurück
        public AS400Satzart Satz(string satzart)
        {
            if (saHandler.ContainsKey(satzart))
                return new AS400Satzart(saHandler[satzart]);
            return null;
        }

        public void WriteLine(string line)
        {
            handler.WriteLine(line);
        }

        public void WriteSatz()
        {
            handler.WriteLineA(saHandler[aktSatzart].Container, saHandler[aktSatzart].Felder);
        }


        public string ReadLine()
        {
            line = handler.ReadLine();
            aktSatzart = line.Substring(0, 2);
            if (saHandler.ContainsKey(aktSatzart))
                saHandler[aktSatzart].ZerlegeSatz(line);
            return aktSatzart;
        }
        public string Line
        {
            get
            {
                return line;
            }
        }

        public string Satzart
        {
            get
            {
                return aktSatzart;
            }
            set
            {
                aktSatzart = value;
            }
        }
        public string Prefix
        {
            get
            {
                return saHandler[aktSatzart].Prefix();
            }
        }
        public string GetString(string feldName)
        {
            return saHandler[aktSatzart].GetString(feldName);
        }
        public double GetDouble(string feldName)
        {
            return saHandler[aktSatzart].GetDouble(feldName);
        }
        public DateTime GetDate(string feldName)
        {
            return saHandler[aktSatzart].GetDate(feldName);
        }
        public DateTime GetTime(string feldName)
        {
            return saHandler[aktSatzart].GetTime(feldName);
        }
        public void Clear(string satzart)
        {
            aktSatzart = satzart;
            saHandler[aktSatzart].Clear();
        }
        public void SetString(string feldName, string inhalt)
        {
            saHandler[aktSatzart].SetString(feldName, inhalt);
        }
        public void SetDouble(string feldName, double inhalt)
        {
            saHandler[aktSatzart].SetDouble(feldName, inhalt);
        }
    }
}
