package de.stoermer.xxx.domain.xml;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.StringWriter;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;

import de.stoermer.xxx.domain.SchablonenProvider;
import de.stoermer.xxx.domain.Toy;
import de.stoermer.xxx.domain.aufgaben.BeglueckungSchablone;
import de.stoermer.xxx.domain.aufgaben.BestrafungSchablone;
import de.stoermer.xxx.domain.aufgaben.LockSchablone;

public class XmlAufgabenProvider implements SchablonenProvider {

	private List<de.stoermer.xxx.domain.Toy> toys = new ArrayList<>();
	private List<LockSchablone> sperren = new ArrayList<>();
	private List<BeglueckungSchablone> beglueckungen = new ArrayList<>();
	private List<BestrafungSchablone> bestrafungen = new ArrayList<>();

	public void initSchablonen() {
		try {			
			Unmarshaller unmarshaller = JAXBContext.newInstance(StandardAufgaben.class).createUnmarshaller();
			StandardAufgaben aufgaben = (StandardAufgaben) unmarshaller
					.unmarshal(getClass().getResourceAsStream("std.xml"));
			aufgaben.getToys().forEach(xml -> this.toys.add(Toy.fromXml(xml)));
			aufgaben.getBeglueckungen()
			.forEach(xml -> beglueckungen.add(BeglueckungSchablone.fromXml(xml, aufgaben.getToys())));
			aufgaben.getSperren().forEach(xml -> sperren.add(LockSchablone.fromXml(xml, aufgaben.getToys())));
			aufgaben.getStrafen().forEach(xml -> bestrafungen.add(BestrafungSchablone.fromXml(xml, aufgaben.getToys())));
		} catch (JAXBException exception) {
			exception.printStackTrace();
		}
	}
	
	void safe(StandardAufgaben aufgaben) throws JAXBException, URISyntaxException {
		URL resourceUrl = getClass().getResource("std.xml");
		File file = new File(resourceUrl.toURI());
		StringWriter writer = new StringWriter();
		JAXBContext.newInstance(StandardAufgaben.class).createMarshaller().marshal(aufgaben, writer);
		try (FileOutputStream fos = new FileOutputStream(file)) {
			fos.write(writer.toString().getBytes());
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	@Override
	public List<LockSchablone> getSperren() {
		return sperren;
	}

	@Override
	public List<BeglueckungSchablone> getBeglueckungen() {
		return beglueckungen;
	}

	@Override
	public List<BestrafungSchablone> getStrafen() {
		return bestrafungen;
	}
	
	@Override
	public List<de.stoermer.xxx.domain.Toy> getToys() {
		return toys;
	}
}
