aboutsummaryrefslogtreecommitdiff
path: root/src/Costasdev.Busurbano.Backend/Services/FareService.cs
diff options
context:
space:
mode:
authorAriel Costas Guerrero <ariel@costas.dev>2025-12-27 16:39:09 +0100
committerAriel Costas Guerrero <ariel@costas.dev>2025-12-27 16:39:28 +0100
commitf81ff82f2a07f87f6eb4f43de49ede64215519e5 (patch)
tree67b4f9ef1c94184e2e1a9878c6feed8dc30ebcb3 /src/Costasdev.Busurbano.Backend/Services/FareService.cs
parentef2df90ffb195edcddd701511dc5953c7baa63af (diff)
Refactor route planner to use new GraphQL backend
Diffstat (limited to 'src/Costasdev.Busurbano.Backend/Services/FareService.cs')
-rw-r--r--src/Costasdev.Busurbano.Backend/Services/FareService.cs49
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);
+ }
+}