/*******************************************************************************
 * Copyright (c) 2009, 2011 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.mdht.uml.cda.tests;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.eclipse.emf.ecore.xmi.impl.XMLResourceFactoryImpl;
import org.eclipse.emf.ecore.xmi.impl.XMLResourceImpl;
import org.eclipse.mdht.uml.cda.ActReference;
import org.eclipse.mdht.uml.cda.CDAFactory;
import org.eclipse.mdht.uml.cda.ClinicalDocument;
import org.eclipse.mdht.uml.cda.Component4;
import org.eclipse.mdht.uml.cda.Encounter;
import org.eclipse.mdht.uml.cda.Entry;
import org.eclipse.mdht.uml.cda.InFulfillmentOf1;
import org.eclipse.mdht.uml.cda.Section;
import org.eclipse.mdht.uml.cda.util.CDAUtil;
import org.eclipse.mdht.uml.hl7.datatypes.CE;
import org.eclipse.mdht.uml.hl7.datatypes.DatatypesFactory;
import org.eclipse.mdht.uml.hl7.vocab.ActRelationshipFulfills;
import org.eclipse.mdht.uml.hl7.vocab.EntityDeterminer;

public class Main2 {

	public static void saveData(String fileName, ClinicalDocument data) throws IOException {
		Resource.Factory.Registry reg = Resource.Factory.Registry.INSTANCE;
		Map<String, Object> m = reg.getExtensionToFactoryMap();
		m.put("*", new XMLResourceFactoryImpl());

		ResourceSet resSet = new ResourceSetImpl();
		Resource resource = resSet.createResource(URI.createFileURI(fileName));
		resource.getContents().add(data);
		resource.save(Collections.EMPTY_MAP);
	}

	public static ClinicalDocument loadData(String fileName) throws FileNotFoundException, IOException {

		XMLResourceImpl resource = new XMLResourceImpl();
		File source = new File(fileName);
		resource.load(new FileInputStream(source), new HashMap<>());
		ClinicalDocument data = (ClinicalDocument) resource.getContents().get(0);
		return data;
	}

	public static void main(String[] args) throws Exception {
		ClinicalDocument doc = CDAFactory.eINSTANCE.createClinicalDocument();
		Section section = CDAFactory.eINSTANCE.createSection();
		doc.addSection(section);
		Encounter encounter = CDAFactory.eINSTANCE.createEncounter();

		encounter.setEffectiveTime(DatatypesFactory.eINSTANCE.createIVL_TS());
		encounter.getSDTCDischargeDispositionCodes().add(DatatypesFactory.eINSTANCE.createCE("1", "1"));
		encounter.getSDTCDischargeDispositionCodes().add(DatatypesFactory.eINSTANCE.createCE("2", "1"));
		encounter.getSDTCDischargeDispositionCodes().add(DatatypesFactory.eINSTANCE.createCE("3", "1"));
		encounter.getSDTCDischargeDispositionCodes().add(DatatypesFactory.eINSTANCE.createCE("4", "1"));
		encounter.getSDTCDischargeDispositionCodes().add(DatatypesFactory.eINSTANCE.createCE("5", "1"));
		encounter.getSDTCDischargeDispositionCodes().add(DatatypesFactory.eINSTANCE.createCE("6", "1"));

		InFulfillmentOf1 ff = CDAFactory.eINSTANCE.createInFulfillmentOf1();

		ActReference ar = CDAFactory.eINSTANCE.createActReference();

		ar.setDeterminerCode(EntityDeterminer.INSTANCE);
		ar.getIds().add(DatatypesFactory.eINSTANCE.createII("aaa", "bbb"));
		ff.setTypeCode(ActRelationshipFulfills.FLFS);
		ff.setTypeId(CDAFactory.eINSTANCE.createInfrastructureRootTypeId());

		ff.setActReference(ar);

		// ff.get
		encounter.getInFulfillmentOf1s().add(ff);
		encounter.getInFulfillmentOf1s().add(CDAFactory.eINSTANCE.createInFulfillmentOf1());
		encounter.getInFulfillmentOf1s().add(CDAFactory.eINSTANCE.createInFulfillmentOf1());
		encounter.getInFulfillmentOf1s().add(CDAFactory.eINSTANCE.createInFulfillmentOf1());
		encounter.getInFulfillmentOf1s().add(CDAFactory.eINSTANCE.createInFulfillmentOf1());

		encounter.setPriorityCode(DatatypesFactory.eINSTANCE.createCE());
		section.addEncounter(encounter);

		// saveData("foobar.xml", doc);
		CDAUtil.save(doc, new FileOutputStream("samples/foobar2.xml"));

		// ClinicalDocument clinicalDocument = loadData("foobar.xml");

		ClinicalDocument clinicalDocument = CDAUtil.load(new FileInputStream("samples/foobar2.xml"));

		for (Section s : clinicalDocument.getSections()) {

			for (Entry e : s.getEntries()) {

				if (e.getEncounter() != null) {

					for (CE ce : e.getEncounter().getSDTCDischargeDispositionCodes()) {
						System.out.println(ce.getCode());
					}

				}

			}

		}

		CDAUtil.save(clinicalDocument, new FileOutputStream("samples/foobar3.xml"));

		Component4 c4 = CDAFactory.eINSTANCE.createComponent4();
		c4.setPriorityNumber(DatatypesFactory.eINSTANCE.createINT());
		CDAUtil.saveSnippet(c4, System.out);

		// CDAUtil.save(clinicalDocument, System.out);
		//
		// ClinicalDocument clinicalDocument = CDAUtil.load(new FileInputStream("samples/test.xml"));
		// CDAUtil.save(clinicalDocument, System.out);
		// //
		// InfrastructureRootTypeId typeId = CDAFactory.eINSTANCE.createInfrastructureRootTypeId();
		// typeId.setExtension("POCD_HD000040");
		// doc.setTypeId(typeId);
		//
		// II id = DatatypesFactory.eINSTANCE.createII("2.16.840.1.113883.19.4", "c266");
		// doc.setId(id);
		//
		// II templateId = DatatypesFactory.eINSTANCE.createII("2.16.840.1.113883.3.27.1776");
		// doc.getTemplateIds().add(templateId);
		//
		// CE code = DatatypesFactory.eINSTANCE.createCE("11488-4", "2.16.840.1.113883.6.1", "LOINC", "Consultation note");
		// doc.setCode(code);
		//
		// ST title = DatatypesFactory.eINSTANCE.createST("Good Health Clinic Consultation Note");
		// doc.setTitle(title);
		//
		// TS effectiveTime = DatatypesFactory.eINSTANCE.createTS("20000407");
		// doc.setEffectiveTime(effectiveTime);
		//
		// CE confidentialityCode = DatatypesFactory.eINSTANCE.createCE("N", "2.16.840.1.113883.5.25");
		// doc.setConfidentialityCode(confidentialityCode);
		//
		// RecordTarget recordTarget = CDAFactory.eINSTANCE.createRecordTarget();
		// doc.getRecordTargets().add(recordTarget);
		//
		// PatientRole patientRole = CDAFactory.eINSTANCE.createPatientRole();
		// recordTarget.setPatientRole(patientRole);
		//
		// Patient patient = CDAFactory.eINSTANCE.createPatient();
		// patientRole.setPatient(patient);
		//
		// PN name = DatatypesFactory.eINSTANCE.createPN();
		// name.addGiven("Henry").addFamily("Levin").addSuffix("the 7th");
		// patient.getNames().add(name);
		//
		// CE administrativeGenderCode = DatatypesFactory.eINSTANCE.createCE("M", "2.16.840.1.113883.5.1");
		// patient.setAdministrativeGenderCode(administrativeGenderCode);
		//
		// TS birthTime = DatatypesFactory.eINSTANCE.createTS("19320924");
		// patient.setBirthTime(birthTime);
		//
		// Organization providerOrganization = CDAFactory.eINSTANCE.createOrganization();
		// providerOrganization.getIds().add(DatatypesFactory.eINSTANCE.createII("2.16.840.1.113883.19.5"));
		// patientRole.setProviderOrganization(providerOrganization);
		//
		// Author author = CDAFactory.eINSTANCE.createAuthor();
		// author.setTime(DatatypesFactory.eINSTANCE.createTS("2000040714"));
		// doc.getAuthors().add(author);
		//
		// AssignedAuthor assignedAuthor = CDAFactory.eINSTANCE.createAssignedAuthor();
		// assignedAuthor.getIds().add(DatatypesFactory.eINSTANCE.createII("2.16.840.1.113883.19.5", "KP00017"));
		// author.setAssignedAuthor(assignedAuthor);
		//
		// Person assignedPerson = CDAFactory.eINSTANCE.createPerson();
		// assignedAuthor.setAssignedPerson(assignedPerson);
		//
		// name = DatatypesFactory.eINSTANCE.createPN();
		// name.addGiven("Bob").addFamily("Dolin").addSuffix("MD");
		// assignedPerson.getNames().add(name);
		//
		// Section section = CDAFactory.eINSTANCE.createSection();
		// Encounter encounter = CDAFactory.eINSTANCE.createEncounter();
		//
		// encounter.setPriorityCode(DatatypesFactory.eINSTANCE.createCE("code", "system"));
		// encounter.setEffectiveTime(DatatypesFactory.eINSTANCE.createIVL_TS("low", "high"));
		// encounter.getSDTCDischargeDispositionCodes().add(DatatypesFactory.eINSTANCE.createCE("code", "system"));
		// encounter.addAct(CDAFactory.eINSTANCE.createAct());
		//
		// section.addEncounter(encounter);
		// doc.addSection(section);
		//
		// System.out.println("***** Constructed example *****");
		// CDAUtil.save(doc, System.out);
		// System.out.println();

		// create a validation result object to collect diagnostics produced during validation
		// ValidationResult result = new ValidationResult();
		// ClinicalDocument clinicalDocument = CDAUtil.load(new FileInputStream("samples/ccda.xml"));

		// for (Section s : clinicalDocument.getSections()) {
		// for (Entry e : s.getEntries()) {
		// if (e.getEncounter() != null) {
		// for (CE ce : e.getEncounter().getSDTCDischargeDispositionCodes()) {
		// System.out.println(ce.getCode());
		// }
		// }
		// }
		//
		// }

		// System.out.println("\n***** Reserialization of sample *****");
		// System.out.println(clinicalDocument);
		// CDAUtil.save(clinicalDocument, System.out);
		// System.out.println();

		// System.out.println("\n***** Sample validation results *****");
		// for (Diagnostic diagnostic : result.getErrorDiagnostics()) {
		// System.out.println("ERROR: " + diagnostic.getMessage());
		// }
		// for (Diagnostic diagnostic : result.getWarningDiagnostics()) {
		// System.out.println("WARNING: " + diagnostic.getMessage());
		// }
		//
		// System.out.println(
		// "Number of Schema Validation Diagnostics: " + result.getSchemaValidationDiagnostics().size());
		// System.out.println("Number of EMF Resource Diagnostics: " + result.getEMFResourceDiagnostics().size());
		// System.out.println("Number of EMF Validation Diagnostics: " + result.getEMFValidationDiagnostics().size());
		// System.out.println("Number of Total Diagnostics: " + result.getAllDiagnostics().size());
		//
		// if (!result.hasErrors()) {
		// System.out.println("Document is valid");
		// } else {
		// System.out.println("Document is invalid");
		// }
	}
}
