

import java.util.List;
import java.util.ArrayList;
import aima.search.framework.Successor;
import aima.search.framework.SuccessorFunction;

public class Sucesores implements SuccessorFunction {

	public List getSuccessors(Object state) {
		Horario h = (Horario) state;
		List sucesores = new ArrayList();

		
		// recorrido por todos los trabajos ya puestos
		for (int i=0; i<h.trabajos.size(); i++) {
			Trabajo trabajo= (Trabajo) h.trabajos.get(i);

			
			//// Operador: quitar(trabajo) ////

			if ( h.sePuedeQuitar(trabajo) ) {
				Horario result = new Horario(h);
				result.quitar(trabajo);
				String mensaje = "quitar tr. "+trabajo.id;
				sucesores.add( new Successor(mensaje, result) );
			}

		
			
			//// Operador: ajustar(trabajo,desplazamiento) ////
			
			// probar cada desplazamiento permitido por la tolerancia
			for (int d = -5; d <= 5; d++) {
				if ( h.sePuedeAjustar(trabajo,d) ) {
					Horario result = new Horario(h);
					result.ajustar(trabajo,d);
					String mensaje = "ajustar tr. "+trabajo.id+" a despl. "+d;
					sucesores.add( new Successor(mensaje, result) );
					
				}
			}
		

			
			//// Operador: intercambiar(trab_viejo,trab_nuevo) ////
			
			for (int j=0; j<HorarioTrabajo.todosTrabajos.size(); j++) {
				Trabajo trabajoNuevo= (Trabajo) HorarioTrabajo.todosTrabajos.get(j);
				if ( h.sePuedeIntercambiar(trabajo,trabajoNuevo) ) {
					Horario result = new Horario(h);
					result.intercambiar(trabajo,trabajoNuevo);
					String mensaje =
							  "intercambiar tr. "+trabajo.id+" con el tr. "+trabajoNuevo.id;
					sucesores.add( new Successor(mensaje, result) );
				}
			}


			
			
		}
		//System.out.println("sucesores, paso intermedio");
		
		// recorrido por todos los trabajos disponibles para poner
		for (int i=0; i<HorarioTrabajo.todosTrabajos.size(); i++) {
			Trabajo trabajo= (Trabajo) HorarioTrabajo.todosTrabajos.get(i);



			//// Operador: poner(trabajo,desplazamiento) ////
			
			// probar cada desplazamiento
			for (int d = -5; d <= 5; d++) {
				if ( h.sePuedePoner(trabajo,d) ) {
					Horario result = new Horario(h);
					
					result.poner(trabajo,d);
					String mensaje = "poner tr. "+trabajo.id+" con despl. "+d;
					sucesores.add( new Successor(mensaje, result) );
					
				}
			}

			
		}
		
		System.out.println("Generados "+sucesores.size()+" sucesores "+
							 "de un horario con "+h.numTrabajos()+" trabajos.");

		return sucesores;
	}

}
		

		

