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

namespace lkfxdok.LKF
{

    /*
    const SATZART X04Satzart = {"X04", 0, 13, 13, (const int *) &x01_ident, "X04", 0, {
    {GEN_KANR,              TYP_ALPHA,   4, 20, 0, 0, "KANR"},
    {GEN_AUFNR,             TYP_ALPHA,  24, 12, 0, 0, "AUFNR"},
    {X01_DATENSATZID,       TYP_ALPHA,  36, 64, 0, 0, "DATENSATZ-ID"},
    {X01_AUFNAHMEDATUM,     TYP_ALPHA, 100,  8, 0, 0, "AUFNAHME-DATUM"},
    {X04_MEL,               TYP_ALPHA, 108, 10, 0, 0, "MEL"},
    {X04_SEITE,             TYP_ALPHA, 113,  1, 0, 0, "SEITE"},
    {X04_ABRECHNUNGSRELEVANZ, TYP_ALPHA, 114,1, 0, 0, "ABRECHNUNGSRELEVANZ"},
    {X04_ANZAHL,            TYP_NUM,   115,  7, 0, 0, "ANZAHL"},
    {X04_DATUM,             TYP_ALPHA, 122,  8, 0, 0, "LEISTUNG-DATUM"},
    {X04_UHRZEIT,           TYP_ALPHA, 130,  4, 0, 0, "LEISTUNG-ZEIT"},
    {X04_FCLEIST,           TYP_NUM,   134,  8, 0, 0, "ABTFC LEISTUNGSERBRINGEND"},
    {X04_KALEIST,           TYP_ALPHA, 142,  6, 0, 0, "KANR  LEISTUNGSERBRINGEND"},
    {X04_AUFNAHME_FUCO,     TYP_ALPHA, 148, 12, 0, 0, "AUFNAHMEZAHL - FUNKTIONSCODEBEZOGEN"}
*/

    public class Leistung : AufenthaltChildData
    {

        public enum LeistungPos : int { MEL = 5, SEITE = 6, RELEVANZ = 7, MELANZ = 8, DATUM = 9, ZEIT = 10, FCLEIST = 11, KALEIST = 12, AUFNRFUCO = 13 };

        public Leistung (Aufenthalt aufenthalt) : base (aufenthalt, "X04")
        {
            aufenthalt._AddLeistung(this);
        }

        internal Leistung(Aufenthalt aufenthalt, string line, uint pos) : base (aufenthalt, line)
        {
            _lastSyncIndex = (int)pos;
        }

        public Leistung(Aufenthalt aufenthalt, string line) : base(aufenthalt, line, "X04")
        {
            aufenthalt._AddLeistung(this);
        }

        public Leistung (string mel, string datum, string seite) : base (null, "X04")
        {
            MEL = mel;
            MELANZ = "1";
            DATUM = datum;
            ZEIT = "1200";
            SEITE = seite;
            RELEVANZ = "J";
        }

        public string MEL
        {
            get
            {
                return _line[(int)LeistungPos.MEL];
            }
            set
            {
                _line[(int)LeistungPos.MEL] = value;
            }
        }

        public string SEITE
        {
            get
            {
                return _line[(int)LeistungPos.SEITE];
            }
            set
            {
                _line[(int)LeistungPos.SEITE] = value;
            }
        }

        public string MELANZ
        {
            get
            {
                return _line[(int)LeistungPos.MELANZ];
            }
            set
            {
                _line[(int)LeistungPos.MELANZ] = value;
            }
        }

        public string RELEVANZ
        {
            get
            {
                return _line[(int)LeistungPos.RELEVANZ];
            }
            set
            {
                _line[(int)LeistungPos.RELEVANZ] = value;
            }
        }

        public string DATUM
        {
            get
            {
                return _line[(int)LeistungPos.DATUM];
            }
            set
            {
                _line[(int)LeistungPos.DATUM] = value;
            }
        }

        public string ZEIT
        {
            get
            {
                return _line[(int)LeistungPos.ZEIT];
            }
            set
            {
                _line[(int)LeistungPos.ZEIT] = value;
            }
        }

        public string FCLEIST
        {
            get
            {
                return _line[(int)LeistungPos.FCLEIST];
            }
            set
            {
                _line[(int)LeistungPos.FCLEIST] = value;
            }
        }

        public string KALEIST
        {
            get
            {
                return _line[(int)LeistungPos.KALEIST];
            }
            set
            {
                _line[(int)LeistungPos.KALEIST] = value;
            }
        }

        public string AUFNRFUCO
        {
            get
            {
                return _line[(int)LeistungPos.AUFNRFUCO];
            }
            set
            {
                _line[(int)LeistungPos.AUFNRFUCO] = value;
            }
        }

        internal c.LKFAufenthaltMEL cMEL
        {
            get
            {
                var aufenthalt = Aufenthalt;
                if (aufenthalt != null && aufenthalt.Synchronized && _lastSyncIndex >= 0)
                {
                    return aufenthalt.C.GetMEL((uint)_lastSyncIndex);
                }
                return null;
            }
        }

        public string MELLDFGruppe
        {
            get
            {
                var cmel = this.cMEL;

                if (cmel != null)
                {
                    return cmel.MELLDFGruppe;
                }
                return "";
            }
        }

        public string MELLDFKnoten
        {
            get
            {
                var cmel = this.cMEL;

                if (cmel != null)
                {
                    return cmel.MELLDFKnoten;
                }
                return "";
            }
        }

        public string MELLDFRelevant
        {
            get
            {
                var cmel = this.cMEL;

                if (cmel != null)
                {
                    return cmel.MELLDFRelevant;
                }
                return "";
            }
        }

        public string MELLDFPunkteString
        {
            get
            {
                var cmel = this.cMEL;

                if (cmel != null)
                {
                    return cmel.MELLDFPunkte;
                }
                return "";

            }
        }

        public double MELLDFPunkte
        {
            get
            {
                var cmel = this.cMEL;

                if (cmel != null)
                {
                    try
                    {
                        var s = cmel.MELLDFPunkte;
                        if (!string.IsNullOrEmpty(s))
                            return Convert.ToDouble(cmel.MELLDFPunkte, CultureInfo.InvariantCulture.NumberFormat);
                        return 0;
                    }
                    catch
                    {
                        return 0;
                    }
                }
                return 0;
            }
        }

        protected override int OfficialFieldCount
        {
            get
            {
                return 14;
            }
        }

        public string MELPOS
        {
            get
            {
                var cmel = this.cMEL;

                if (cmel != null)
                {
                    return cmel.MELPOS;
                }

                if (_line.ElementCount >= 15)
                {
                    return _line[14];
                }

                return "";
            }
        }
    }
}
