package at.medevit.elexis.impfplan.ui.billing;

import java.util.List;

import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.swt.widgets.Display;

import ch.artikelstamm.elexis.common.ArtikelstammItem;
import ch.elexis.core.data.interfaces.IVerrechenbar;
import ch.elexis.core.ui.dialogs.SelectOrCreateOpenKonsDialog;
import ch.elexis.data.Artikel;
import ch.elexis.data.Konsultation;
import ch.elexis.data.Patient;
import ch.elexis.data.TarmedLeistung;
import ch.elexis.data.Verrechnet;

public class AddVaccinationToKons {
	private static final String TARMED_5MIN_TARIF = "00.0010";
	
	private static Object selectKonsLock = new Object();
	private Konsultation kons;
	private static IVerrechenbar consVerrechenbar;
	private Patient patient;
	private Artikel art;
	
	public AddVaccinationToKons(Patient patient, Artikel art, String ean){
		this.patient = patient;
		this.art = art;
		if (art == null) {
			art = ArtikelstammItem.findByEANorGTIN(ean);
		}
		
		if (consVerrechenbar == null) {
			consVerrechenbar = TarmedLeistung.getFromCode(TARMED_5MIN_TARIF);
		}
	}
	
	public Konsultation findOrCreateKons(){
		// TODO anbieten, dass Tarifpositionen vorab bestimmt werden können
// String l = CoreHub.userCfg.get(PreferencePage.VAC_BILLING_POS, "");
// String[] billingPos = l.split(",");
		
		initKonsultation();
		if (kons == null || !kons.isEditable(false)) {
			return null;
		} else { // (kons != null && kons.isEditable(false)) {
			kons.addLeistung(art);
			
			boolean addedCons = true;
			List<Verrechnet> leistungen = kons.getLeistungen();
			for (Verrechnet verrechnet : leistungen) {
				IVerrechenbar verrechenbar = verrechnet.getVerrechenbar();
				if (verrechenbar != null && verrechenbar.getCodeSystemName().equals("Tarmed")
					&& verrechenbar.getCode().equals(TARMED_5MIN_TARIF)) {
					kons.updateEintrag(
						kons.getEintrag().getHead() + "\nImpfung - " + art.getName(), true);
					addedCons = false;
					break;
				}
			}
			if (addedCons) {
				kons.updateEintrag("Impfung - " + art.getName(), true);
				if (consVerrechenbar != null) {
					kons.addLeistung(consVerrechenbar);
				}
			}
			return kons;
		}
	}
	
	/**
	 * get existing kons or creates new one for patient
	 */
	private void initKonsultation(){
		synchronized (selectKonsLock) {
			kons = patient.getLetzteKons(false);
			if (kons == null || !kons.isEditable(false)) {
				Display.getDefault().syncExec(new Runnable() {
					@Override
					public void run(){
						SelectOrCreateOpenKonsDialog dialog =
							new SelectOrCreateOpenKonsDialog(patient,
								"Konsultation für die automatische Verrechnung auswählen.");
						if (dialog.open() == Dialog.OK) {
							kons = dialog.getKonsultation();
						}
					}
				});
			}
		}
	}
	
}

@@ -255,16 +255,105 @@
 henbar;%0A
+import ch.elexis.core.text.model.Samdas;%0Aimport ch.elexis.core.text.model.Samdas.Record;%0A
 import c
@@ -1558,16 +1558,294 @@
 t);%0A%09%09%09%0A
+%09%09%09// update kons. text%0A%09%09%09Samdas samdas = new Samdas(kons.getEintrag().getHead());%0A%09%09%09Record rec = samdas.getRecord();%0A%09%09%09String recText = rec.getText();%0A%09%09%09recText += %22%5CnImpfung - %22 + art.getName();%0A%09%09%09rec.setText(recText);%0A%09%09%09kons.updateEintrag(samdas.toString(), true);%0A%09%09%09%0A
 %09%09%09boole
@@ -2180,236 +2180,69 @@
 %09%09%09%09
-kons.updateEintrag(%0A%09%09%09%09%09%09kons.getEintrag().getHead() + %22%5CnImpfung - %22 + art.getName(), true);%0A%09%09%09%09%09addedCons = false;%0A%09%09%09%09%09break;%0A%09%09%09%09%7D%0A%09%09%09%7D%0A%09%09%09if (addedCons) %7B%0A%09%09%09%09kons.updateEintrag(%22Impfung - %22 + art.getName(), true);%0A%09%09%09%09if
+addedCons = false;%0A%09%09%09%09%09break;%0A%09%09%09%09%7D%0A%09%09%09%7D%0A%09%09%09if (addedCons &&
  (co
@@ -2264,20 +2264,20 @@
 != null)
+)
  %7B%0A
-%09
 %09%09%09%09kons
@@ -2308,22 +2308,16 @@
 enbar);%0A
-%09%09%09%09%7D%0A
 %09%09%09%7D%0A%09%09%09

fix kons.text update when adding a vaccination