<?php

namespace YooMoney\Helpers;

use YooKassa\Client;
use YooMoney\Model\KassaPaymentMethod;
use Psr\Log\LoggerInterface;

/**
 * Фабрика для получения единственного экземпляра клиента API Юkassa
 */
class YookassaClientFactory
{
    private $logger;
    private $kassaModel;
    private $client;

    const CMS_NAME = 'Joomla';
    const FRAMEWORK_NAME = 'JoomShopping';
    const MODULE_NAME = 'Y.CMS Joomshopping';

    public function __construct(LoggerInterface $logger, KassaPaymentMethod $kassaModel)
    {
        $this->logger = $logger;
        $this->kassaModel = $kassaModel;
    }

    /**
     * Установка свойств для user-agent
     * и получение клиента по токену
     *
     * @param string $token
     * @return Client
     */
    public function getClientWithGivenToken($token)
    {
        return $this->getClientSkeleton()->setAuthToken($token);
    }

    /**
     * Установка свойств для user-agent
     * и получение клиента в зависимости от пройденной авторизации
     *
     * @return Client
     */
    public function getClient()
    {
        if (!$this->client) {
            $this->client = $this->getClientSkeleton();
            $this->setClientAuth();
        }
        return $this->client;
    }

    /**
     * Устанавливает значение свойств для user-agent
     *
     * @return Client
     */
    private function getClientSkeleton()
    {
        $client = new Client();
        $client->setLogger($this->logger);
        $userAgent = $client->getApiClient()->getUserAgent();
        $userAgent->setCms(self::CMS_NAME, JVERSION);
        $userAgent->setFramework(self::FRAMEWORK_NAME, \JSFactory::getConfig()->getVersion());
        $userAgent->setModule(self::MODULE_NAME, _JSHOP_YOO_VERSION);

        return $client;
    }

    /**
     * Установка данных по авторизации в зависимости от пройденной авторизации
     *
     * @return void
     */
    private function setClientAuth()
    {
        if ($this->kassaModel->getOauthToken()) {
            $this->client->setAuthToken($this->kassaModel->getOauthToken());
            return;
        }

        $this->client->setAuth(
            $this->kassaModel->getShopId(),
            $this->kassaModel->getPassword()
        );
    }
}
