<?php
/**
 * Magento 2 Google Analytics 4 (GA4) GTM
 *
 * NOTICE OF LICENSE
 *
 * This source file is subject to the Anowave license that is
 * available through the world-wide-web at this URL:
 * https://www.anowave.com/license-agreement/
 *
 * DISCLAIMER
 *
 * Do not edit or add to this file if you wish to upgrade this extension to newer
 * version in the future.
 *
 * @category 	Anowave
 * @package 	Anowave_Ec
 * @copyright 	Copyright (c) 2026 Anowave (https://www.anowave.com/)
 * @license  	https://www.anowave.com/license-agreement/
 */

namespace Anowave\Ec\Controller\Index;

use Magento\Framework\Api\SearchCriteriaBuilder;
use Magento\Framework\App\RequestInterface;
use Magento\Framework\Controller\Result\JsonFactory;
use Magento\Framework\Data\Form\FormKey\Validator;
use Anowave\Ec\Helper\Data;
use Anowave\Ec\Model\Logger;

class Facebook extends Capi
{
    /**
     * @var SearchCriteriaBuilder
     */
    private SearchCriteriaBuilder $searchCriteriaBuilder;

    /**
     * Constructor
     */
    public function __construct(
        RequestInterface $requestInterface,
        JsonFactory $resultFactory,
        Data $helper,
        Logger $logger,
        Validator $validator,
        SearchCriteriaBuilder $searchCriteriaBuilder,
    ) {
        parent::__construct($requestInterface, $resultFactory, $helper, $logger, $validator);

        $this->searchCriteriaBuilder = $searchCriteriaBuilder;
    }

    /**
     * Handle request
     */
    public function handle() : array
    {
        $success = false;

        $payload = $this->getRequest()->getParam('payload');

        if ($payload)
        {
            $api = $this->helper->getFacebookConversionsApi();

            /**
             * Conetnt IDs map
             *
             * @var array $content_ids
             */
            $content_ids = [];

            /**
             * Category
             *
             * @var string $category
             */
            $category = null;

            $preloadedProducts = [];

            switch($this->helper->getFacebookContentId())
            {
                case 'id': $preloadedProducts = $this->resolveIds($payload['ecommerce']['items']); break;
                case 'sku':$preloadedProducts = $this->resolveSkus($payload['ecommerce']['items']); break;
            }
            
            foreach ($payload['ecommerce']['items'] as $entity)
            {
                $content_ids = 
                [
                    $entity['remarketingFacebookId']
                ];

                try
                {
                    $product = $preloadedProducts[$entity['item_id']] ?? null;

                    if (!$product) 
                    {
                        continue;
                    }

                    /**
                     * Set category
                     */
                    $category = $entity['item_category'];

                    $api->trackViewContent($content_ids, $payload['ecommerce']['currency'], $this->helper->getPrice($product), $category, $product->getName());

                    /**
                     * Set response
                     */
                    $success = true;
                }
                catch (\Exception $e) {}
            } 
        }
        
        return 
        [
            'success' => $success
        ];
    }

    private function resolve(array $items = [], string $key = 'entity_id') :  array 
    {
        $products = [];

        $map = array_map(fn($item) => $item['item_id'] ?? null,$items);

        $map = array_filter($map);

        $builder = clone $this->searchCriteriaBuilder;

        $searchCriteria = $builder->addFilter($key, $map, 'in')->create();

        $result = $this->helper->getProductRepository()->getList($searchCriteria);

        foreach ($result->getItems() as $product) {

            $products[('id' === $key ? $product->getId() : $product->getSku())] = $product;
        }

        return $products;
    }

    private function resolveIds(array $items = []) : array
    {
        return $this->resolve($items, 'entity_id');
    }
    
    private function resolveSkus(array $items = []) : array
    {
        return $this->resolve($items, 'sku');
    }
}