using System; using System.Collections.Generic; using InfoferScraper.Models.Status; namespace InfoferScraper.Models.Station { #region Interfaces public interface IStationScrapeResult { public string StationName { get; } /// /// Date in the DD.MM.YYYY format /// This date is taken as-is from the result. /// public string Date { get; } public IReadOnlyList? Arrivals { get; } public IReadOnlyList? Departures { get; } } public interface IStationArrDep { public int? StoppingTime { get; } public DateTimeOffset Time { get; } public IStationTrain Train { get; } public IStationStatus Status { get; } } public interface IStationTrain { public string Number { get; } public string Operator { get; } public string Rank { get; } public IReadOnlyList Route { get; } /// /// Arrivals -> Departure station; Departures -> Destination station /// public string Terminus { get; } } public interface IStationStatus : IStatus { new int Delay { get; } new bool Real { get; } public string? Platform { get; } } #endregion #region Implementations internal record StationScrapeResult : IStationScrapeResult { private List? _modifyableArrivals = new(); private List? _modifyableDepartures = new(); public string StationName { get; internal set; } = ""; public string Date { get; internal set; } = ""; public IReadOnlyList? Arrivals => _modifyableArrivals?.AsReadOnly(); public IReadOnlyList? Departures => _modifyableDepartures?.AsReadOnly(); private void AddStationArrival(StationArrDep arrival) { _modifyableArrivals ??= new List(); _modifyableArrivals.Add(arrival); } private void AddStationDeparture(StationArrDep departure) { _modifyableDepartures ??= new List(); _modifyableDepartures.Add(departure); } internal void AddNewStationArrival(Action configurator) { StationArrDep newStationArrDep = new(); configurator(newStationArrDep); AddStationArrival(newStationArrDep); } internal void AddNewStationDeparture(Action configurator) { StationArrDep newStationArrDep = new(); configurator(newStationArrDep); AddStationDeparture(newStationArrDep); } } internal record StationArrDep : IStationArrDep { public int? StoppingTime { get; internal set; } public DateTimeOffset Time { get; internal set; } public IStationTrain Train => ModifyableTrain; public IStationStatus Status => ModifyableStatus; internal readonly StationTrain ModifyableTrain = new(); internal readonly StationStatus ModifyableStatus = new(); } internal record StationTrain : IStationTrain { private readonly List _modifyableRoute = new(); public string Number { get; internal set; } = ""; public string Operator { get; internal set; } = ""; public string Rank { get; internal set; } = ""; public IReadOnlyList Route => _modifyableRoute.AsReadOnly(); public string Terminus { get; internal set; } = ""; internal void AddRouteStation(string station) => _modifyableRoute.Add(station); } internal record StationStatus : IStationStatus { public int Delay { get; internal set; } public bool Real { get; internal set; } public string? Platform { get; internal set; } } #endregion }