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

namespace test.LKF
{
    using lkfxdok.c;
    using lkfxdok.LKF;
    using lkfxdok.LKF.errors;

    public class AufenthaltTest
    {
        public void Run(int modelljahr)
        {

            Controller.DataPath = "C:\\lkf\\";

            var _context = new Context();

            try
            {
                _context.Modelljahr = modelljahr;
                _context.ContextFlags = ContextFlag.Flag7;
                _context.ContextFlags |= ContextFlag.UTF8;
            }
            catch (LKFException ex)
            {
                Console.WriteLine(ex.Message);
            }


            var aufenthalt1 = new Aufenthalt("X01|K714|1234||20190621|1200|S|19360501|80|M|AT|AT|1010|90101|A|P||||E|20190621|1200|11|J|0");
            new Abteilung(aufenthalt1, "X02|K714|1234||20190621|01|11111100|20190621||J||||||N|80|");
            new Leistung (aufenthalt1, "X04|K714|1234||20190621|BG020||J|0001|20190621|2024|18111600|");
            new Diagnose(aufenthalt1, "X03|K714|1234||20190621|I51.9|H|D||");
            new Diagnose(aufenthalt1, "X03|K714|1234||20190621|R53|Z|D||");

            aufenthalt1.PlausCheck(_context);
            aufenthalt1.Scoring(_context);

            var aufenthalt4 = new Aufenthalt("X01|K201|345||20170301|1749|I|20060701|10|M|AT|AT|9363|20518|||||||||56|J|2");
            new Abteilung(aufenthalt4, "X02|K201|345||20170301|001|16111100|20170301|1749|J||||||N|10|");
            new Abteilung(aufenthalt4, "X02|K201|345||20170301|001|16111100|20170301|1749|J||||||N|10|");
            new Diagnose(aufenthalt4, "X03|K201|345||20170301|S61.0|Z|D||");
            new Diagnose(aufenthalt4, "X03|K201|345||20170301|929.9|Z|D||");
            new Diagnose(aufenthalt4, "X03|K201|345||20170301|Z00.0|H|D||");
            new Leistung(aufenthalt4, "X04|K201|345||20170301|AJ040||J|1|20170301|1822|16221100||");
            new Leistung(aufenthalt4, "X04|K201|345||20170301|QZ760||J|1|20170301|1722|16221100||");
            var aw = new AkWarn(aufenthalt4, "X06|K201|345||20170301|002:AJ040|WX3P|BDGR0 accepted");

            Console.WriteLine("WERT = {0}, CODE = {1}, KOMMENTAR = {2}", aw.Wert, aw.ErrorCode, aw.Kommentar);


            foreach (var i in aufenthalt1.Issues)
            {
                Console.WriteLine(string.Format("{0} ({1}): {2}", i.ErrorCode, i.Value, i.ErrorText));
            }

            var res = aufenthalt1.Result;
            Console.WriteLine(string.Format("{0}/{1}: GRUPPE={2}, KNOTEN={3}, PUNKTE={4}", aufenthalt1.KANR, aufenthalt1.AUFNR, res.GRUPPE, res.KNOTEN, res.GESAMT));



            //          "X01|K714|1234||20190621|1200|S|19360601|80|W|AT|AT|1010|90101|A|P||||E|20190621|1200|11|J|0",
            //      "X02|K714|1234||20190621|01|11111100|20190621||J||||||N|80|",
            //              "X03|K714|1234||20190621|I51.9|H|D||",
            //      "X03|K714|1234||20190621|901.9|Z|D||11111100||Z1",
            //      "X03|K714|1234||20190621|929.9|Z|D||11211100||Z2"


            var aufenthalt2 = new Aufenthalt() { AufDat = "20190621", AufZeit = "1200", Behandlungsart = "S", GebDat = "19360601", Geschlecht = "W", STAATB = "AT", STAATW = "AT", PLZW = "1020", GEMCO = "90101", AUFART1 = "A", AUFART2 = "P", ENTART = "E", ENTDAT = "20190621", ENTZEIT = "1200", LEIST_KOST = "11", RELEVANZ = "J" };
            new Abteilung(aufenthalt2) { DATUM = "20190202", ABTPOS = "001", ABTFC = "11111100" };
            new Abteilung(aufenthalt2) { DATUM = "20190202", ABTPOS = "002", ABTFC = "11111100" };
            new Diagnose(aufenthalt2) { DIAG = "I51.9", DIAGART = "D", DIAGTYP = "H" };
            new Diagnose(aufenthalt2) { DIAG = "901.9", DIAGART = "D", DIAGTYP = "Z" };
            new Leistung(aufenthalt2) { MEL = "HB520", MELANZ = "1", DATUM = "20190203", RELEVANZ = "J" };
            new AkWarn(aufenthalt2) { ErrorCode = "WX4W", Wert = "002:HB520" };
            aufenthalt2.KANR = "K901";
            aufenthalt2.AUFNR = "12345678";
            aufenthalt2.AufDat = "20190202";

            aufenthalt2.PlausCheck(_context);
            aufenthalt2.Scoring(_context);

            foreach (var a in aufenthalt2.Lines)
            {
                Console.WriteLine(a);
            }

            foreach (var i in aufenthalt2.Issues)
            {
                Console.WriteLine(string.Format ("{0} ({1}): {2}", i.ErrorCode, i.Value, i.ErrorText));
            }

            res = aufenthalt2.Result;
            Console.WriteLine(string.Format("{0}/{1}: GRUPPE={2}, KNOTEN={3}, PUNKTE={4}", aufenthalt2.KANR, aufenthalt2.AUFNR, res.GRUPPE, res.KNOTEN, res.GESAMT));

            var aufenthalt3 = new Aufenthalt("20190202", "19450101", "W", "20190209");
            aufenthalt3.AddAbteilung(new Abteilung("11111101", null));
            aufenthalt3.AddDiagnose(new Diagnose("I51.9", true));
            aufenthalt3.AddDiagnose(new Diagnose("R53", false));
            aufenthalt3.AddLeistung(new Leistung("HB520", "20190204", null));

            var l = aufenthalt2.GetLeistung(0);
            var l2 = aufenthalt2.GetLeistung(3);
            aufenthalt3.AddLeistung(l);

            aufenthalt3.PlausCheck(_context);
            aufenthalt3.Scoring(_context);

            foreach (var a in aufenthalt3.Lines)
            {
                Console.WriteLine(a);
            }

            foreach (var i in aufenthalt3.Issues)
            {
                Console.WriteLine(string.Format("{0} ({1}): {2}", i.ErrorCode, i.Value, i.ErrorText));
            }

            res = aufenthalt3.Result;
            Console.WriteLine(string.Format("{0}/{1}: GRUPPE={2}, KNOTEN={3}, PUNKTE={4}", aufenthalt3.KANR, aufenthalt3.AUFNR, res.GRUPPE, res.KNOTEN, res.GESAMT));

        }
    }
}
