<?php

namespace Autogedal\CategoryReviews\Observer;

use Magento\Framework\Event\Observer;
use Magento\Framework\Event\ObserverInterface;
use Autogedal\CategoryReviews\Model\CategoryReviewsBackendLogic as CategoryReviewsHelper;
use Magento\Catalog\Model\ResourceModel\Product as ProductResource;
use Magento\Framework\Indexer\IndexerRegistry;
use Psr\Log\LoggerInterface;
use Magento\Catalog\Api\ProductRepositoryInterface;
use Magento\Catalog\Api\Data\ProductInterface;

class ReviewSaveAfter implements ObserverInterface
{
    private $categoryReviewsHelper;
    private $productResource;
    private $indexerRegistry;
    private $logger;
    private $productRepository;

    public function __construct(
        CategoryReviewsHelper $categoryReviewsHelper,
        ProductResource $productResource,
        IndexerRegistry $indexerRegistry,
        LoggerInterface $logger,
        ProductRepositoryInterface $productRepository
    ) {
        $this->categoryReviewsHelper = $categoryReviewsHelper;
        $this->productResource = $productResource;
        $this->indexerRegistry = $indexerRegistry;
        $this->logger = $logger;
        $this->productRepository = $productRepository;
    }

    public function execute(Observer $observer)
    {
        $review = $observer->getEvent()->getObject();
        $productId = $review->getEntityPkValue();

        try {
            $product = $this->getProductById($productId);
            if ($product) {
                $categoryIds = $this->productResource->getCategoryIds($product);

                $indexer = $this->indexerRegistry->get('category_reviews_aggregate');
                
                foreach ($categoryIds as $categoryId) {
                    $this->categoryReviewsHelper->clearCategoryCache($categoryId);
                    
                    if (!$indexer->isScheduled()) {
                        $indexer->reindexRow($categoryId);
                    }
                }
            }
        } catch (\Exception $e) {
            $this->logger->error('Error in CategoryReviews partial reindex: ' . $e->getMessage());
        }
    }

    private function getProductById(int $productId): ?ProductInterface
    {
        try {
            return $this->productRepository->getById($productId);
        } catch (\Magento\Framework\Exception\NoSuchEntityException $e) {
            return null;
        }
    }
}
