diff options
Diffstat (limited to 'src/Costasdev.Busurbano.Backend/Services/FareService.cs')
| -rw-r--r-- | src/Costasdev.Busurbano.Backend/Services/FareService.cs | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/src/Costasdev.Busurbano.Backend/Services/FareService.cs b/src/Costasdev.Busurbano.Backend/Services/FareService.cs new file mode 100644 index 0000000..0e4fefc --- /dev/null +++ b/src/Costasdev.Busurbano.Backend/Services/FareService.cs @@ -0,0 +1,49 @@ +using Costasdev.Busurbano.Backend.Configuration; +using Costasdev.Busurbano.Backend.Types.Planner; +using Microsoft.Extensions.Options; + +namespace Costasdev.Busurbano.Backend.Services; + +public record FareResult(double CashFareEuro, double CardFareEuro); + +public class FareService +{ + private readonly AppConfiguration _config; + + public FareService(IOptions<AppConfiguration> config) + { + _config = config.Value; + } + + public FareResult CalculateFare(IEnumerable<Leg> legs) + { + var busLegs = legs.Where(l => l.Mode != null && l.Mode.ToUpper() != "WALK").ToList(); + + // Cash fare logic + // TODO: In the future, this should depend on the operator/feed + var cashFare = busLegs.Count * 1.63; // Defaulting to Vitrasa for now + + // Card fare logic (45-min transfer window) + int cardTicketsRequired = 0; + DateTime? lastTicketPurchased = null; + int tripsPaidWithTicket = 0; + + foreach (var leg in busLegs) + { + if (lastTicketPurchased == null || + (leg.StartTime - lastTicketPurchased.Value).TotalMinutes > 45 || + tripsPaidWithTicket >= 3) + { + cardTicketsRequired++; + lastTicketPurchased = leg.StartTime; + tripsPaidWithTicket = 1; + } + else + { + tripsPaidWithTicket++; + } + } + + return new FareResult(cashFare, cardTicketsRequired * 0.67); + } +} |
