public class VisitaFired implements Task {
	Visita visita;
	Evento evento;
	boolean eseguita;

	public VisitaFired(Visita visita, Evento evento) {
		this.visita = visita;
		this.evento = evento;
	}

	@Override
	public synchronized void esegui() {
		if (eseguita)
			return;
		eseguita = false;

		switch (this.visita.stato) {
		case PRENOTATA:
			if (this.evento.getClass() == Assegna.class) {
				this.visita.stato = Visita.Stato.ASSEGNATA;
				Assegna assegna = (Assegna) evento;
				Medico medico = assegna.getMedico();
				LinkAssegnato assegnato = new LinkAssegnato(this.visita, medico);
				this.visita.setAssegnato(assegnato);
				this.visita.iniziale = medico;
			}
			break;
		case ASSEGNATA:
			if (this.evento.getClass() == Effettua.class) {
				this.visita.stato = Visita.Stato.EFFETTUATA;
			}
			if (this.evento.getClass() == Sospendi.class) {
				this.visita.stato = Visita.Stato.SOSPESA;
				this.visita.setAssegnato(null);
			}
			if (this.evento.getClass() == Annulla.class) {
				this.visita.stato = Visita.Stato.ANNULLATA;
			}
			break;
		case SOSPESA:
			if (this.evento.getClass() == Riassegna.class) {
				this.visita.stato = Visita.Stato.ASSEGNATA;
				Riassegna riassegna = (Riassegna) evento;
				Medico nuovo = riassegna.getMedico();
				LinkAssegnato assegnato = new LinkAssegnato(this.visita, nuovo);
				this.visita.setAssegnato(assegnato);
				if (nuovo == this.visita.iniziale)
					break;
				Notifica notifica = new Notifica(this.visita, this.visita.iniziale, this.visita);
				Environment.aggiungiEvento(notifica);
			}
			if (this.evento.getClass() == Annulla.class) {
				this.visita.stato = Visita.Stato.ANNULLATA;
			}
			break;
		case ANNULLATA:
			break;
		case EFFETTUATA:
			break;
		}

	}

	public boolean estEseguita() {
		return this.eseguita;
	}
}
