#ifndef TICKET_H_INCLUDED
#define TICKET_H_INCLUDED

#include <tuple>
#include <vector>

#include <QDebug>
#include <QDebugStateSaver>
#include <QStringList>
#include <QDateTime>

#define NOT_INITIALIZED         (0)
#define VALID                   (1)
#define INVALID_FROM_DATETIME   (2)
#define INVALID_UNTIL_DATETIME  (3)
#define INVALID_PRICE           (4)
#define STATUS_END              (5)

class Ticket {
    enum {CODE=0, CODE_STR=1, CODE_DESC=3};
public:
    using Status = std::tuple<int, char const*, char const*>;

    explicit Ticket();
    explicit Ticket(QDateTime const &s, QDateTime const &e,
                    int durationMinutesNetto, int durationMinutesBrutto,
                    uint32_t price, Status status);

    explicit operator bool() { return std::get<CODE>(m_status) == VALID; }
    operator QString();

    Status getStatus() const;
    QDateTime getValidFrom() const;
    QDateTime getValidUntil() const;
    uint32_t getPrice() const;

    Status setStatus(Status status);
    void setValidFrom(QDateTime const &validFrom);
    void setValidUntil(QDateTime const &validUnil);
    void setPrice(uint32_t price);

    bool isValid() { return operator bool(); }

    static constexpr const Status s[STATUS_END] = {
        {NOT_INITIALIZED       , "NOT_INITIALIZED"       , "Ticket not initialized"           },
        {VALID                 , "VALID"                 , "Ticket is valid"                  },
        {INVALID_FROM_DATETIME , "INVALID_FROM_DATETIME" , "Ticket has invalid start datetime"},
        {INVALID_UNTIL_DATETIME, "INVALID_UNTIL_DATETIME", "Ticket has invalid end datetime"  },
        {INVALID_PRICE         , "INVALID_PRICE"         , "PARKING NOT ALLOWED: Ticket has invalid price" }
    };

private:
    Status m_status;

    QDateTime m_validFrom;
    QDateTime m_validUntil;
    
    int m_durationMinutesNetto;
    int m_durationMinutesBrutto;

    uint32_t m_price;
};
    
QDebug operator<<(QDebug debug, Ticket::Status const &status);

#endif // TICKET_H_INCLUDED