#pragma once

using namespace System;
using namespace System::Runtime::InteropServices;

#include "LKFContext.h"

namespace lkfxdok {
	namespace c {

		public enum class LKFAufenthaltScorField : int {Unused0, PlausFlag, KANR, AUFNR, GEBDAT, Alter, Geschlecht, StaatWohnsitz, Staatsbuergerschaft, PLZ, 
			                                            AUFART, NeonatFlag, Altersgruppe, AUFID, GesamtVerweildauer, ENTART, ENTDAT, Hauptdiagnose, Unused18, Unused19, 
														KOST, Gruppe, Knoten, VDU, VDO, VDMW, LDFPTK, LDFPLK, SCUTK, SCULK,
														VDZU, INTZU, MELZU, SCSPEZ, SCGES, LKFPK, SCUK, MELANZ, ENTABT, AUFABT, 
														AUFDAT, SCGES_INLKF, SCGES_EXLKF, SCUTK_TKL, SCGES_TKL, SCGES_INLKF_TKL, SCGES_EXLKF_TKL, LKA, SCUKT_NOTKL,
														MaxSubIndex = 95, MaxMelIndex = 96, TKLMEL = 97, NR = 98, Mark = 99};


		ref class LKFAufenthaltDiagnose;
		ref class LKFAufenthaltMEL;
		ref class LKFAufenthaltAbteilung;
		ref class LKFAufenthaltSubgruppe;
		ref class LKFAufenthaltIntLine;
		ref class LKFAufenthaltAkWarn;
		ref class LKFAufenthaltError;
		ref class LKFAufenthaltWarning;
		ref class LKFAufenthaltInfo;
		ref class LKFAufenthaltMeldeDiag;

		public ref class LKFAbtScoring {
			double _lp;
			double _kp;
		internal:
			LKFAbtScoring(double lp, double kp);

		public:
			property double LP {
				double get(void);
			}

			property double KP {
				double get(void);
			}
		};

		public ref class LKFAufenthalt
		{
		internal:
			LKFContextWithData ^_contextWithData;
			LKFContext ^_plausContext;
			void *_aufenthaltPtr;

		internal:
			LKFAufenthalt(LKFContextWithData^ context, void *aufenthaltPtr);

		public:

			LKFAufenthalt(LKFContext ^context);
			void AttachToContext(LKFContextWithData ^context);

			!LKFAufenthalt();
			~LKFAufenthalt();

			property int OutputLineCount {
				int get(void);
			}
			String ^GetOutputLine(int i);

			property String ^Ident {
				String ^get(void);
			}

			property int Differences {
				int get(void);
			}

			property unsigned int AbtCount {
				unsigned int get(void);
			}

			property unsigned int HDiagCount {
				unsigned int get(void);
			}

			property unsigned int ZDiagCount {
				unsigned int get(void);
			}

			property unsigned int DiagCount {
				unsigned int get(void);
			}

			property unsigned int MELCount {
				unsigned int get(void);
			}

			property unsigned int IntensivCount {
				unsigned int get(void);
			}

			property unsigned int AkWarnCount{
				unsigned int get(void);
			}

			property bool Select {
				bool get(void);
				void set(bool);
			}

			property LKFAufenthaltError ^FirstError {
				LKFAufenthaltError ^get(void);
			}

			property LKFAufenthaltMeldeDiag ^FirstMeldeDiag {
				LKFAufenthaltMeldeDiag ^get(void);
			}

			property unsigned int SubgruppeCount {
				unsigned int get(void);
			}

			property bool IsOptimizable {
				bool get(void);
			}

			LKFAufenthaltAbteilung ^GetAbteilung(unsigned int index);
			LKFAufenthaltDiagnose ^GetDiagnose(unsigned int index);
			LKFAufenthaltMEL ^GetMEL(unsigned int index);
			LKFAufenthaltSubgruppe ^GetSubgruppe(unsigned int index);
			LKFAufenthaltAkWarn ^GetAkWarn(unsigned int index);
			LKFAufenthaltIntLine ^GetIntLine(unsigned int index);

			void ClearData(void);
			void AddLine(String ^line);

			property String ^Line {
				String ^get(void);
			}

			property String ^LineKOST {
				String ^get(void);
			}

			property String ^LineKOMMENTAR {
				String ^get(void);
			}

			property String ^LineRESULT {
				String ^get(void);
			}

			String ^GetFieldValue(LKFAufenthaltScorField field);

			property String ^AUFNR {
				String ^get(void);
			}

			property String ^PlausFlag {
				String ^get(void);
			}

			property String ^KANR {
				String ^get(void);
			}

			property String ^GRUPPE {
				String ^get(void);
			}

			property String ^KNOTEN {
				String ^get(void);
			}

			property String ^GesamtPunkte {
				String ^get(void);
			}

			long GetLongFieldValue(unsigned int fieldNum);
			double GetDoubleFieldValue(unsigned int fieldNum);
			String ^GetStringFieldValue(unsigned int fieldNum);

			property bool TK {
				bool get(void);
			}

			property long GESBD {
				long get(void);
			}

			property long Alter {
				long get(void);
			}

			property long BDU {
				long get(void);
			}

			property long BDO {
				long get(void);
			}

			property double BDMW {
				double get(void);
			}




			int PlausCheck();
			int Scoring();

			int PlausCheck(LKFContext ^context);
			int Scoring(LKFContext ^context);

			LKFAbtScoring ^GetAbtScoring(unsigned int abtindex);
			long GetAbtBD(unsigned int abtindex);
		};
	}
}
