<?php

namespace App\Actions;

use App\Models\Instance;
use App\Services\Proxmox\ProxmoxClient;
use Illuminate\Support\Carbon;
use Illuminate\Support\Facades\Log;

/**
 * Die Cloud eines Kunden abschalten, weil bezahlt werden muss.
 *
 * **Abschalten heisst abschalten.** Geordnet heruntergefahren, mit Zeitlimit,
 * und NICHTS wird gelöscht: keine Platte angefasst, keine Instanz beendet, kein
 * DNS-Eintrag entfernt, kein Backup verworfen. Alles kommt zurück, sobald
 * bezahlt ist — das ist der Unterschied zwischen einer Sperre und einer
 * Kündigung, und er darf im Code nicht verschwimmen.
 *
 * Ein Zustand, kein Ereignis: ein zweiter Tageslauf oder ein neu gestarteter
 * Arbeiterprozess fährt nichts ein zweites Mal herunter.
 */
class SuspendInstance
{
    public function __invoke(Instance $instance): void
    {
        if ($instance->suspended_at !== null) {
            return;
        }

        $vmid = $instance->vmid;
        $node = $instance->host?->node ?? 'pve';

        if ($vmid !== null) {
            // Geordnet, nicht abgewürgt: dem Kunden gehören die Daten darin,
            // und ein hartes Ausschalten riskiert ein beschädigtes Dateisystem
            // für einen Rückstand von ein paar Euro.
            app(ProxmoxClient::class)->shutdownVm($node, (int) $vmid, 120);
        }

        $instance->update(['suspended_at' => Carbon::now()]);

        Log::info('Cloud wegen offener Zahlung abgeschaltet', [
            'instance' => $instance->uuid,
            'vmid' => $vmid,
        ]);
    }
}
