<?php

namespace App\Command;

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\Contracts\HttpClient\HttpClientInterface;

/**
 * Commande pour purger l'intégralité du cache Cloudflare.
 */
#[AsCommand(
    name: 'app:cloudflare:purge',
    description: 'Purger l\'intégralité du cache Cloudflare pour la zone configurée.',
)]
class CloudflarePurgeCommand extends Command
{
    private const CLOUDFLARE_API_URL = 'https://api.cloudflare.com/client/v4/zones/%s/purge_cache';

    private string $zoneId;
    private string $apiToken;
    private HttpClientInterface $httpClient;

    public function __construct(HttpClientInterface $httpClient)
    {
        // Les variables sont injectées via le conteneur de services (services.yaml)
        $this->zoneId = $_ENV['CLOUDFLARE_ZONE_ID'];
        $this->apiToken = $_ENV['CLOUDFLARE_API_TOKEN'];
        $this->httpClient = $httpClient;

        parent::__construct();
    }

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

        if (empty($this->zoneId) || empty($this->apiToken)) {
            $io->error('CLOUDFLARE_ZONE_ID ou CLOUDFLARE_API_TOKEN ne sont pas définis. Veuillez vérifier votre fichier .env.');
            return Command::FAILURE;
        }

        $io->note(sprintf('Tentative de purge pour la zone Cloudflare: %s', $this->zoneId));

        try {
            // L'API Cloudflare nécessite une requête DELETE
            $response = $this->httpClient->request(
                'POST', // Cloudflare utilise POST pour la purge.
                sprintf(self::CLOUDFLARE_API_URL, $this->zoneId),
                [
                    'headers' => [
                        // Utilisation du Token API (méthode recommandée par Cloudflare)
                        'Authorization' => 'Bearer ' . $this->apiToken,
                        'Content-Type' => 'application/json',
                    ],
                    // Le payload pour purger tout le cache
                    'json' => [
                        'purge_everything' => true,
                    ],
                ]
            );

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

            if ($statusCode === 200 && $content['success'] === true) {
                $io->success(sprintf('Cache Cloudflare entièrement purgé pour la zone %s.', $this->zoneId));
                return Command::SUCCESS;
            } else {
                $errors = array_map(fn($e) => $e['message'], $content['errors'] ?? []);
                $io->error(sprintf(
                    "La purge du cache a échoué (HTTP %d). Erreur(s) Cloudflare: %s",
                    $statusCode,
                    implode('; ', $errors)
                ));
                return Command::FAILURE;
            }
        } catch (\Exception $e) {
            $io->error('Erreur lors de la communication avec l\'API Cloudflare: ' . $e->getMessage());
            return Command::FAILURE;
        }
    }
}
