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

use Magento\Framework\App\DeploymentConfig;
use Magento\Store\Model\StoreManager;
use Magento\Translation\Model\ResourceModel\TranslateFactory;
use Magento\Translation\Model\ResourceModel\Translate;
use Magento\Framework\App\Config\ConfigSourceInterface;
use Magento\Framework\DataObject;

/**
 * Class for reading translations from DB
 */
class InitialTranslationSource implements ConfigSourceInterface
{
    /**
     * @var TranslateFactory
     */
    private $translateFactory;

    /**
     * @var StoreManager
     */
    private $storeManager;

    /**
     * @var array
     */
    private $data;

    /**
     * @var DeploymentConfig
     */
    private $deploymentConfig;

    /**
     * @param TranslateFactory $translateFactory
     * @param StoreManager $storeManager
     * @param DeploymentConfig $deploymentConfig
     */
    public function __construct(
        TranslateFactory $translateFactory,
        StoreManager $storeManager,
        DeploymentConfig $deploymentConfig
    ) {
        $this->translateFactory = $translateFactory;
        $this->storeManager = $storeManager;
        $this->deploymentConfig = $deploymentConfig;
    }

    /**
     * Read translations for the given 'path' from application initial configuration.
     *
     * @param string $path
     * @return mixed
     */
    public function get($path = '')
    {
        if (!$this->deploymentConfig->isDbAvailable()) {
            return [];
        }

        if (!$this->data) {
            /** @var Translate $translate */
            $translate = $this->translateFactory->create();
            $select = $translate->getConnection()->select()
                ->from($translate->getMainTable(), ['string', 'translate', 'store_id', 'locale'])
                ->order('store_id');
            $translations = [];
            foreach ($translate->getConnection()->fetchAll($select) as $item) {
                $store = $this->storeManager->getStore($item['store_id']);
                $translations[$item['locale']][$store->getCode()][$item['string']] = $item['translate'];
            }
            $this->data = new DataObject($translations);
        }
        return $this->data->getData($path) ?: [];
    }
}