<?php

namespace App\Console\Commands;

use App\Models\MarketplacePurchase;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Http;

class AddTestLicenseCommand extends Command
{
    protected $signature = 'license:add-test
                            {plugin : Slug du plugin (ex: section-plus)}
                            {--domain=localhost : Domaine pour la licence}';

    protected $description = 'Créer une licence de test sur le serveur et l\'appliquer à un achat existant';

    public function handle(): int
    {
        $url = rtrim(config('marketplace.license.url', ''), '/') . '/api/licenses/create-test';
        $apiKey = config('marketplace.license.api_key');

        if (empty($url) || empty($apiKey)) {
            $this->error('Configurez MARKETPLACE_LICENSE_URL et MARKETPLACE_LICENSE_API_KEY dans .env');
            return 1;
        }

        $plugin = $this->argument('plugin');
        $domain = $this->option('domain');

        $response = Http::timeout(10)
            ->withHeaders(['Authorization' => 'Bearer ' . $apiKey])
            ->post($url, [
                'plugin_slug' => $plugin,
                'domain' => $domain,
            ]);

        if (! $response->successful()) {
            $err = $response->json('error');
            $msg = $response->json('message');
            $this->error('Erreur serveur : '.($msg ?? $err ?? $response->body()));
            if ($response->status() === 401) {
                $this->line('Vérifiez que LICENSE_API_KEY sur le serveur = MARKETPLACE_LICENSE_API_KEY ici.');
            }
            if ($response->status() === 403 && $err === 'create_test_disabled') {
                $this->newLine();
                $this->line('Sur le VPS (SSH), la création de licences se fait sans API publique :');
                $this->line('  php artisan license:create-test '.$plugin.' '.$domain);
                $this->line('Puis copiez la clé dans marketplace_purchases sur le CMS, ou activez LICENSE_ALLOW_API_CREATE_TEST=true uniquement sur un serveur de licence de dev.');
            }
            return 1;
        }

        $data = $response->json();
        $licenseKey = $data['license_key'];

        $purchase = MarketplacePurchase::where('item_type', 'plugin')->where('item_slug', $plugin)->first();

        if ($purchase) {
            $oldKey = (string) ($purchase->license_key ?? '');
            $purchase->update(['license_key' => $licenseKey, 'is_active' => true, 'admin_enabled' => true]);
            foreach (array_unique(array_filter([$oldKey, $licenseKey])) as $k) {
                Cache::forget('license_valid_'.$k.'_'.$plugin);
            }
            $this->info("Licence {$licenseKey} créée et appliquée à l'achat existant de {$plugin}.");
        } else {
            MarketplacePurchase::create([
                'item_type' => 'plugin',
                'item_slug' => $plugin,
                'license_key' => $licenseKey,
                'is_active' => true,
                'admin_enabled' => true,
                'purchased_at' => now(),
            ]);
            $this->info("Licence {$licenseKey} créée. Nouvel achat enregistré pour {$plugin}.");
        }

        $this->line("Domaine autorisé : {$domain}");
        $this->newLine();
        $this->line('Le plugin devrait maintenant être actif. Testez avec : php artisan license:test');

        return 0;
    }
}
