<?php
declare(strict_types=1);
namespace App\StartPlatz\Bundle\PartnersBundle\Controller;
use App\StartPlatz\Bundle\PartnersBundle\Entity\Partner;
use App\StartPlatz\Bundle\PartnersBundle\Repository\PartnerRepository;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
/**
* Partner Public Detail Controller (Layer 2)
*
* UP-008: This controller handles the Layer 2 public detail page.
*
* Layer 2 shows:
* - Practice description (praxis-based content)
* - Signal blocks (4 types)
* - NO marketing/sales content
*
* Route: /partners/{slug}
*/
#[Route('/partners')]
class PartnerPublicDetailController extends AbstractController
{
private PartnerRepository $partnerRepository;
public function __construct(
EntityManagerInterface $em
) {
$this->partnerRepository = $em->getRepository(Partner::class);
}
/**
* Layer 2: Public Partner Detail Page
*
* Shows partner's practice description and signals.
* No marketing/sales content, just factual praxis information.
*/
#[Route('/{slug}', name: 'partner_layer2_detail', requirements: ['slug' => '[a-z0-9_\-]+'])]
#[Route('/en/{slug}', name: 'partner_layer2_detail_en', requirements: ['slug' => '[a-z0-9_\-]+'])]
public function detailAction(string $slug, Request $request): Response
{
$isEnglish = str_contains($request->getPathInfo(), '/en/');
$language = $request->query->get('lang', $isEnglish ? 'en' : 'de');
// Find partner entity
$partner = $this->partnerRepository->findBySlug($slug);
if (!$partner || !$partner->isActive()) {
throw $this->createNotFoundException('Partner not found');
}
$team = $partner->getTeam();
// Get signals based on language
$signals = $partner->getSignalsLocalized($language);
// Prepare signal types with labels
$signalTypes = [
'real_problem' => [
'label_de' => 'Echte Probleme',
'label_en' => 'Real Problems',
'icon' => 'exclamation-triangle',
'color' => 'danger',
],
'pattern_constraint' => [
'label_de' => 'Muster & Einschränkungen',
'label_en' => 'Patterns & Constraints',
'icon' => 'puzzle-piece',
'color' => 'warning',
],
'learning_insight' => [
'label_de' => 'Erkenntnisse & Insights',
'label_en' => 'Learnings & Insights',
'icon' => 'lightbulb',
'color' => 'info',
],
'capability_expertise' => [
'label_de' => 'Fähigkeiten & Expertise',
'label_en' => 'Capabilities & Expertise',
'icon' => 'star',
'color' => 'success',
],
];
return $this->render('@StartPlatzPartners/Public/partners-detail.html.twig', [
'partner' => $partner,
'team' => $team,
'language' => $language,
'signals' => $signals,
'signalTypes' => $signalTypes,
'practiceDescription' => $partner->getPracticeDescriptionLocalized($language),
]);
}
}