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 bool Cancelled { 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 bool Cancelled { get; internal set; }
public string? Platform { get; internal set; }
}
#endregion
}