<?php

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

/**
 * Käufe, deren Zahlung Tage später geplatzt ist.
 *
 * Bei SEPA oder Sofortüberweisung schliesst der Kunde die Kasse ab, und die
 * Zahlung klärt erst danach. Klärt sie NICHT, schickt Stripe
 * `checkout.session.async_payment_failed` — bis zum 31.7.2026 empfangen und
 * ignoriert.
 *
 * Dass daraus kein Auftrag entsteht, war richtig und bleibt so. Falsch war,
 * dass gar nichts entstand: für den Betreiber ein verlorener Verkauf, von dem
 * er nie hört, für den Kunden eine Bestellung, die es nicht gibt.
 *
 * Bewusst KEIN Auftrag und keine Kundenzeile: es hat nie jemand bezahlt. Nur
 * so viel, wie nötig ist, um jemanden zurückzurufen.
 */
return new class extends Migration
{
    public function up(): void
    {
        Schema::create('failed_checkouts', function (Blueprint $table) {
            $table->id();

            // Stripe wiederholt einen Webhook, bis er ein 2xx bekommt. Ohne
            // diese Eindeutigkeit stünde derselbe verlorene Verkauf dreimal da.
            $table->string('stripe_session_id')->unique();

            $table->string('email');
            $table->string('name')->nullable();
            $table->string('plan')->nullable();
            $table->unsignedInteger('amount_cents')->default(0);
            $table->string('currency', 3)->default('EUR');

            $table->timestamp('failed_at');
            $table->timestamp('resolved_at')->nullable()->index();

            /** Warum erledigt — überwiesen, erneut bestellt, nicht erreichbar. */
            $table->text('note')->nullable();

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

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