/* alpenfest_demand.pl */
  
  
alpenfest_demand_daily( Year, TlStartDate, TlEndDate, Xs, Ys ) :-
  alpenfest_demand_key_points( Year, KeyPoints ),
  % A list of kp(Date,DI,Reason) keypoints.
  
  maplist( { TlStartDate } / [ kp(Date,DI,_Reason), Offset-DI ] >> date_interval( Date, TlStartDate, days(Offset) )
         , KeyPoints
		 , OffsetsAndDIs
		 ),
  % A list of Date-DI keypoints.
  
  TlStartOffset = 0,
  date_interval( TlEndDate, TlStartDate, days(TlEndOffset) ), 
  time_series_segments_to_points( TlStartOffset, TlEndOffset, OffsetsAndDIs, Xs, Ys ).
  % A list of date offsets Xs, and a list of demand increments Ys.
  
  
alpenfest_demand_key_points( Year, KeyPoints ) :-
  findall( kp(Date,DI,Reason)
         , alpenfest_demand_key_point( Year, Date, DI, Reason )
		 , KeyPoints
		 ).


alpenfest_demand_key_point( Year, Date, DI, Reason ) :-
  alpenfest_demand( DR, DI, Reason ),
  eval_daterel_alpenfest( DR, Year, Date ).


% Alpenfest typically starts on a Saturday in September and ends 16 days later.

eval_daterel_alpenfest( 'Alpenfest Start', 2024, date(2024,9,21) ).
eval_daterel_alpenfest( 'Alpenfest End', 2024, date(2024,10,6) ).

eval_daterel_alpenfest( 'Alpenfest Start', 2025, date(2025,9,20) ).
eval_daterel_alpenfest( 'Alpenfest End', 2025, date(2025,10,5) ).

eval_daterel_alpenfest( 'Alpenfest Start', 2026, date(2026,9,19) ).
eval_daterel_alpenfest( 'Alpenfest End', 2026, date(2026,10,4) ).


eval_daterel_alpenfest(DR+Offset, Year, Date) :-
    eval_daterel_alpenfest(DR, Year, BaseDate),
    date_add(BaseDate, days(Offset), Date).

eval_daterel_alpenfest(DR-Offset, Year, Date) :-
    eval_daterel_alpenfest(DR, Year, BaseDate),
    date_add(BaseDate, days(-Offset), Date).
	

alpenfest_demand( 'Alpenfest Start'-9, 0, "Just before early arrivals and pre-festival activities." ).
alpenfest_demand( 'Alpenfest Start'-7, 10, "Early arrivals and pre-festival activities." ).
alpenfest_demand( 'Alpenfest Start', 30, "Opening day of Alpenfest with peak demand." ).
alpenfest_demand( 'Alpenfest Start'+7, 20, "Mid-festival period with sustained high demand." ).
alpenfest_demand( 'Alpenfest End', 25, "Final weekend of Alpenfest with high demand." ).
alpenfest_demand( 'Alpenfest End'+1, 5, "A few people fly in to meet friends, staff or stars who were at Alpenfest." ).
alpenfest_demand( 'Alpenfest End'+3, 0, "End of Alpenfest demand." ).