#ifndef TICKET_GENERATOR_H #define TICKET_GENERATOR_H #include "base_generator.h" #include "date_time_generator.h" #include "tickets_repository_interface.h" #include #include #include #include // Forward declaration class HallsRepositoryInterface; class SessionsRepositoryInterface; class TicketsRepositoryInterface; class TicketGenerator : public BaseGenerator, public DateTimeGenerator { private: struct ReservationContext { QDateTime beginAt; QDateTime soldAt; qint32 seatNumber; qint32 sessionId; }; private: static std::random_device rd_; static std::mt19937 generator_; private: QMap sessionIdToBeginAt_; QMap /* availableSeatNumbers */> sessionIdToAvailableSeatNumbers_; QPair fillRatioPerSessionRange_; ReservationContext reservationContext_; qsizetype remainingCapacity_; HallsRepositoryInterface *hallsRepository_; SessionsRepositoryInterface *sessionsRepository_; TicketsRepositoryInterface *ticketsRepository_; public: TicketGenerator(const QPair &dayRange, const QPair &timeRange, const QPair &fillRatioPerSessionRange); private: void initializeRemainingCapacity(); void initializeRepositories(); void initializeSessionIdToAvailableSeatMap(); void initializeSessionIdToBeginAtMap(); bool setFillRatioPerSessionRange(const QPair &range); double generateFillRatioPerSession() const; // Vitual methods private: // Const methods QString createFailureMessage(const QString &errorMessage) const override; QString createSuccessMessage() const override; qsizetype calculateRemainingCapacity() const override; private: // Non-const methods RepositoryResult createRecord() override; bool prepareData() override; void clearStaleData() override; }; #endif // TICKET_GENERATOR_H