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

using lkfxdok.c;

namespace test.C
{
    public class FileTest
    {
        int _modellJahr;
        int _abrechJahr;
        string _fileName;

        LKFContextWithData _context;

        public FileTest (int modell, int abr, string fileName)
        {
            _modellJahr = modell;
            _abrechJahr = abr;
            _fileName = fileName;
        }

        public void RunStat()
        {
            LKFController.DataPath = "C:\\lkf\\";
            _context = new LKFContextForStat();

            try
            {
                _context.Flags = (int) LKFContextFlags._Optimizer;
                _context.Abrechnungsjahr = _abrechJahr;
            }
            catch (LKFException ex)
            {
                Console.WriteLine(ex.Message);
                return;
            }
            _context.LoadFile(_fileName);
            uint aufenthaltCount = _context.AufenthaltCount;
            Console.WriteLine("Aufenthalte: {0}", aufenthaltCount);
            _context.PlausCheck();
            _context.Scoring();
            _context.WriteFile(LKFContextFileType.Stat, "C:\\LKF\\out\\stat.txt");
            var aufenthalt = _context.GetAufenthalt(0);
            Console.WriteLine(String.Format("{0} Belagstage.", aufenthalt.GESBD));
        }

        public void RunCase()
        {

            LKFController.DataPath = "C:\\lkf\\";
            var context = new LKFContextWithData();

            try
            {
                //context.Flags = 262144;
                context.Modelljahr = 2024;
                context.Abrechnungsjahr = 2024;
            }
            catch (LKFException ex)
            {
                Console.WriteLine(ex.Message);
                return;
            }

            string[] testcase = {
           "X01|K901|123||20240101|0931|S|19560101|65|W|AT|AT|1020|90201|A|P||||S|20240101|0800|40|J|2|",
        "X02|K901|123||20240101|001|12718111|20240101|0931||20240101|0900|3|12718111|12718111|N|65||",
        "X03|K901|123||20240101|T78.2|H||||",
        "X03|K901|123||20240101|999.9|Z||||",
        "X03|K901|123||20240101|D25.0|Z||||",
        "X03|K901|123||20240101|N95.0|Z||||",
        "X04|K901|123||20240101|JK010||J|1|20240101||16319511|||",
        "X05|K901|123||20240101||||||||||||",
        "I11|K901|123||20240101|001|20240101|00|0|0|0|0|6|0|0|0|0|0|0|2||||14|1|1|1|1||000000000000000000000||0||||||000|5|",
        "I12|K901|123||20240101|001|20240101|1|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|"
  };

            foreach (var t in testcase)
            {
                context.AddLine(t);
            }
            uint aufenthaltCount = context.AufenthaltCount;
            Console.WriteLine("Aufenthalte: {0}", aufenthaltCount);

            String errorText;
            int ret = context.PlausCheck(out errorText);

            if (ret != 0)
            {
                Console.WriteLine(errorText);
            }

            context.Scoring();

            var aufenthalt = context.GetAufenthalt(0);
            Console.WriteLine(aufenthalt.LineRESULT);
            int[] fields = { 2, 4, 5 };
            context.WriteCSVFile (fields, "c:\\LKF\\out.csv");


            var firstError = aufenthalt.FirstError;
            if (firstError != null)
            {
                Console.WriteLine(firstError.Code + ":" + firstError.FeldLang + ", " + firstError.Text);
            }

            aufenthalt.AddLine("X06|K303|2024000017||20240124|001:24.01.2024|WI3G|test");

            var akwarn = aufenthalt.GetAkWarn(0);
            Console.WriteLine(akwarn.Line);

            context.PlausCheck();
            context.Scoring();

            firstError = aufenthalt.FirstError;
            if (firstError != null)
            {
                Console.WriteLine(firstError.Code + ":" + firstError.FeldLang + ", " + firstError.Text);
            }

            Console.WriteLine("ENDE");
        }

        public void RunNP ()
        {
            LKFController.DataPath = "C:\\lkf\\";

            _context = new LKFContextWithData();

            try
            {
                _context.Modelljahr = _modellJahr;
                _context.Abrechnungsjahr = _abrechJahr;
                _context.Flags = (int) LKFContextFlags.NPPlaus;
            }
            catch (LKFException ex)
            {
                Console.WriteLine(ex.Message);
                return;
            }

            _context.LoadFile(_fileName);
            uint aufenthaltCount = _context.AufenthaltCount;

            Console.WriteLine("Aufenthalte: {0}", aufenthaltCount);
            _context.PlausCheck();
            _context.Scoring();

            var npcontext = _context.NeoPaed();

            npcontext.WriteWarningFile("C:\\LKF\\out\\npwarning.txt", true);
            npcontext.WriteProtokollFile("C:\\LKF\\out\\npprotocol.txt");
            npcontext.WriteAbtFile("C:\\LKF\\out\\npabtsum.txt", true, true, true);

        }

        public void Run (int flags = 0)
        {
            String s = LKFController.Version;
            Console.WriteLine(string.Format("LKFXDOK Version: {0}", s));

            LKFController.DataProvider = new lkfxdok.c.LKFDataProvider(new DataProvider());

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

            _context = new LKFContextWithData();

            try
            {
                _context.Modelljahr = _modellJahr;
                _context.Abrechnungsjahr = _abrechJahr;
                _context.Flags = flags;
            }
            catch (LKFException ex)
            {
                Console.WriteLine(ex.Message);
                return;
            }

            _context.LoadFile(_fileName);

            _context.EnableDebugTrace();

            uint aufenthaltCount = _context.AufenthaltCount;

            Console.WriteLine("Aufenthalte: {0}", aufenthaltCount);

            _context.PlausCheck();
            _context.Scoring();
            _context.IntScoring();

            _context.WriteFile(LKFContextFileType.Error, "C:\\LKF\\out\\dotneterrors.txt");
            _context.WriteFile(LKFContextFileType.Warning, "C:\\LKF\\out\\dotnetwarnings.txt");
            _context.WriteFile(LKFContextFileType.Result, "C:\\LKF\\out\\result.txt");
            /*
            for (uint i = 0; i < aufenthaltCount; i++)
            {
                var aufenthalt = _context.GetAufenthalt(i);
                Console.WriteLine(string.Format("{0}-{1}: {2}/{3}{4}: {5}", aufenthalt.KANR, aufenthalt.AUFNR, aufenthalt.PlausFlag, aufenthalt.GRUPPE, aufenthalt.KNOTEN, aufenthalt.GesamtPunkte));
            }
            */
            /*
                var lineCount = aufenthalt.OutputLineCount;
                for (var j = 0; j < lineCount; j++)
                {
                    Console.WriteLine(aufenthalt.GetOutputLine(j));
                }

                if (aufenthalt.IsOptimizable)
                {
                    var subgruppeCount = aufenthalt.SubgruppeCount;
                    if (subgruppeCount > 1)
                    {
                        for (uint j = 0; j < subgruppeCount; j++)
                        {
                            var subgruppe = aufenthalt.GetSubgruppe(j);
                            Console.WriteLine(string.Format("     {0}{1}: {2}", subgruppe.GRUPPE, subgruppe.KNOTEN, subgruppe.Punkte));
                        }
                    }
                }
            }*/
        }

        public LKFContextWithData Context
        {
            get
            {
                return _context;
            }
        }
    }
}
