import java.util.Set;

public class Principale implements Runnable {
	Set<Paziente> pazienti;
	boolean eseguita = false;

	public Principale(Set<Paziente> pazienti) {
		this.pazienti = pazienti;
	}

	@Override
	public void run() {
		if (eseguita)
			return;
		eseguita = true;

		// calcolo delle visite prenotate o sospese

		Set<Visita> inattesa = null;
		while (inattesa == null || inattesa.size() == 0) {
			Attesa attesa = new Attesa(this.pazienti);
			TaskExecutor.getInstance().perform(attesa);
			inattesa = attesa.getAttesa();

			if (inattesa.size() == 0) {
				try {
					Thread.sleep(3000);
				}
				catch (InterruptedException e) {
					// non ci saranno interruzioni
				}
			}
		}

		// due sottoattivita' parallele

		Informa informa = new Informa(pazienti);
		Sollecita sollecita = new Sollecita(inattesa);

		Thread t1 = new Thread(informa);
		Thread t2 = new Thread(sollecita);

		t1.start();
		t2.start();

		try {
			// attesa del solo secondo thread
			t2.join();
		}
		catch (InterruptedException e) {
		}

		// stampa della notifica di fine sollecito

		SegnaliIO.fineSollecito();
	}
}
