import spiel.*;


import javax.swing.JFrame;
import javax.swing.JFileChooser;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException; 
import java.io.FileOutputStream;
import java.io.FileInputStream;
import java.beans.XMLEncoder;
import java.beans.XMLDecoder;

import java.util.Vector;
import java.util.Random;

/**
 * Demonstriert das Abspeichern von Objekten als XML-Dateien
 * Änderung gegenüber Version 1.0: nun ein SpielVarianten-Objekt (der Version 1.1)
 * als Beispiel 
 *
 * @author  ProgPrakt-Team
 * @version 1.1
 */
public class AbspeichernDemo {

    public static void main(String[] args) {

	// Herstellung des abzuspeichernden Objekts

	Feld[][] spielbrett = new Feld[10][5];
	Random generator = new Random();
	for (int i = 0; i<10; i++) {
	    for (int j = 0; j<5; j++) {
		if (generator.nextInt(10)<2) spielbrett[i][j] = Feld.Hindernis;
		else spielbrett[i][j] = Feld.Frei;
	    }
	}
	spielbrett[5][1] = Feld.Loch;

	Vector<Vector<Vector<Wurm>>> aufstellungen = new Vector<Vector<Vector<Wurm>>>();
	Vector<Vector<Wurm>> aufstellungEinSpieler = new Vector<Vector<Wurm>>();
	Vector<Wurm> wuermerDesErstenSpielers = new Vector<Wurm>();
	Wurm meinWurm = new Wurm();
	meinWurm.add(new Koordinaten(1,2));
	meinWurm.add(new Koordinaten(1,3)); 
	// beachtet nicht, ob die Felder noch frei sind!

	wuermerDesErstenSpielers.add(meinWurm);
	aufstellungEinSpieler.add(wuermerDesErstenSpielers);
	aufstellungen.add(aufstellungEinSpieler);
	aufstellungen.add(null);
	aufstellungen.add(null);
	aufstellungen.add(null);
	aufstellungen.add(null);
	
	SpielVarianten spielVarianten =
	    new SpielVarianten("Test","nur ein Test",spielbrett,aufstellungen);
	Object meinObjekt = spielVarianten;
	
	// nun das Abspeichern

	String pfad = "Pfad zum Wunschverzeichnis";
	JFileChooser auswaehler = new JFileChooser(pfad);
	// gibt man hier kein Argument, so ist es das Homeverzeichnis unter Unix
	
	auswaehler.setFileSelectionMode(JFileChooser.FILES_ONLY);
	// keine Verzeichnisse auswählen lassen
	
	auswaehler.setDialogType(JFileChooser.SAVE_DIALOG);
	// abspeichern vorsehen
	
	auswaehler.setVisible(true);
	auswaehler.showSaveDialog(null);
	// dabei das Argument ein Fenster, auf das man sich räumlich bezieht
	
	File ausgabedatei = auswaehler.getSelectedFile();
	// kann scheitern, wenn keine Datei gewählt wurde!! 
	// also besser anders programmieren
	
	String ausgabedateipfad = ausgabedatei.getPath();
	ausgabedatei.delete();
	// löschen, falls schon vorhanden
	
	ausgabedatei = new File(ausgabedateipfad);
	// neue Datei diesen Namens
	
	try {
	    
	    FileOutputStream hinaus = new FileOutputStream(ausgabedatei,true);
	    
	    XMLEncoder kodierer = new XMLEncoder(hinaus);
	    //	    kodierer.setPersistenceDelegate(Richtung.class, new EnumDelegate());
	    kodierer.setPersistenceDelegate(Feld.class, new EnumDelegate());
	    kodierer.writeObject(meinObjekt);
	    //  kodierer.flush();   nicht nötig
	    kodierer.close();
	    //  hinaus.flush();     nicht nötig
	    hinaus.close();
	} catch (FileNotFoundException e) {
	    e.printStackTrace();
	} catch(IOException e) {
	    e.printStackTrace();
	}

	// nun lesen

	auswaehler.showOpenDialog(null);	
	File eingabedatei = auswaehler.getSelectedFile();
	SpielVarianten geleseneVarianten = new SpielVarianten();
	try{
	    FileInputStream hinein = new FileInputStream(eingabedatei);
	    XMLDecoder dekodierer = new XMLDecoder(hinein);
	    geleseneVarianten = (SpielVarianten)dekodierer.readObject();
	    // leider type casting nötig
	    

	    dekodierer.close();
	    hinein.close();
	} catch (FileNotFoundException e) {
	    e.printStackTrace();
	} catch(IOException e) {
	    e.printStackTrace();
	}
	//System.out.println(geleseneVarianten);
	Feld[][] sb = (new SpielVariante(geleseneVarianten,1)).getSpielbrett();
	//System.out.println(sb);
	for (int i = 0; i<sb.length; i++) {
	    for (int j = 0; j<sb[i].length; j++) {
		System.out.println("sb["+i+","+j+"]="+sb[i][j]);
	    }
	}
    }
} 
