<?php namespace RVR\Cli;

use SokoWeb\PersistentData\PersistentDataManager;
use RVR\Repository\OAuthClientRepository;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

class AddOAuthRedirectUriCommand extends Command
{
    public function configure(): void
    {
        $this->setName('oauth:add-redirect-uri')
            ->setDescription('Adding of redirect URI for OAuth client.')
            ->addArgument('client_id', InputArgument::REQUIRED, 'The OAuth client ID')
            ->addArgument('redirect_uris', InputArgument::IS_ARRAY, 'Redirect URIs to add');
    }

    public function execute(InputInterface $input, OutputInterface $output): int
    {
        $oAuthClientRepository = new OAuthClientRepository();
        $oAuthClient = $oAuthClientRepository->getByClientId($input->getArgument('client_id'));

        if ($oAuthClient === null) {
            $output->writeln('<error>OAuth client does not exist!</error>');
            return 1;
        }

        $redirectUris = array_unique(array_merge($oAuthClient->getRedirectUrisArray(), $input->getArgument('redirect_uris')));

        $oAuthClient->setRedirectUrisArray($redirectUris);

        try {
            $pdm = new PersistentDataManager();
            $pdm->saveToDb($oAuthClient);
        } catch (\Exception $e) {
            $output->writeln('<error>Adding redirect URI failed!</error>');
            $output->writeln('');

            $output->writeln((string) $e);
            $output->writeln('');

            return 1;
        }

        $redirectUrisToPrint = [];
        foreach ($redirectUris as $redirectUri) $redirectUrisToPrint[] = '* ' . $redirectUri;

        $output->writeln('<info>Redirect URIS were successfully added! Current URIs:' . "\n" . implode("\n", $redirectUrisToPrint) . '</info>');

        return 0;
    }
}