<?php

namespace Shm\ShmPayment\TBankPayment\TBankNominal;

use GuzzleHttp\Client;
use GuzzleHttp\Exception\GuzzleException;
use GuzzleHttp\Psr7\Request;
use Shm\Shm;
use Shm\ShmDB\mDB;
use Shm\ShmPayment\TBankPayment\TBankNominal\TBankNominalCollections\TNominalPaymentInit;
use Shm\ShmRPC\ShmRPCCodeGen\CodeGenPhp\CreateClassByStructure;
use Shm\ShmUtils\ShmInit;

/**
 * Класс для работы с номинальными счетами и платежами Т-Банка
 */
class TBankNominal
{

    protected static $default_http_client_options = [
        //Время ожидания соединения с Tinkoff  — до 1 минуты
        'connect_timeout' => 60,
        // Максимальное время ожидания ответа от Tinkoff  — до 10 минут
        'timeout' => 600,
    ];


    private $nominalBaseUrl = 'https://secured-openapi.tbank.ru/api/v1/nominal-accounts/';

    private $terminalBaseUrl = 'https://securepay.tinkoff.ru/v2/';

    public static $terminalSuccessUrl = null;
    public static $terminalFailUrl = null;
    public static $terminalNotificationUrl = null;

    //Идентификатор терминала. Выдается мерчанту в Т‑Бизнес при заведении терминала.
    public static $TerminalKey = null;
    public static $TerminalPassword = null;

    /**
     * Система налогообложения
     * 
     * @var string
     * osn - общая СН
     * usn_income - упрощенная СН (доходы)
     * usn_income_outcome - упрощенная СН (доходы минус расходы)
     * esn - единый сельскохозяйственный налог
     * patent - патентная СН
     */
    public static $TerminalTaxation = null;



    public static function sendTerminalRequest($method, $data)
    {


        $data['Token'] = self::generateToken($data);
        $url = self::$terminalBaseUrl . $method;

        $headers = [
            'Content-Type' => 'application/json',
        ];

        $client = new Client(self::$default_http_client_options);

        try {
            $request = new Request('POST', $url, $headers, json_encode($data));
            $response = $client->sendAsync($request)->wait();

            $body = json_decode($response->getBody(), true);


            mDB::collection("tBankNominalRequests")->insertOne([
                'method' => $method,
                'request' => $data,
                'response' => $body,
            ]);


            return $body;
        } catch (GuzzleException $e) {

            ShmInit::sendOnError($e);

            mDB::collection("tBankNominalRequests")->insertOne([
                'method' => $method,
                'request' => $data,
                'response' => [
                    'Success' => false,
                    'ErrorCode' => 'REQUEST_FAILED',
                    'Message' => 'Ошибка при выполнении запроса к платежной системе',
                    'Details' => $e->getMessage(),
                ]
            ]);


            return null;
        }
    }

    protected static function generateToken(array $params)
    {
        foreach (['SHOPS', 'RECEIPT', 'DATA'] as $ignore_key) {
            if (isset($params[$ignore_key])) {
                unset($params[$ignore_key]);
            }
        }

        $params['Password'] = self::$TerminalPassword;
        ksort($params);

        $token = '';
        foreach ($params as $param_value) {
            if (is_scalar($param_value)) {
                $token .= $param_value;
            }
        }

        return hash('sha256', $token);
    }
}