loadMissing(['groups.slides', 'arrangements.arrangementGroups.group']); $groups = $this->buildGroups($song); $arrangements = $this->buildArrangements($song); $ccli = $this->buildCcliMetadata($song); $tempPath = sys_get_temp_dir() . '/' . uniqid('pro-export-') . '.pro'; ProFileGenerator::generateAndWrite($tempPath, $song->title, $groups, $arrangements, $ccli); return $tempPath; } private function buildGroups(Song $song): array { $groups = []; foreach ($song->groups->sortBy('order') as $group) { $slides = []; foreach ($group->slides->sortBy('order') as $slide) { $slideData = ['text' => $slide->text_content ?? '']; if ($slide->text_content_translated) { $slideData['translation'] = $slide->text_content_translated; } $slides[] = $slideData; } $groups[] = [ 'name' => $group->name, 'color' => ProImportService::hexToRgba($group->color), 'slides' => $slides, ]; } return $groups; } private function buildArrangements(Song $song): array { $arrangements = []; $groupIdToName = $song->groups->pluck('name', 'id')->toArray(); foreach ($song->arrangements as $arrangement) { $groupNames = $arrangement->arrangementGroups ->sortBy('order') ->map(fn ($ag) => $groupIdToName[$ag->song_group_id] ?? null) ->filter() ->values() ->toArray(); $arrangements[] = [ 'name' => $arrangement->name, 'groupNames' => $groupNames, ]; } return $arrangements; } private function buildCcliMetadata(Song $song): array { return array_filter([ 'author' => $song->author, 'song_title' => $song->title, 'copyright_year' => $song->copyright_year, 'publisher' => $song->publisher, 'song_number' => $song->ccli_id ? (int) $song->ccli_id : null, ]); } }