<?php

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

/**
 * Eine Zeile je RÜCKSTANDS-EPISODE, nicht je Vertrag.
 *
 * Eine Spalte an `subscriptions` wäre kürzer gewesen und falsch: ein Kunde
 * kann im März und im Juni in Rückstand geraten, und die zweite Episode
 * überschriebe die erste. Genau die will jemand sehen, wenn der Kunde anruft
 * und fragt, warum schon wieder Gebühren anfallen.
 */
return new class extends Migration
{
    public function up(): void
    {
        Schema::create('dunning_cases', function (Blueprint $table) {
            $table->id();
            $table->foreignId('subscription_id')->constrained()->cascadeOnDelete();

            /**
             * Die gescheiterte Rechnung. EINDEUTIG: Stripe versucht dieselbe
             * mehrfach, und jeder Versuch ist ein eigenes Ereignis — ohne
             * diesen Index entstünden drei Fälle für eine Schuld, mit drei
             * Mahnläufen und dreifachen Gebühren.
             */
            $table->string('stripe_invoice_id')->unique();

            // 0 Hinweis, 1–3 Mahnstufen, 4 gesperrt. Siehe DunningSchedule.
            $table->unsignedTinyInteger('level')->default(0);

            $table->timestamp('opened_at');
            $table->timestamp('next_step_at')->nullable()->index();
            $table->timestamp('settled_at')->nullable()->index();

            /**
             * Die ausgestellten Gebührenrechnungen, eine je Stufe.
             *
             * Als Liste am Fall und nicht als eigene Tabelle: sie werden nur
             * gemeinsam mit ihrem Fall gelesen, nie für sich, und eine Tabelle
             * mit höchstens drei Zeilen je Fall wäre ein Join ohne Gewinn.
             */
            $table->json('fee_invoice_ids')->nullable();

            /** Was ein Mensch eingegriffen hat — Frist verlängert, Fall geschlossen. */
            $table->text('note')->nullable();

            $table->timestamps();
        });
    }

    public function down(): void
    {
        Schema::dropIfExists('dunning_cases');
    }
};
