<?php

/**
 * 文件功能：扫描并处理超时的求婚记录（48h无响应后失效）
 *
 * 每 5 分钟执行一次，将到期的 pending 求婚设为 expired，戒指标记遗失。
 * 同时广播 MarriageExpired 事件通知求婚方。
 *
 * @author  ChatRoom Laravel
 *
 * @version 1.0.0
 */

namespace App\Jobs;

use App\Events\MarriageExpired;
use App\Models\Marriage;
use App\Services\MarriageService;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Queue\Queueable;

class ExpireMarriageProposals implements ShouldQueue
{
    use Queueable;

    /**
     * 执行 Job：扫描超时求婚并处理。
     */
    public function handle(MarriageService $service): void
    {
        // 查找所有已超时但仍为 pending 的求婚
        Marriage::query()
            ->where('status', 'pending')
            ->where('expires_at', '<=', now())
            ->cursor()
            ->each(function (Marriage $marriage) use ($service) {
                $service->expireProposal($marriage);
                // 广播通知求婚方（若在线则收到）
                broadcast(new MarriageExpired($marriage));
            });
    }
}
