#ifndef SESSION_GENERATOR_H #define SESSION_GENERATOR_H #include "base_generator.h" #include "reservation_manager.h" #include #include #include #include #include // Forward declaration class SessionsRepositoryInterface; class HallsRepositoryInterface; class MoviesRepositoryInterface; class SessionGenerator : public BaseGenerator { private: struct ReservationContext { QDateTime beginAt; QTime endTime; double ticketPrice; qint32 hallId; qint32 movieId; }; private: QMap movieIdToDurationMinutes_; QMap hallIdToReservationManager_; ReservationContext reservationContext_; ReservationManager reservationReference_; qint64 lowerBoundReservationMs_; qint64 upperBoundReservationMs_; // Repositories HallsRepositoryInterface *hallsRepository_; MoviesRepositoryInterface *moviesRepository_; SessionsRepositoryInterface *sessionsRepository_; public: SessionGenerator(const ReservationManager &reservationReference = {}); // Non-virtual methods private: QTime calculateDuration(ReservationContext context) const; QTime duration(qint32 movieId) const; bool prepareData(qint32 hallId, const QList &movieIds); qsizetype calculateAvailableDaysCount() const; qsizetype calculateAvailableSlotsCount() const; void initializeBounds(); void initializeDayManager(); void initializeHallIdToReservationManagerMap(); void initializeMovieIdToDurationMap(qint32 additionalMinutes); void initializeRepositories(); // 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; private: friend class SessionGeneratorTest; }; #endif // SESSION_GENERATOR_H