<?php

use DocuSign\eSign\Client\ApiClient;

class Agro_DocuSign_Auth
{
    private ApiClient $apiClient;
    
    public static $docusignBasePath = DOCUSIGN_BASE_PATH;
    public static $docusignClientId = DOCUSIGN_CLIENT_ID;
    public static $docusignClientSecret = DOCUSIGN_CLIENT_SECRET;
    public static $docusignApiAccountId = DOCUSIGN_API_ACCOUNT_ID;
    public static $docusignRedirectUri = DOCUSIGN_REDIRECT_URI;
    public static $docusignUserId = DOCUSIGN_USER_ID;

    /**
     * __construct
     *
     * @param string|null $basePaths
     */
    public function __construct(?string $basePath = null)
    {
        $this->apiClient = new ApiClient();
        $this->apiClient->getConfig()->setSSLVerification(false);
        if ($basePath) {
            $this->apiClient->getOAuth()->setBasePath($basePath);
            $this->apiClient->getConfig()->setHost($basePath);
        }
    }

    /**
     * Redireciona para o site da DocuSign para realizar o login
     * Usado no caso de autenticação Code Grant
     */
    public function getAuthCode()
    {
        $authUri = $this->apiClient->getAuthorizationUri(self::$docusignClientId, 'signature', self::$docusignRedirectUri, 'code');

        header("Location: {$authUri}");
    }

    /**
     * Realiza a requisição para buscar o token através do código de acesso
     * Usado no caso de autenticação Code Grant 
     * 
     * @param  string $code
     * @return string|null
     */
    public function getAccessToken(string $code): ?string
    {
        $retorno = $this->apiClient->generateAccessToken(self::$docusignClientId, self::$docusignClientSecret, $code);

        if ($retorno[1] != 200) {
            return null;
        }

        return $retorno[0]->getAccessToken();
    }

    /**
     * Busca o token através da autenticação JWT
     * Usado no caso de autenticação JWT Grant
     *
     * @return string|null
     */
    public function getAccessTokenByJWTUser(): ?string
    {
        $retorno = $this->apiClient->requestJWTUserToken(self::$docusignClientId, self::$docusignUserId, file_get_contents(DOCUSIGN_PRIVATE_KEY_RSA));

        if ($retorno[1] != 200) {
            return null;
        }

        return $retorno[0]->getAccessToken();
    }
        
    /**
     * Retorna a instância de ApiClient
     *
     * @return ApiClient
     */
    public function getApiClient(): ApiClient
    {
        return $this->apiClient;
    }
}
