<?php
/**
 * Created by PhpStorm.
 * User: marcelulbrich
 * Date: 2019-08-13
 * Time: 15:41
 */

namespace Medienreaktor\Products\Service;


use GeorgRinger\News\Domain\Model\Category;
use GeorgRinger\News\Domain\Repository\CategoryRepository;
use GeorgRinger\News\Service\CategoryService;
use Medienreaktor\Products\Domain\Model\ProductGroup;
use Medienreaktor\Products\Domain\Model\Property;
use TYPO3\CMS\Core\Utility\ExtensionManagementUtility;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Extbase\Object\ObjectManager;

class ProductDataService
{

    /**
     * productRepository
     *
     * @var \Medienreaktor\Products\Domain\Repository\ProductRepository
     */
    protected $productRepository = null;

    /**
     * productGroupRepository
     *
     * @var \Medienreaktor\Products\Domain\Repository\ProductGroupRepository
     */
    protected $productGroupRepository = null;

    /**
     * objectManager
     *
     * @var \TYPO3\CMS\Extbase\Object\ObjectManager
     */
    protected $objectManager = null;
    public function __construct(\Medienreaktor\Products\Domain\Repository\ProductRepository $productRepository, \Medienreaktor\Products\Domain\Repository\ProductGroupRepository $productGroupRepository)
    {
        $this->productRepository = $productRepository;
        $this->productGroupRepository = $productGroupRepository;
    }


    /**
     * @param $productGroupId
     * @return array
     */
    public function getProductDataByProductGroupId($productGroupId)
    {

        /** @var ProductGroup $productGroup */
        $productGroup = $this->productGroupRepository->findByUid($productGroupId);
        $data = [];

        $data['productGroup'] = $productGroup;

        if(!isset($productGroup)){
            return null;
        }
        // Sort products by productClass
        if ($productGroup->getProductClasses()->count() > 0) {

            $productsByClass = [];
            foreach ($productGroup->getProducts() as $product) {
                if ($product->getProductClass())
                    $productsByClass[$product->getProductClass()->getUid()][] = $product;
                else
                    $productsByClass[0][] = $product;
            }

            $data['productsByClass'] = $productsByClass;
        }

        // Get all available properties
        $propertyGroups = $productGroup->getPropertyGroups();
        $properties = [];
        $propertiesAvailable = [];
        foreach ($propertyGroups as $propertyGroup) {
            foreach ($propertyGroup->getProperties() as $property) {
                $properties[$property->getUid()] = $property;
            }
        }

        // Find out if the property is actually used by any products
        /** @var Property $property */
        foreach ($properties as $property) {
            $foundInProducts = false;
            foreach ($productGroup->getProducts() as $product) {
                $dynamicProperties = $product->getDistinctDynamicProperties();
                if (array_key_exists($property->getUid(), $dynamicProperties)) {
                    $propValue = $dynamicProperties[$property->getUid()];
                    if ($property->getType() == "input" && !empty($propValue))
                        $foundInProducts = true;
                    else if (($property->getType() == "unit" || $property->getType() == "unit-range") && !empty($propValue) && floatval($propValue))
                        $foundInProducts = true;
                }
                if ($foundInProducts)
                    break;
            }
            if ($foundInProducts)
                $propertiesAvailable[$property->getUid()] = $property;
        }

        $data['availableProperties'] = $propertiesAvailable;

        $categories = $this->productGroupRepository->findCategoriesById($productGroup->getUid());
        $settings = $this->getCategorySettings();

        if (count($categories) && ExtensionManagementUtility::isLoaded("news")) {

            $categoryRepository = Generalutility::makeInstance(CategoryRepository::class);
            $categoriyObjects = $categoryRepository->findByIdList($categories);

            $applicationCategories = explode(",", CategoryService::getChildrenCategories($settings["application"], 0, '', true));
            $productCategoryCategories = explode(",", CategoryService::getChildrenCategories($settings["product"], 0, '', true));

            $applicationCategoriesFiltered = [];
            $productCategoryCategoriesFiltered = [];

            /** @var Category $category */
            foreach ($categoriyObjects as $category) {
                if (in_array($category->getUid(), $applicationCategories))
                    $applicationCategoriesFiltered[] = $category;
                if (in_array($category->getUid(), $productCategoryCategories))
                    $productCategoryCategoriesFiltered[] = $category;
            }

            $data['categories'] = [
                "application" => $applicationCategoriesFiltered,
                "product" => $productCategoryCategoriesFiltered
            ];

        }


        // Find out if there is one variant with a name
        $hasVariantName = false;
        foreach ($productGroup->getProducts() as $product) {
            $name = $product->getName();
            if ($name && !empty($name)) {
                $hasVariantName = true;
                break;
            }
        }
        $data['showVariantName'] = $hasVariantName;

        return $data;
    }


    private function getCategorySettings()
    {
        $configurationManager = GeneralUtility::makeInstance(\TYPO3\CMS\Extbase\Configuration\ConfigurationManager::class);

        $extbaseFrameworkConfiguration = $configurationManager->getConfiguration(\TYPO3\CMS\Extbase\Configuration\ConfigurationManagerInterface::CONFIGURATION_TYPE_FULL_TYPOSCRIPT);

        $settings = $extbaseFrameworkConfiguration['plugin.']['tx_products_catalog.']['settings.'];
        return [
            "application" => $settings["applicationAreaCID"],
            "product" => $settings["productCategoryCID"]
        ];

    }




}