<?php

declare(strict_types=1);

namespace App\Framework\Database\Locks;

/**
 * Value Object für PostgreSQL Advisory Lock Keys
 *
 * Advisory Locks verwenden einen 64-bit Integer Key.
 * Dieser kann aus zwei 32-bit Integers oder einem String-Hash generiert werden.
 */
final readonly class LockKey
{
    private function __construct(
        public int $key
    ) {}

    /**
     * Erstellt einen Lock Key aus einem Integer
     */
    public static function fromInt(int $key): self
    {
        return new self($key);
    }

    /**
     * Erstellt einen Lock Key aus einem String (via Hash)
     *
     * Verwendet CRC32 für deterministische Hash-Generierung
     */
    public static function fromString(string $identifier): self
    {
        return new self(crc32($identifier));
    }

    /**
     * Erstellt einen Lock Key aus zwei Integer-Werten
     *
     * Kombiniert zwei 32-bit Integers zu einem 64-bit Key
     */
    public static function fromPair(int $key1, int $key2): self
    {
        // Verwende PostgreSQL's zwei-Parameter-Variante
        // Wir speichern beide Werte in einem Array für spätere Verwendung
        return new self(($key1 << 32) | ($key2 & 0xFFFFFFFF));
    }

    /**
     * Gibt den Key-Wert zurück
     */
    public function toInt(): int
    {
        return $this->key;
    }

    /**
     * Prüft Gleichheit mit anderem LockKey
     */
    public function equals(self $other): bool
    {
        return $this->key === $other->key;
    }

    public function __toString(): string
    {
        return (string) $this->key;
    }
}
