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

namespace lkfxdok.LKF
{
    public class AkWarnResult
    {
        List<AkWarnResultAufenthalt> _aufenthaltListe;

        public AkWarnResult(LKFContextWithData context)
        {
            _aufenthaltListe = new List<AkWarnResultAufenthalt>();
            var aufenthaltCount = context.AufenthaltCount;
            for (uint i = 0; i< aufenthaltCount; i++)
            {
                var aufenthalt = context.GetAufenthalt(i);
                uint akwarncount = aufenthalt.AkWarnCount;
                if (akwarncount == 0)
                    continue;
                _aufenthaltListe.Add(new AkWarnResultAufenthalt(aufenthalt, i));
            }
        }

        public int AufenthaltCount
        {
            get
            {
                return _aufenthaltListe.Count;
            }
        }

        public IEnumerable<AkWarnResultAufenthalt> Aufenthalte
        {
            get
            {
                return _aufenthaltListe;
            }
        }

        public IEnumerable<AkWarnResultLine> AllLines
        {
            get
            {
                foreach (var aufenthalt in _aufenthaltListe)
                {
                    foreach (var line in aufenthalt.Lines)
                    {
                        yield return line;
                    }
                }
            }
        }

        public IEnumerable<AkWarnResultLine> NoHitLines
        {
            get
            {
                foreach (var aufenthalt in _aufenthaltListe)
                {
                    foreach (var line in aufenthalt.Lines)
                    {
                        if (line.HitCount == 0)
                            yield return line;
                    }
                }
            }
        }
    }

    public class AkWarnResultLine
    {
        public readonly uint HitCount;
        public readonly string Line;
        public readonly AkWarnResultAufenthalt Aufenthalt;
        public readonly LKFAufenthaltAkWarn C;
        public AkWarnResultLine (AkWarnResultAufenthalt resultAufenthalt, LKFAufenthaltAkWarn akwarn)
        {
            Aufenthalt = resultAufenthalt;
            HitCount = akwarn.HitCount;
            Line = akwarn.Line;
            C = akwarn;
        }
    }

    public class AkWarnResultAufenthalt {

        List<AkWarnResultLine> _akwarnlines;
        public readonly LKFAufenthalt C;
        public readonly uint Index;
        public AkWarnResultAufenthalt (LKFAufenthalt aufenthalt, uint index)
        {
            C = aufenthalt;
            Index = index;
            _akwarnlines = new List<AkWarnResultLine>();
            uint count = aufenthalt.AkWarnCount;
            for (uint i = 0; i < count; i++)
            {
                _akwarnlines.Add(new AkWarnResultLine(this, aufenthalt.GetAkWarn(i)));
            }
        }

        public int AkWarnCount
        {
            get
            {
                return _akwarnlines.Count;
            }
        }

        public IEnumerable<AkWarnResultLine> Lines
        {
            get
            {
                return _akwarnlines;
            }
        }
    }
}
