package kalender;

import java.util.*;
import java.text.*;
import java.beans.*;
import java.io.*;

public class Kalender
{
	private boolean ændret;
	private List liste;
	/**
	 * @param kal Datoen vi ønsker at kende indekset i listen på
	 * @returns indekset der skal bruges i kald til sæt() og hent().
	 */
	public int beregnIndex(Calendar kal) {
		int år = kal.get(Calendar.YEAR);
		int dag = kal.get(Calendar.DAY_OF_YEAR);
		// det vigtigste er at to dage aldrig får samme indeks
		return (år-2003)*366+dag;
	}

	/**
	 * Sæt teksten for en bestemt dag.
	 * @see #beregnIndeks(Calendar)
	 * @param indeks Indekset i listen. Skal først findes med beregnIndeks()
	 * @param tekst Teksten for dagen
	 */
	public void sætDagstekst(int indeks, String tekst) {
		// Fyld op med tomme strenge hvis der gås ud over listen
		while (indeks>=liste.size()) liste.add("");
		liste.set(indeks,tekst);
		ændret = true;
	}

	/**
	 * Hent teksten for en bestemt dag.
	 * @see #beregnIndeks(GregorianCalendar)
	 * @param index Indekset i listen. Skal først findes med beregnIndeks()
	 * @return tekst Teksten for dagen
	 */
	public String hentDagstekst(int indeks) {
		if (indeks<0 || liste.size()<=indeks) return "";
		else return (String) liste.get(indeks);
	}

	public static final Kalender instans = new Kalender(); // singleton med

	private Kalender() {                                   // privat konstruktør
		try { // indlæs kalenderen fra XML-fil på disken (hvis den findes)
			XMLDecoder kal = new XMLDecoder(new FileInputStream("kalender.xml"));
			// alternativ: hent serialiseret objekt i stedet for XML-data
			//ObjectInputStream kal = new ObjectInputStream(
			//                        new FileInputStream("kalender.ser"));
			liste = (ArrayList) kal.readObject();
			kal.close();
			System.out.println("Kalender indlæst: "+liste);
		} catch (Exception e) {
			System.out.println("Kalender ikke indlæst, opretter ny: "+e);
			liste = new ArrayList();
		}
		GemRegelmæssigt g = new GemRegelmæssigt(); // gemmer kalenderen på disken
	}

	/** Sørger for at gemme kalenderen regelmæssigt (i en separat tråd) */
	class GemRegelmæssigt extends Thread
	{
		public GemRegelmæssigt() {
			setDaemon(true);   // systemet må godt stoppe selvom tråden stadig kører
			setPriority(MIN_PRIORITY);
			start();
		}

		public void run() {
			while (true) try {
				Thread.sleep(1*60*1000); // hvert minut,
				if (ændret) {            // hvis kalenderen er ændret
					ændret = false;        // gem kalenderen på disken
					// gem som XML
					XMLEncoder kal = new XMLEncoder(new FileOutputStream("kalender.xml"));
					// alternativ: gem som serialiseret objekt i stedet for XML
					//ObjectOutputStream kal = new ObjectOutputStream(
					//                         new FileOutputStream("kalender.ser"));
					kal.writeObject(liste);
					kal.close();
					System.out.println("Kalender gemt: "+liste);
				}
			} catch (Exception e) { e.printStackTrace(); }
		}
	}
}