<?php

/**
 * ULID Validation Rule - Verwendungsbeispiele
 * 
 * Die ULID Validation Rule verwendet den bestehenden UlidValidator
 * für konsistente ULID-Validierung nach dem offiziellen Standard.
 */

declare(strict_types=1);

use App\Framework\Validation\Rules\Ulid;

// Basis ULID-Validierung
class EntityRequest
{
    public function __construct(
        #[Ulid]
        public readonly string $id,
        
        #[Ulid]
        public readonly string $parentId,
        
        #[Ulid(message: 'Die Benutzer-ID muss eine gültige ULID sein.')]
        public readonly string $userId,
    ) {}
}

// Verwendungsbeispiele:

// ✅ Gültige ULIDs
$validExamples = [
    'id' => '01ARZ3NDEKTSV4RRFFQ69G5FAV',
    'parentId' => '01BX5ZZKBKACTAV9WEVGEMMVRY', 
    'userId' => '01CA2ZZKBKACTAV9WEVGEMMVRY',
];

// ❌ Ungültige ULIDs
$invalidExamples = [
    'id' => '01ARZ3NDEKTSV4RRFFQ69G5F', // Zu kurz (25 statt 26 Zeichen)
    'parentId' => '01ARZ3NDEKTSV4RRFFQ69G5FAVX', // Zu lang (27 Zeichen)
    'userId' => '01ARZ3NDEKTSV4RRFFQ69G5FIV', // Enthält 'I' (nicht erlaubt)
];

/**
 * ULID (Universally Unique Lexicographically Sortable Identifier) Standard:
 *
 * Format: 26 Zeichen in Crockford Base32 Encoding
 * - Erste 10 Zeichen: Zeitstempel (48-bit Unix-Zeit in Millisekunden)
 * - Letzte 16 Zeichen: Zufälliger Teil (80-bit Entropie)
 *
 * Erlaubte Zeichen (Crockford Base32):
 * 0123456789ABCDEFGHJKMNPQRSTVWXYZ
 *
 * Nicht erlaubte Zeichen (um Verwechslungen zu vermeiden):
 * - I (sieht wie 1 aus)
 * - L (sieht wie 1 aus) 
 * - O (sieht wie 0 aus)
 * - U (kann wie V aussehen)
 *
 * Eigenschaften von ULIDs:
 * ✅ Lexikographisch sortierbar (chronologische Ordnung)
 * ✅ URL-sicher (keine Sonderzeichen)
 * ✅ Case-insensitive (obwohl üblicherweise Großbuchstaben verwendet werden)
 * ✅ Monotonisch (innerhalb derselben Millisekunde aufsteigend)
 * ✅ Kompakt (26 Zeichen vs. 36 für UUID mit Bindestrichen)
 *
 * Validierungsregeln:
 * - Exakt 26 Zeichen
 * - Nur Crockford Base32 Zeichen
 * - Keine Leer- oder Sonderzeichen
 * - Case-sensitive (üblicherweise Großbuchstaben)
 *
 * Beispiele für gültige ULIDs:
 * - 01ARZ3NDEKTSV4RRFFQ69G5FAV (Standard-Format)
 * - 00000000000000000000000000 (Minimum ULID)
 * - 7ZZZZZZZZZZZZZZZZZZZZZZZZZ (Maximum timestamp)
 * - GGGGGGGGGGGGGGGGGGGGGGGGGG (Alle G's - technisch gültig)
 */