import java.util.ArrayList;

//HINWEIS: Zum besseren Verständnis sind hier die Prüfungen in den settern und die entsprechenden Exceptions weggelassen.

public class Train extends NamedObject 
{
	String Description;
	
	public String getDescription()
	{
		return Description;
	}
	// 2 Alternativen für Konstruktoren	
	public Train (String name, String description, Engine pulled_by)
	{
		super (name);
		Description = description;
		getPulled_By().add(pulled_by);
	}
	public Train (String name, String description, ArrayList<Engine> pulled_by)
	{
		super (name);
		Description = description;
		getPulled_By().addAll(pulled_by);
	}
	
	ArrayList<Engine> Pulled_By = new ArrayList<Engine>();
	
	public ArrayList<Engine> getPulled_By()
	{
		return Pulled_By;
	}
	
	ArrayList<Wagon> Contains = new ArrayList<Wagon>();
	
	public ArrayList<Wagon> getContains()
	{
		return Contains;
	}
	
	public int getNumberOfCars()
	{
		return getPulled_By().size() + getContains().size(); 
	}
	public int calcPower()
	{
		int res = 0;
		for (int i = 0; i < getPulled_By().size(); i++)
		{
			res += getPulled_By().get(i).getPower();
		}
		return res;
	}
	public boolean hasMoreCarsThan (Train other)
	{
		return (this.getNumberOfCars() > other.getNumberOfCars());
	}
	public void addTrain (Train other)
	{
		getPulled_By().addAll(other.getPulled_By());
		getContains().addAll(other.getContains());
	}
	public void printOut()
	{
		System.out.println("===============================================================");
		System.out.println("Zug: " + getName());
		System.out.println(Description);
		System.out.println("---------------------------------------------------------------");
		System.out.println("  ... wiegt " + calcWeight());
		System.out.println("  ... die Antriebsleistung ist " + calcPower());
		System.out.println("  ... hat " + calcCapacity() + " Ladekapazität.");
		
		System.out.print("  ... kann so starten: ");
		if (canStart())
		{
			System.out.println("Ja");
		}
		else
		{
			System.out.println("Nein");			
		}
		System.out.println("  ... wird gezogen von:");
		for (int i = 0; i < getPulled_By().size(); i++)
		{
			System.out.println("    " + getPulled_By().get(i).getName());
		}
		System.out.println("  ... enthält folgende Wagons:");
		for (int i = 0; i < getContains().size(); i++)
		{
			System.out.println("    " + getContains().get(i).getName());
		}		
		System.out.println("===============================================================");
	}
	public int calcCapacity() 
	{
		int result = 0;
		for (int i = 0; i < getContains().size(); i++)
		{
			result = result + getContains().get(i).getCapacity();
		}
		return result;
	}
	public boolean canStart() 
	{
		return calcWeight() <= calcPower();
	}
	public int calcWeight() 
	{
		int result = 0;
		for (int i = 0; i < getPulled_By().size(); i++)
		{
			result = result + getPulled_By().get(i).getWeight();
		}
		for (int i = 0; i < getContains().size(); i++)
		{
			result = result + getContains().get(i).getWeight();
		}
		return result;
	}
	public ArrayList<RollingStock> mergeAllRollingStock()
	{
		ArrayList<RollingStock> result = new ArrayList<RollingStock>();
		// Erste Möglichkeit: Jede Lok einzeln zur Liste hinzufügen.
		for (int i = 0; i < getPulled_By().size(); i++)
		{
			// Da alle Loks auch immer Schienenfahrzeuge sind, kann man eine Lok in einer Liste für Schienenfahrzeuge einfügen.
			result.add(getPulled_By().get(i));
		} 
		
		// Zeite Möglichkeit: Eine Liste komplett hinzufügen.
		result.addAll(getContains());
		return result;
	}
	
}
