<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

/**
 * Wem eine Maschine gehört.
 *
 * "Eigener Server" war bisher ein Satz im Angebot und nirgends eine Tatsache:
 * die Platzierung nimmt den ersten aktiven Host im Rechenzentrum, und die
 * Kapazitätszahlen zählen ihn mit. Beides zusammen verkauft denselben Platz
 * zweimal.
 *
 * Null heißt allgemeiner Bestand. Die Beziehung löscht nicht mit dem Kunden:
 * ein Host überlebt seinen Mieter, und die Reservierung wird beim Auszug von
 * Hand gelöst — sonst stünde die Maschine still im Bestand, ohne dass jemand
 * sie angeboten hätte.
 *
 * Deshalb `restrictOnDelete()`, nicht `nullOnDelete()`: die Datenbank selbst
 * darf die Reservierung nicht stillschweigend aufheben, wenn der
 * Kundendatensatz verschwindet (Löschung nach DSGVO wäre der naheliegende
 * Weg dahin). Ein Kunde, dem noch eine Maschine gehört, lässt sich nicht
 * löschen, bis ein Operator sie von Hand freigegeben hat — das Lösen bleibt
 * eine bewusste Handlung, nicht ein Nebeneffekt einer anderen Löschung.
 */
return new class extends Migration
{
    public function up(): void
    {
        Schema::table('hosts', function (Blueprint $table) {
            $table->foreignId('reserved_for_customer_id')->nullable()->after('datacenter')
                ->constrained('customers')->restrictOnDelete();
        });
    }

    public function down(): void
    {
        Schema::table('hosts', function (Blueprint $table) {
            $table->dropConstrainedForeignId('reserved_for_customer_id');
        });
    }
};
