gaService = $gaService; $this->llmService = $llmService; $this->dataProcessor = $dataProcessor; } /** * Generate report for a specific client * Called by cron job */ public function generateForClient(ClientConfig $client): ?string { \OCP\Util::writeLog("Generating report for: {$client->getName()}"); try { // Fetch GA4 data (last 7 days) $rawData = $this->gaService->fetchGA4Data($client, '7d'); // Process and validate $processed = $this->dataProcessor->process($rawData, $client); // Generate report via LLM $markdown = $this->llmService->generate($processed, $client); // Save to Nextcloud $report = $this->gaService->saveReport($client, $markdown); \OCP\Util::writeLog("Report generated: {$report->getFilePath()}"); return $markdown; } catch (\Exception $e) { \OCP\Util::writeLog("Report generation failed for {$client->getName()}: {$e->getMessage()}"); throw $e; } } /** * Generate reports for all active clients * Called by cron job */ public function generateForAllClients(): array { $clients = $this->gaService->getActiveClients(); $results = []; foreach ($clients as $client) { try { $this->generateForClient($client); $results[$client->getSlug()] = 'success'; } catch (\Exception $e) { $results[$client->getSlug()] = "error: {$e->getMessage()}"; } } return $results; } }