Code development platform for open source projects from the European Union institutions

Skip to content
Snippets Groups Projects
Forked from VECTO / VECTO Sim
6226 commits behind the upstream repository.
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
BusDatabase.cs 3.58 KiB
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Text;

namespace TUGraz.VectoCore.BusAuxiliaries.DownstreamModules.Impl.HVAC
{
	public class BusDatabase : IBusDatabase
	{
		private List<IBus> buses = new List<IBus>();
		private List<IBus> selectListBuses = new List<IBus>();

		public bool AddBus(IBus bus)
		{
			var result = true;

			try {
				buses.Add(bus);
			} catch (Exception ex) {
				result = false;
			}

			return result;
		}

		public List<IBus> GetBuses(string busModel, bool AsSelectList = false)
		{
			if (AsSelectList) {
				selectListBuses = new List<IBus>();
				selectListBuses = buses.Where(v => v.Model == "" || v.Model.ToLower().Contains(busModel.ToLower())).ToList();
				selectListBuses.Insert(0, new Bus(0, "<Select>", "low floor", "gas", 1, 1, 1, 2, false));
				return selectListBuses;
			}

			return buses.Where(v => v.Model == "" || v.Model.ToLower().Contains(busModel.ToLower())).ToList();
		}

		public bool Initialise(string filepath)
		{
			var returnStatus = true;

			if (File.Exists(filepath)) {
				using (var sr = new StreamReader(filepath)) {
					// get array og lines fron csv
					var lines = sr.ReadToEnd().Split(new [] { Environment.NewLine}, StringSplitOptions.RemoveEmptyEntries);

					// Must have at least 2 entries in map to make it usable [dont forget the header row]
					if (lines.Length < 2) {
						return false;
					}

					var firstline = true;

					var id = 1;

					foreach (var line in lines) {
						if (!firstline) {

							// split the line
							var elements = line.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
							// 7 or 8 entries per line required
							if ((elements.Length != 7 && elements.Length != 8))
								throw new ArgumentException("Incorrect number of values in csv file");

							// Bus
							try {
								var bus = new Bus(id, elements[0], elements[1], elements[2], double.Parse(elements[3], CultureInfo.InvariantCulture), double.Parse(elements[4], CultureInfo.InvariantCulture), double.Parse(elements[5], CultureInfo.InvariantCulture), int.Parse(elements[6], CultureInfo.InvariantCulture), elements.Length == 8 ? bool.Parse(elements[7]) : false);
								buses.Add(bus);
							} catch (Exception ex) {

								// Indicate problems
								returnStatus = false;
							}

							id = id + 1;
						} else {
							firstline = false;
						}
					}
				}
			} else {
				returnStatus = false;
			}

			var uniqueBuses = buses.Select(b => b.Model).Distinct().Count();
			if (buses.Count != uniqueBuses) {
				returnStatus = false;
			}

			return returnStatus;
		}

		public bool UpdateBus(int id, IBus bus)
		{
			var result = true;

			try {
				var existingBus = buses.Single(b => b.Id == id);

				existingBus.Model = bus.Model;
				existingBus.RegisteredPassengers = bus.RegisteredPassengers;
				existingBus.FloorType = bus.FloorType;
				existingBus.LengthInMetres = bus.LengthInMetres;
				existingBus.WidthInMetres = bus.WidthInMetres;
				existingBus.HeightInMetres = bus.HeightInMetres;
				existingBus.IsDoubleDecker = bus.IsDoubleDecker;
			} catch (Exception ex) {
				result = false;
			}

			return result;
		}

		public bool Save(string filepath)
		{
			var result = true;
			var output = new StringBuilder();

			try {
				output.AppendLine("Bus Model,Type,engine Type,length in m,wide in m,height in m,registered passengers,double decker");

				foreach (var bus in buses)
					output.AppendLine(bus.ToString());

				File.WriteAllText(filepath, output.ToString());
			} catch (Exception ex) {
				result = false;
			}

			return result;
		}
	}
}