#ifndef BIERGARTEN_PIPELINE_INCLUDES_BIERGARTEN_DATA_GENERATOR_H_ #define BIERGARTEN_PIPELINE_INCLUDES_BIERGARTEN_DATA_GENERATOR_H_ /** * @file biergarten_pipeline_orchestrator.h * @brief Orchestration for end-to-end brewery and user data generation. * * Coordinates location loading, enrichment, and generation phases to produce * a complete dataset, wiring dependencies selected at the composition root. */ #include #include #include #include "data_generation/data_generator.h" #include "data_model/generated_models.h" #include "services/curated_data/curated_data_service.h" #include "services/database/export_service.h" #include "services/enrichment/enrichment_service.h" #include "services/logging/logger.h" /** * @brief Main orchestrator for the Biergarten data generation pipeline. * * Handles location loading, city enrichment, and brewery/user generation. */ class BiergartenPipelineOrchestrator { public: /** * @brief Constructs the orchestrator with injected pipeline dependencies. * * @param logger Sink for pipeline diagnostics. * @param context_service Provides regional context for locations. * @param generator Implementation (Llama or Mock) for brewery/user * generation. * @param exporter Database backend for persisting generated records. * @param curated_data_service Loads curated location, persona, and name * data used to seed generation. * @param application_options CLI configuration and paths. */ BiergartenPipelineOrchestrator( std::shared_ptr logger, std::unique_ptr context_service, std::unique_ptr generator, std::unique_ptr exporter, std::unique_ptr curated_data_service, const ApplicationOptions& application_options); /** * @brief Run the data generation pipeline. * * Performs the following steps: * 1. Load curated locations from JSON * 2. Resolve context for each city using the injected context service * 3. Generate brewery and user data for sampled cities * * @note STRUCTURAL CONCURRENCY REQUIREMENT: * When transitioned to a multithreaded design, this method MUST * structurally enforce that all deployed worker threads are joined before * returning (e.g. by using std::jthread or a structured concurrency * primitive). This ensures workers do not attempt to log to a closed * channel during application teardown. * * @return true if successful, false if not */ bool Run(); private: std::shared_ptr logger_; std::unique_ptr context_service_; /** * @brief Generator implementation selected at the composition root (Llama * or Mock). */ std::unique_ptr generator_; /** * @brief Storage backend for generated brewery and user records. */ std::unique_ptr exporter_; std::unique_ptr curated_data_service_; ApplicationOptions application_options_; /** * @brief Load locations from JSON and sample cities. * * @return Vector of locations randomly sampled per * PipelineOptions::location_count. */ std::vector QueryCitiesWithCountries(); /** * @brief Generate breweries for enriched cities. * * @param cities Span of enriched city data. */ void GenerateBreweries(std::span cities); /** * @brief Generate users grounded in sampled names and personas for * enriched cities. * * Loads personas.json / forenames-by-country.json / * surnames-by-country.json itself, mirroring how QueryCitiesWithCountries() * owns its own locations.json load. * * @param cities Span of enriched city data. */ void GenerateUsers(std::span cities); /** * @brief Log the generated brewery and user results. */ void LogResults() const; std::vector generated_breweries_; std::vector generated_users_; }; #endif // BIERGARTEN_PIPELINE_INCLUDES_BIERGARTEN_DATA_GENERATOR_H_