#ifndef TIME_RANGE_HEADER_H_INCLUDED
#define TIME_RANGE_HEADER_H_INCLUDED

#include <QString>
#include <QDateTime>
#include <QDebug>
#include <QDebugStateSaver>

struct ATBTimeRange {
    int time_range_id;
    QTime time_range_from;
    QTime time_range_to;
    int time_range_from_in_minutes_from_start;
    int time_range_to_in_minutes_from_start;
    int time_range_tbase_id;
    int time_range_payment_type_id;

    explicit ATBTimeRange()
      : time_range_id(-1)
      , time_range_from(QTime())
      , time_range_to(QTime())
      , time_range_from_in_minutes_from_start(-1)
      , time_range_to_in_minutes_from_start(-1)
      , time_range_tbase_id(-1)
      , time_range_payment_type_id(-1) {
    }

    QTime const &getTimeFrom() const { return time_range_from; }
    QTime const &getTimeUntil() const { return time_range_to; }

    bool computeQTimeFrom(QTime const &t) {
        if (time_range_from_in_minutes_from_start != -1) {
            time_range_from = t.addSecs(time_range_from_in_minutes_from_start * 60);
            return time_range_from.isValid();
        }
        return false;
    }

    bool computeQTimeTo(QTime const &t) {
        if (time_range_to_in_minutes_from_start != -1) {
            time_range_to = t.addSecs(time_range_to_in_minutes_from_start * 60);
            return time_range_to.isValid();
        }
        return false;
    }

    bool computeQTimes(QTime const &t) {
        if (!t.isNull() && t.isValid()) {
            return computeQTimeFrom(t) && computeQTimeTo(t);
        }
        return false;
    }

    friend QDebug operator<<(QDebug debug, ATBTimeRange const &timeRange) {
        QDebugStateSaver saver(debug);

        debug.nospace()
            << "                          time_range_id: " << timeRange.time_range_id << "\n"
            << "                        time_range_from: " << timeRange.time_range_from.toString(Qt::ISODate) << "\n"
            << "                          time_range_to: " << timeRange.time_range_to.toString(Qt::ISODate) << "\n"
            << "  time_range_from_in_minutes_from_start: " << timeRange.time_range_from_in_minutes_from_start << "\n"
            << "    time_range_to_in_minutes_from_start: " << timeRange.time_range_to_in_minutes_from_start << "\n"
            << "                    time_range_tbase_id: " << timeRange.time_range_tbase_id << "\n"
            << "             time_range_payment_type_id: " << timeRange.time_range_payment_type_id << "\n";

        return debug;
    }
};

#endif // TIME_RANGE_HEADER_H_INCLUDED