<?php
/**
 * 2007-2023 PrestaShop
 *
 * NOTICE OF LICENSE
 *
 * This source file is subject to the Academic Free License (AFL 3.0)
 * that is bundled with this package in the file LICENSE.txt.
 * It is also available through the world-wide-web at this URL:
 * http://opensource.org/licenses/afl-3.0.php
 * If you did not receive a copy of the license and are unable to
 * obtain it through the world-wide-web, please send an email
 * to license@prestashop.com so we can send you a copy immediately.
 *
 * DISCLAIMER
 *
 * Do not edit or add to this file if you wish to upgrade PrestaShop to newer
 * versions in the future. If you wish to customize PrestaShop for your
 * needs please refer to http://www.prestashop.com for more information.
 *
 *  @author    PrestaShop SA <contact@prestashop.com>
 *  @copyright 2007-2023 PrestaShop SA
 *  @license   http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
 *  International Registered Trademark & Property of PrestaShop SA
 */
declare(strict_types=1);

namespace PrestaShop\Module\AgileMultisellerPro\Form\Adapter;

use Doctrine\ORM\EntityManagerInterface;
use PrestaShop\PrestaShop\Core\Form\IdentifiableObject\DataHandler\FormDataHandlerInterface;
use PrestaShopBundle\Entity\Repository\LangRepository;
use Symfony\Component\Translation\TranslatorInterface;

if (!defined('_PS_VERSION_')) {
    exit;
}

abstract class AgileAdapterDataHandler implements FormDataHandlerInterface
{
    /**
     * @var EntityManagerInterface
     */
    protected $entityManager;

    /**
     * @var LangRepository
     */
    protected $langRepository;

    /**
     * @var TranslatorInterface
     */
    protected $translator;

    protected $formErrors = [];

    abstract protected function validateData(array $data);

    abstract protected function setNewData(?int $id, array $data): ?int;

    /**
     * @param EntityManagerInterface $entityManager
     * @param LangRepository $langRepository
     * @param TranslatorInterface $translator
     */
    public function __construct(EntityManagerInterface $entityManager, LangRepository $langRepository, TranslatorInterface $translator)
    {
        $this->entityManager = $entityManager;
        $this->langRepository = $langRepository;
        $this->translator = $translator;
    }

    /**
     * Get the translated chain from key.
     *
     * @param string $key the key to be translated
     * @param string $domain the domain to be selected
     * @param array $parameters Optional, pass parameters if needed (uncommon)
     *
     * @returns string
     */
    protected function trans($key, $domain, $parameters = [])
    {
        return $this->translator->trans($key, $parameters, $domain);
    }

    /**
     * {@inheritdoc}
     */
    public function create(array $data)
    {
        return $this->processAction($data);
    }

    /**
     * {@inheritdoc}
     */
    public function update($id, array $data)
    {
        return $this->processAction($data, $id);
    }

    /**
     * {@inheritdoc}
     */
    private function processAction(array $data, int $id = 0)
    {
        if (!isset($data['id'])) {
            $data['id'] = $id;
        }

        $this->validateData($data);

        $this->checkErrors();

        return $this->setNewData($id, $data);
    }

    /**
     * {@inheritdoc}
     */
    protected function checkErrors()
    {
        if (count($this->formErrors)) {
            $number = 1;
            foreach ($this->formErrors as &$errorMessage) {
                $errorMessage = $number . '. ' . $errorMessage;
                ++$number;
            }
            $errorsMessage = implode('</br>', $this->formErrors);
            throw new \Exception($errorsMessage);
        }

        return true;
    }
}
