<?php
/**
 * Copyright © Magento, Inc. All rights reserved.
 * See COPYING.txt for license details.
 */
namespace Magento\Deploy\Service;

use Magento\Framework\Locale\ResolverInterfaceFactory;
use Magento\Framework\Locale\ResolverInterface;
use Magento\RequireJs\Model\FileManagerFactory;
use Magento\Framework\View\DesignInterfaceFactory;
use Magento\Framework\View\Design\Theme\ListInterface;
use Magento\Framework\View\Asset\RepositoryFactory;
use Magento\Framework\RequireJs\ConfigFactory;

/**
 * Deploy RequireJS configuration service
 */
class DeployRequireJsConfig
{
    /**
     * Default jobs amount
     */
    const DEFAULT_JOBS_AMOUNT = 4;

    /**
     * @var ListInterface
     */
    private $themeList;

    /**
     * @var DesignInterfaceFactory
     */
    private $designFactory;

    /**
     * @var RepositoryFactory
     */
    private $assetRepoFactory;

    /**
     * @var FileManagerFactory
     */
    private $fileManagerFactory;

    /**
     * @var ConfigFactory
     */
    private $requireJsConfigFactory;

    /**
     * @var ResolverInterfaceFactory
     */
    private $localeFactory;

    /**
     * DeployRequireJsConfig constructor
     *
     * @param ListInterface $themeList
     * @param DesignInterfaceFactory $designFactory
     * @param RepositoryFactory $assetRepoFactory
     * @param FileManagerFactory $fileManagerFactory
     * @param ConfigFactory $requireJsConfigFactory
     * @param ResolverInterfaceFactory $localeFactory
     */
    public function __construct(
        ListInterface $themeList,
        DesignInterfaceFactory $designFactory,
        RepositoryFactory $assetRepoFactory,
        FileManagerFactory $fileManagerFactory,
        ConfigFactory $requireJsConfigFactory,
        ResolverInterfaceFactory $localeFactory
    ) {
        $this->themeList = $themeList;
        $this->designFactory = $designFactory;
        $this->assetRepoFactory = $assetRepoFactory;
        $this->fileManagerFactory = $fileManagerFactory;
        $this->requireJsConfigFactory = $requireJsConfigFactory;
        $this->localeFactory = $localeFactory;
    }

    /**
     * @param string $areaCode
     * @param string $themePath
     * @param string $localeCode
     * @return bool true on success
     */
    public function deploy($areaCode, $themePath, $localeCode)
    {
        /** @var \Magento\Framework\View\Design\ThemeInterface $theme */
        $theme = $this->themeList->getThemeByFullPath($areaCode . '/' . $themePath);
        /** @var \Magento\Theme\Model\View\Design $design */
        $design = $this->designFactory->create()->setDesignTheme($theme, $areaCode);
        /** @var ResolverInterface $locale */
        $locale = $this->localeFactory->create();
        $locale->setLocale($localeCode);
        $design->setLocale($locale);

        $assetRepo = $this->assetRepoFactory->create(['design' => $design]);
        /** @var \Magento\RequireJs\Model\FileManager $fileManager */
        $fileManager = $this->fileManagerFactory->create(
            [
                'config' => $this->requireJsConfigFactory->create(
                    [
                        'assetRepo' => $assetRepo,
                        'design' => $design,
                    ]
                ),
                'assetRepo' => $assetRepo,
            ]
        );

        $fileManager->createRequireJsConfigAsset();

        $fileManager->createMinResolverAsset();

        return true;
    }
}