#include <iostream>
#include <string>

using namespace std;

enum class VehicleType
{
	_Bus,
	_Tram,
	_vehicle_not_specified
};

class Vehicle
{
private:
	size_t _num_id;
	size_t _max_speed;
	VehicleType _vehicle_type;

public:
	virtual ~Vehicle() {}
	Vehicle(size_t id = 0, size_t speed = 120,
			VehicleType vtype = VehicleType::_vehicle_not_specified)
	{
		_num_id = id;
		_max_speed = speed;
		_vehicle_type = vtype;
	}

	virtual void Show()
	{
		switch (_vehicle_type)
		{

		case VehicleType::_Bus:
			cout << "Автобус";
			break;

		case VehicleType::_Tram:
			cout << "Трамвай";
			break;

		default:
			cout << "Засіб пересування";
			break;
		}

		cout << " #:" << _num_id << "; "
			 << "Макс.шв.: " << _max_speed << "(км/год.); ";
	}

	VehicleType getVehicleType() const { return _vehicle_type; }
};

class Tram : public Vehicle
{
private:
	size_t _tram_cars;

public:
	Tram(size_t id = 0, size_t speed = 70, size_t tcars = 3,
		 VehicleType vtype = VehicleType::_Tram)
		: Vehicle(id, speed, vtype)
	{
		_tram_cars = tcars;
	}

	void Show()
	{
		// cout << '\n';

		Vehicle::Show();

		cout << "К-ть вагонів: " << _tram_cars << ".\n";
	}
};

class Bus : public Vehicle
{
private:
	size_t _consume_fuel;

public:
	Bus(size_t id = 0, size_t speed = 120, size_t fuel = 30,
		VehicleType vtype = VehicleType::_Bus)
		: Vehicle(id, speed, vtype)
	{
		_consume_fuel = fuel;
	}

	void Show()
	{
		// cout << '\n';

		Vehicle::Show();

		cout << "Витр.палив.: " << _consume_fuel << "(л.).\n";
	}
};

enum class DepotType
{
	_BusDepot,
	_TramDepot,
	_depot_not_specified
};

#define BUF_SIZE 12

class Depot
{
private:
	DepotType _depot_type;
	string _depot_name;

	Vehicle *_vehicle[BUF_SIZE];
	size_t ID;

public:
	Depot(const string dname = "", DepotType dtype = DepotType::_depot_not_specified)
		: ID{0}
	{
		_depot_type = dtype;
		_depot_name = dname;
	}

	void pushVehicle(Vehicle *ob)
	{
		if (ID <= BUF_SIZE)
			_vehicle[ID++] = ob;
	}

	void Info()
	{
		cout << "Тип: ";

		switch (_depot_type)
		{

		case DepotType::_BusDepot:
			cout << "Автобусне депо";
			break;

		case DepotType::_TramDepot:
			cout << "Трамвайне депо";
			break;

		default:
			cout << "Тип Депо не вказано";
			break;
		}

		cout
			<< "\nНазва: " << _depot_name
			<< "\nТранспортні засоби котрі розміщенні в ДЕПО: " << endl;

		for (size_t i = 0; i < ID; i++)
			_vehicle[i]->Show();

		cout
			<< '\n'
			<< endl;
	}
};

int main()
{
	Vehicle *veh[] = {

		new Tram(21, 60, 1),
		new Bus(14, 90, 15),
		new Bus(35, 100, 27),
		new Tram(90, 65, 2),
		new Tram(12),
		new Bus(45)

		// і т.д.
	};

	Depot dpTram("Mokotów", DepotType::_TramDepot);
	Depot dpBus("Woronicza", DepotType::_BusDepot);

	for (size_t i = 0; i < (sizeof veh / sizeof *veh); i++)

		if (veh[i]->getVehicleType() == VehicleType::_Bus)
			dpBus.pushVehicle(veh[i]);

		else if (veh[i]->getVehicleType() == VehicleType::_Tram)
			dpTram.pushVehicle(veh[i]);

	dpBus.Info();
	dpTram.Info();

	for (size_t i = 0; i < (sizeof veh / sizeof *veh); i++)
		delete veh[i];

	return 0;
}
