// #pragma once
#ifndef TARIFF_UTILS_H_INCLUDED
#define TARIFF_UTILS_H_INCLUDED

#include "tariff_day_of_week.h"
#include "tariff_cfg.h"
#include "tariff_time_range.h"
#include "active_time_range.h"
#include <stdio.h>
#include <cstring>
#include <ctime>
#include <stddef.h>
#include <locale.h>
#include <iostream>
#include <math.h>

/// <summary>
/// Definition of TariffUtilities class
/// </summary>
class TariffUtils {
public:

    /// <summary>
    /// Validate parking ticket
    /// </summary>
    /// <param name="initial"></param>
    /// <param name="durationMin"></param>
    /// <param name="time_range"></param>
    /// <param name="isSpecialDay"></param>
    /// <param name="spec_day_id"></param>
    /// <returns></returns>
    static bool
    ValidateParkingTicket(TariffConfiguration const *tariff_cfg,
                          time_t initial, int durationMin,
                          double price, TariffTimeRange time_range,
                          bool isSpecialDay, int spec_day_id);

    /// <summary>
    /// Check if time is in range between start and end of active payment hours
    /// </summary>
    /// <param name="tariff_cfg">Tariff configuration</param>
    /// <param name="datetimeStr">Current datetime string</param>
    /// <param name="isSpecialDay">Special day flag</param>
    /// <param name="spec_day_id">Special day ID</param>
    /// <returns>Returns if parking time range is active</returns>
    static ActiveTimeRange
    isParkingTimeRangeActive(TariffConfiguration *tariff_cfg,
                             std::string datetimeStr, bool isSpecialDay,
                             int spec_day_id);

    /// <summary>
    /// Get day of week from current date (Zeller's Algorithm), 
    ///     starting day is Sunday
    /// </summary>
    /// <param name="date"></param>
    /// <returns></returns>
    static DayOfWeek GetDayOfWeek(struct tm const *t);

    /// <summary>
    /// Identifies special day (e.g. Christmas)
    /// </summary>
    /// <param name="tariff_cfg">Pointer to tariff configuration data</param>
    /// <param name="date">Date to be validated</param>
    /// <param name="date">Reference to special day ID</param>
    /// <returns>Returns if the date is a special day</returns>
    static bool IsSpecialDay(TariffConfiguration const *tariff_cfg, const char *dateTimeStr, int& specialDayId);

    static bool PriceForSpecialDay(TariffConfiguration const* tariff_cfg, int specialDayId, double *price);

    /// <summary>
    /// Date and time parse helper function
    /// </summary>
    /// <returns>Returns time (tm) structure</returns>
    static bool DateTimeToStructTm(const char* dateTimeStr, struct tm *t);

    /// <summary>
    /// Date parse helper function
    /// </summary>
    /// <returns>Returns time (tm) structure</returns>
    static bool DateToStructTm(char const* dateStr, struct tm *t);

    /// <summary>
    /// Time parse helper function
    /// </summary>
    /// <returns>Returns time (tm) structure</returns>
    static bool TimeToStructTm(const char* timeStr, struct tm *t);

    /// <summary>
    /// Get current local time
    /// </summary>
    /// <returns>Returns time_t structure</returns>
    static time_t GetCurrentLocalTime();
};

#endif // TARIFF_UTILS_H_INCLUDED