<?php

namespace YooMoney\Helpers\OauthHelpers;

use Exception;
use Joomla\Component\Jshopping\Site\Table\PaymentMethodTable;
use Joomla\Database\ParameterType;
use YooMoney\Helpers\LoggerHelper;
use YooMoney\Helpers\StorageHelper;
use YooMoney\Model\KassaPaymentMethod;
use JUri;

/**
 * Класс-адаптер методов для работы с параметрами платежного метода
 */
class OauthDataStorageHelper implements OauthDataStorageHelperInterface
{
    const TABLE_NAME = '#__jshopping_payment_method';
    /*** @var PaymentMethodTable */
    private $paymentMethodModule;

    /*** @var KassaPaymentMethod */
    private $kassaModel;

    /*** @var StorageHelper */
    private $storageHelper;

    /*** @var LoggerHelper */
    private $loggerHelper;

    public function __construct(KassaPaymentMethod $kassaModel)
    {
        $this->paymentMethodModule = $kassaModel->getPaymentMethodModule();
        $this->kassaModel = $kassaModel;
        $this->storageHelper = new StorageHelper();
        $this->loggerHelper = new LoggerHelper();
    }

    /**
     * Получение id платежного метода
     *
     * @return int
     */
    public function getPaymentId()
    {
        return (int)$this->paymentMethodModule->payment_id;
    }

    /**
     * Получение строки параметров из БД
     *
     * @return array
     */
    public function getPaymentParamsDB()
    {
        return $this->paymentMethodModule->payment_params;
    }

    /**
     * Получение shop_id
     *
     * @return string|null
     */
    public function getShopId()
    {
        return $this->kassaModel->getShopId();
    }

    /**
     * Установка значения shop_id
     *
     * @param string $shopId
     * @return bool
     * @throws Exception
     */
    public function saveShopId($shopId)
    {
        $this->kassaModel->setShopId($shopId);
        return $this->save();
    }

    /**
     * Получение state
     *
     * @return string|null
     */
    public function getState()
    {
        return $this->kassaModel->getState();
    }

    /**
     * Установка значения state
     *
     * @param string $state
     * @return bool
     * @throws Exception
     */
    public function saveState($state)
    {
        $this->kassaModel->setState($state);
        return $this->save();
    }

    /**
     * Получение access_token
     *
     * @return string|null
     */
    public function getToken()
    {
        return $this->kassaModel->getOauthToken();
    }

    /**
     * Установка значения access_token и expires_in
     *
     * @param string $token
     * @param string $expiresIn
     * @return bool
     * @throws Exception
     */
    public function saveToken($token, $expiresIn)
    {
        $this->kassaModel->setOauthToken($token, $expiresIn);
        return $this->save();
    }


    /**
     * Сохранение параметров платежного метода в БД
     *
     * @return bool
     * @throws Exception
     */
    public function save()
    {
        $id = $this->getPaymentId();
        $params = $this->storageHelper->prepareQueryParams(
            $this->getPaymentParamsDB(),
            $this->kassaModel->getParams()
        );
        try {
            $db = \JFactory::getDBO();
            $query = $db->getQuery(true)
                        ->update($db->quoteName(self::TABLE_NAME))
                        ->set($db->quoteName('payment_params') . ' = ' . $db->quote($params))
                        ->where($db->quoteName('payment_id') . ' = ' . $db->quote($id));
            $db->setQuery($query);
            return $db->execute();
        } catch (Exception $e) {
            $this->loggerHelper->log('error', 'Error to update payment method. Error: ' . $e->getMessage());
            return false;
        }
    }
}
