<?php

namespace App\Waitlist\Service;

use App\Waitlist\Entity\WaitlistEntry;
use Doctrine\DBAL\Connection;

/**
 * بستن ردیف‌هایی که بازهٔ خواسته‌شده‌شان گذشته است.
 *
 * ردیف منقضی از قبل هم در تطبیق نمی‌آمد (`desiredTo >= now`)، پس این پاکسازیِ **نمایش**
 * است نه اصلاح رفتار: بدون آن، صفحهٔ لیست انتظار پر می‌شود از انتظارهای مرده و اپراتور
 * نمی‌فهمد کدام‌شان هنوز زنده است.
 *
 * حذف نمی‌کند، وضعیت را عوض می‌کند — چه کسی منتظر ماند و به نتیجه نرسید، خودش داده است.
 */
final class WaitlistExpirer
{
    public function __construct(private readonly Connection $connection) {}

    /**
     * @return int تعداد ردیف‌های منقضی‌شده
     */
    public function expire(?int $now = null): int
    {
        return (int) $this->connection->executeStatement(
            'UPDATE waitlist_entries
                SET status = :expired, updated_at = :now
              WHERE status IN (:open)
                AND desired_to < :now',
            [
                'expired' => WaitlistEntry::STATUS_EXPIRED,
                'now'     => $now ?? time(),
                'open'    => [WaitlistEntry::STATUS_WAITING, WaitlistEntry::STATUS_NOTIFIED],
            ],
            ['open' => \Doctrine\DBAL\ArrayParameterType::STRING],
        );
    }
}
