<?php

namespace App\Command;

use Google\Client;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Style\SymfonyStyle;
use Symfony\Component\HttpKernel\KernelInterface;
use Symfony\Contracts\HttpClient\HttpClientInterface;

/**
 * Commande pour envoyer un produit via l'API Google Content for Shopping en utilisant OAuth 2.0 (Compte de Service).
 */
#[AsCommand(
    name: 'app:google:marchand',
    description: 'Envoie un produit à Google Merchant Center via un jeton OAuth 2.0.',
)]
class GoogleMarchandCommand extends Command
{
    private HttpClientInterface $httpClient;
    private string $merchantId;
    private string $serviceAccountKeyPath;
    private string $apiUrl = 'https://shoppingcontent.googleapis.com/content/v2.1/';

    /**
     * @param string $merchantId L'ID du Merchant Center (Account ID).
     * @param string $serviceAccountKeyFilename Le nom du fichier JSON de clé de compte de service (e.g., 'google.json').
     */
    public function __construct(
        HttpClientInterface $httpClient,
        KernelInterface $kernel,

    ) {
        $this->httpClient = $httpClient;
        $this->merchantId = $_ENV['MARCHAND_ID'];
        // Construit le chemin absolu vers le fichier de clé de compte de service
        $this->serviceAccountKeyPath = $kernel->getProjectDir() . '/google.json';

        parent::__construct();
    }

    protected function execute(InputInterface $input, OutputInterface $output): int
    {
        $io = new SymfonyStyle($input, $output);

        if (empty($this->merchantId) || !file_exists($this->serviceAccountKeyPath)) {
            $io->error('Merchant ID non configuré ou le fichier de clé de compte de service est introuvable à: ' . $this->serviceAccountKeyPath);
            return Command::FAILURE;
        }

        $io->title(sprintf('Envoi d\'un produit à Google Merchant Center (ID: %s)', $this->merchantId));

        // --- 1. AUTHENTIFICATION OAuth 2.0 via Compte de Service ---
        try {
            $io->text('Authentification en cours...');

            $client = new Client();
            $client->setAuthConfig($this->serviceAccountKeyPath);
            // La scope requise pour l'API Content for Shopping (RW)
            $client->setScopes(['https://www.googleapis.com/auth/content']);

            // Demande le jeton d'accès
            $accessToken = $client->fetchAccessTokenWithAssertion()['access_token'] ?? null;

            if (!$accessToken) {
                throw new \Exception('Impossible d\'obtenir un jeton d\'accès à partir des identifiants du compte de service.');
            }

            $io->text('<info>Jeton d\'accès obtenu.</info>');

        } catch (\Exception $e) {
            $io->error('Échec de l\'authentification OAuth 2.0: ' . $e->getMessage());
            return Command::FAILURE;
        }


        // --- 2. PRÉPARATION ET ENVOI DU PRODUIT ---
        $endpoint = sprintf('%s%s/products', $this->apiUrl, $this->merchantId);


        $testProduct = [
            'offerId' => 'OAUTH-TEST-' . time(),
            'title' => 'Produit Authentifié via OAuth Symfony',
            'description' => 'Test d\'intégration API Content for Shopping avec Compte de Service.',
            'link' => 'https://www.mon-site-ecommerce.com/oauth-product-' . time(),
            'imageLink' => 'https://placehold.co/600x400/0000FF/FFFFFF?text=OAuth+2.0',
            'contentLanguage' => 'fr',
            'targetCountry' => 'FR',
            'feedLabel' => 'FR',
            'channel' => 'online',
            'availability' => 'in stock',
            'price' => ['value' => '19.99', 'currency' => 'EUR'],
            'gtin' => '9000000000001',
            'brand' => 'Secure Acme Brand',
        ];

        $io->section('Produit à envoyer');
        $io->text(sprintf('Offer ID: <info>%s</info>', $testProduct['offerId']));

        try {
            // Utilisation du jeton d'accès dans l'en-tête Authorization: Bearer
            $response = $this->httpClient->request('POST', $endpoint, [
                'json' => $testProduct,
                'headers' => [
                    'Content-Type' => 'application/json',
                    'Authorization' => 'Bearer ' . $accessToken,
                ],
            ]);

            $statusCode = $response->getStatusCode();
            $content = $response->toArray(false);

            // 3. Gestion de la réponse
            if ($statusCode >= 200 && $statusCode < 300) {
                $io->success(sprintf('Produit envoyé avec succès. Status: %d', $statusCode));
                $io->text('ID Produit Google (REST ID): ' . ($content['id'] ?? 'N/A'));

                return Command::SUCCESS;
            } else {
                $io->error(sprintf('Échec de l\'envoi du produit. Status: %d', $statusCode));

                $errors = $content['error']['errors'] ?? [];
                if (!empty($errors)) {
                    $io->text('<error>Détails des erreurs Google:</error>');
                    $io->listing(array_map(fn($e) => $e['reason'] . ': ' . $e['message'], $errors));
                }

                $io->comment('Réponse complète de l\'API:');
                $io->write(json_encode($content, JSON_PRETTY_PRINT));

                return Command::FAILURE;
            }

        } catch (\Exception $e) {
            $io->error('Une erreur est survenue lors de la requête API: ' . $e->getMessage());
            return Command::FAILURE;
        }
    }
}
