<?php

/**
 * 文件功能：节日福利发放批次模型
 *
 * 记录节日福利模板的每一次实际发放批次，
 * 承担领取有效期、批次统计与历史追踪职责。
 */

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany;

/**
 * 类功能：封装节日福利单次发放批次的时间、状态和领取统计。
 */
class HolidayEventRun extends Model
{
    /** @use HasFactory<\Database\Factories\HolidayEventRunFactory> */
    use HasFactory;

    /**
     * 允许批量赋值的字段。
     *
     * @var array<int, string>
     */
    protected $fillable = [
        'holiday_event_id',
        'event_name',
        'event_description',
        'total_amount',
        'max_claimants',
        'distribute_type',
        'min_amount',
        'max_amount',
        'fixed_amount',
        'target_type',
        'target_value',
        'repeat_type',
        'scheduled_for',
        'triggered_at',
        'expires_at',
        'status',
        'audience_count',
        'claimed_count',
        'claimed_amount',
    ];

    /**
     * 属性类型转换。
     *
     * @return array<string, string>
     */
    protected function casts(): array
    {
        return [
            'scheduled_for' => 'datetime',
            'triggered_at' => 'datetime',
            'expires_at' => 'datetime',
            'total_amount' => 'integer',
            'max_claimants' => 'integer',
            'min_amount' => 'integer',
            'max_amount' => 'integer',
            'fixed_amount' => 'integer',
            'audience_count' => 'integer',
            'claimed_count' => 'integer',
            'claimed_amount' => 'integer',
        ];
    }

    /**
     * 关联所属节日福利模板。
     */
    public function holidayEvent(): BelongsTo
    {
        return $this->belongsTo(HolidayEvent::class, 'holiday_event_id');
    }

    /**
     * 关联本批次的领取记录。
     */
    public function claims(): HasMany
    {
        return $this->hasMany(HolidayClaim::class, 'run_id');
    }

    /**
     * 判断当前批次是否仍处于可领取状态。
     */
    public function isClaimable(): bool
    {
        return $this->status === 'active'
            && $this->expires_at !== null
            && $this->expires_at->isFuture();
    }

    /**
     * 查询需要被自动收尾的批次。
     */
    public static function pendingToExpire(): \Illuminate\Database\Eloquent\Collection
    {
        return static::query()
            ->where('status', 'active')
            ->whereNotNull('expires_at')
            ->where('expires_at', '<=', now())
            ->get();
    }
}
