<?php

namespace Medienreaktor\Career\Command;

use GuzzleHttp\Exception\ClientException;
use TYPO3\CMS\Core\Core\Environment;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Style\SymfonyStyle;
use TYPO3\CMS\Core\Http\RequestFactory;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Core\Database\ConnectionPool;
use TYPO3\CMS\Core\Database\Connection;
class RefreshApiToken extends Command
{
    protected const API_ENDPOINT = "https://accounts.zoho.eu/oauth/v2/token";
    protected function configure(): void
    {
        $this->setDescription('Refresh ZoHo Api Token');
    }

    protected function execute(InputInterface $input, OutputInterface $output): int
    {

        $tokenData = $this->getLatestAccessTokenData();
        $response = $this->rawApiCall($tokenData);

        $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('tx_career_api_token_collection');
        $affectedRows = $queryBuilder
            ->insert('tx_career_api_token_collection')->values([
            'access_token' => $response['access_token'],
            'refresh_token' => '',
            'client_id' => '',
            'client_secret' => '',
            'api_domain' => $response['api_domain'],
            'token_type' => $response['token_type'],
            'expires_in' => $response['expires_in'],
            'is_refresh' => 1,
            'crdate' => time(),
        ])->executeStatement();


        return 0;
    }

    protected function getLatestAccessTokenData(){
        $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('tx_career_api_token_collection');
        $statement = $queryBuilder
            ->select('refresh_token', 'client_id', 'client_secret')
            ->from('tx_career_api_token_collection')
            ->where(
                $queryBuilder->expr()->eq('is_refresh', $queryBuilder->createNamedParameter('0'))
            )
            ->andWhere(
                $queryBuilder->expr()->neq('refresh_token', $queryBuilder->createNamedParameter(''))
            )
            ->addOrderBy('crdate', 'DESC')->setMaxResults(1)->executeQuery();

            if($statement){
                while ($row = $statement->fetch()) {
                    return $row;
                }
            } else{
                return 0;
            }

    }

    protected function rawApiCall($tokenData): ?array {

        /** @var RequestFactory $requestFactory */
        $requestFactory = GeneralUtility::makeInstance(RequestFactory::class);
        $url = self::API_ENDPOINT;

        $additionalOptions = [
            'form_params' => [
                'grant_type' => 'refresh_token',
                'client_id' => $tokenData['client_id'],
                'client_secret' => $tokenData['client_secret'],
                'refresh_token' => $tokenData['refresh_token'],
            ],

        ];

        try {
            $response = $requestFactory->request($url, 'POST', $additionalOptions);
        } catch (ClientException $exception) {
            return null;
        }
        return json_decode($response->getBody()->getContents(), true);
    }
}