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

using lkfxdok.c;

namespace lkfxdok.LKF.ic
{
    public enum IntContextField : uint
    {
        AUFNR = 0,
        ABTPOS = 1,
        ABTFC = 2,
        ERHEBDAT = 3,
        SCORE = 4,
        AUFID64 = 13,
        LINEID = 6,
        LINE = 7,
        AUFDAT = 40
    }

    public class IntContext
    {
        LKFIntContext _intContext;
        Dictionary<string, IntAufenthalt> _aufenthalte;

        internal IntContext (Context context, LKFIntContext intContext)
        {
            _intContext = intContext;

            var count = _intContext.GetIntAufenthaltCount();
            _aufenthalte = new Dictionary<string, IntAufenthalt>();
            for (uint i = 0; i < count; i++)
            {
                var abt = new IntAbteilung(this, i);
                IntAufenthalt aufenthalt;
                if (_aufenthalte.TryGetValue (abt.AUFKey, out aufenthalt))
                {
                    aufenthalt.Add(abt);
                }
                else
                {
                    _aufenthalte.Add(abt.AUFKey, new IntAufenthalt(abt));
                }
            }
        } 

        internal string GetICData (uint index, IntContextField field)
        {
            return _intContext.GetIntAufenthaltField(index, (uint)field);
        }

        internal string GetSAPSData(uint index, uint sapsIndex, IntContextField field)
        {
            if (_intContext.GetIntAufenthaltSAPSCount (index) > 0)
            {
                return _intContext.GetIntAufenthaltSAPSField(index, 0, (uint)field);
            }
            return "";
        }

        internal int GetIntSAPSData (uint index, uint sapsIndex, IntContextField field)
        {
            var s = GetSAPSData(index, sapsIndex, field);
            if (!string.IsNullOrEmpty(s))
            {
                try
                {
                    return int.Parse(s);
                }
                catch
                {
                    return 0;
                }
            }
            return 0;
        }

        internal uint GetSAPSCount (uint index)
        {
            return _intContext.GetIntAufenthaltSAPSCount(index);
        }

        internal int GetIntIcData (uint index, IntContextField field)
        {
            var s = GetICData(index, field);
            if (!string.IsNullOrEmpty (s))
            {
                try
                {
                    return int.Parse(s);
                }
                catch
                {
                    return 0;
                }
            }
            return 0;
        }

        public IntAufenthalt GetIntAufenthalt (Aufenthalt aufenthalt)
        {
            IntAufenthalt intAufenthalt;
            if (aufenthalt != null && (_aufenthalte.TryGetValue (aufenthalt.AUFNR + '.' + aufenthalt.AufDat, out intAufenthalt) || _aufenthalte.TryGetValue(aufenthalt.BMID + '.' + aufenthalt.AufDat, out intAufenthalt))) {
                return intAufenthalt;
            }
            return null;
        }
    }
}
