<?php declare(strict_types=1);
namespace MasterFFL\Checkout\Subscriber;
use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\RequestStack;
use Psr\Log\LoggerInterface;
class AddressSubscriber implements EventSubscriberInterface
{
private RequestStack $requestStack;
private EntityRepositoryInterface $customerRepository;
private LoggerInterface $logger;
public function __construct(
RequestStack $requestStack,
EntityRepositoryInterface $customerRepository,
LoggerInterface $logger
) {
$this->requestStack = $requestStack;
$this->customerRepository = $customerRepository;
$this->logger = $logger;
}
public static function getSubscribedEvents(): array
{
return [
'checkout.customer.before_login' => 'onCustomerBeforeLogin',
'checkout.customer.login' => 'onCustomerLogin'
];
}
public function onCustomerBeforeLogin($event): void
{
try {
$request = $this->requestStack->getCurrentRequest();
if (!$request) return;
$session = $request->getSession();
$fflData = $session->get('ffl_dealer_address');
if ($fflData) {
$this->logger->info('FFL: Preserving FFL data before customer login', [
'dealerId' => $fflData['dealerId'] ?? 'unknown'
]);
// Store temporarily to preserve through login
$session->set('ffl_temp_preserve', $fflData);
}
} catch (\Exception $e) {
$this->logger->error('FFL: Error in onCustomerBeforeLogin', [
'error' => $e->getMessage()
]);
}
}
public function onCustomerLogin($event): void
{
try {
$request = $this->requestStack->getCurrentRequest();
if (!$request) return;
$session = $request->getSession();
$preservedData = $session->get('ffl_temp_preserve');
if ($preservedData) {
$this->logger->info('FFL: Restoring FFL data after customer login');
// Restore FFL data
$session->set('ffl_dealer_address', $preservedData);
$session->set('ffl_dealer_info', [
'dealerId' => $preservedData['dealerId'] ?? '',
'dealerName' => $preservedData['firstName'] ?? 'FFL Dealer',
'dealerData' => $preservedData
]);
// Clean up temporary data
$session->remove('ffl_temp_preserve');
}
} catch (\Exception $e) {
$this->logger->error('FFL: Error in onCustomerLogin', [
'error' => $e->getMessage()
]);
}
}
}