<?php

declare(strict_types=1);

namespace Fennec\Console\Command;

use Fennec\Console\CommandInterface;
use Fennec\Console\ConsoleOutput;

/**
 * Génère une nouvelle valeur JWT_SECRET et la met à jour dans le fichier .env.local.
 *
 * Utile en particulier quand fennec/ sert de gabarit dupliqué pour un nouveau projet :
 * chaque projet doit avoir son propre secret, jamais partagé entre deux copies.
 */
final class KeyGenerateCommand implements CommandInterface
{
    public function __construct(
        private readonly ConsoleOutput $output,
        private readonly string $envFilePath,
    ) {
    }

    public function getName(): string
    {
        return 'key:generate';
    }

    public function getDescription(): string
    {
        return 'Génère un nouveau JWT_SECRET et le met à jour dans .env.local.';
    }

    public function execute(array $arguments): int
    {
        if (!\is_file($this->envFilePath)) {
            $this->output->error(\sprintf('Fichier introuvable : %s', $this->envFilePath));

            return 1;
        }

        $newSecret = \bin2hex(\random_bytes(32));
        $content = \file_get_contents($this->envFilePath);

        $content = \preg_match('/^JWT_SECRET=.*$/m', $content) === 1
            ? \preg_replace('/^JWT_SECRET=.*$/m', 'JWT_SECRET=' . $newSecret, $content)
            : \rtrim($content, "\n") . "\nJWT_SECRET={$newSecret}\n";

        \file_put_contents($this->envFilePath, $content);

        $this->output->success(\sprintf('Nouveau JWT_SECRET généré dans %s.', $this->envFilePath));

        return 0;
    }
}
