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

namespace lkfxdok.LKF.KA
{
    public class LineType
    {
        char _typeCharacter;
        SortedDictionary<int, LineSatzart> _lines;

        internal LineType (char typeCharacter)
        {
            _typeCharacter = typeCharacter;
            _lines = new SortedDictionary<int, LineSatzart>();
        }

        public char TypeCharacter
        {
            get
            {
                return _typeCharacter;
            }
        }

        public LineSatzart this[int typeNumber]
        {
            get
            {
                LineSatzart satzart;
                if (_lines.TryGetValue (typeNumber, out satzart))
                {
                    return satzart;
                }
                return null;
            }
        }

        public int LineCount
        {
            get
            {
                int lineCount = 0;
                foreach (var satzart in _lines.Values)
                {
                    lineCount += satzart.LineCount;
                }
                return lineCount;
            }
        }

        public IEnumerable<LKFLine> All
        {
            get
            {
                foreach (var v in _lines.Values)
                {
                    foreach (var l in v.Lines) yield return l;
                }
            }
        }

        public bool HasSatzart (int typeNumber)
        {
            return _lines.ContainsKey(typeNumber);
        }

        public LineSatzart GetSatzart (int typeNumber)
        {
            LineSatzart satzart;
            if (_lines.TryGetValue(typeNumber, out satzart))
                return satzart;
            return null;
        }

        protected virtual LineSatzart CreateSatzart(int typeNumber)
        {
            return new LineSatzart(this, typeNumber);
        }

        internal LineSatzart GetSatzartInternal (int typeNumber)
        {
            LineSatzart satzart;
            if (_lines.TryGetValue(typeNumber, out satzart))
                return satzart;
            satzart = CreateSatzart(typeNumber);
            _lines.Add(typeNumber, satzart);
            return satzart;
        }

    }
}
