<?php

namespace App\Services\Draw;

use App\Models\Draw;
use App\Models\AdminUser;
use App\Lottery\DrawStatus;
use Illuminate\Support\Facades\DB;

final class DrawReopenService
{
    public function reopenCooldownDraw(Draw $draw, AdminUser $admin, ?string $reason = null): Draw
    {
        unset($admin, $reason);

        return DB::transaction(function () use ($draw): Draw {
            /** @var Draw $locked */
            $locked = Draw::query()->whereKey($draw->id)->lockForUpdate()->firstOrFail();
            if ($locked->status !== DrawStatus::Cooldown->value) {
                throw new \RuntimeException('draw_not_in_cooldown');
            }
            if ((int) $locked->settle_version > 0) {
                throw new \RuntimeException('draw_already_settled');
            }

            $locked->forceFill([
                'status' => DrawStatus::Closed->value,
                'cooling_end_time' => null,
                'is_reopened' => true,
            ])->save();

            return $locked->refresh();
        });
    }
}
