<?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 BaccaratLossCoverEvent extends Model
{
    /** @use HasFactory<\Database\Factories\BaccaratLossCoverEventFactory> */
    use HasFactory;

    /**
     * 允许批量赋值的字段。
     *
     * @var list<string>
     */
    protected $fillable = [
        'title',
        'description',
        'status',
        'starts_at',
        'ends_at',
        'claim_deadline_at',
        'created_by_user_id',
        'closed_by_user_id',
        'started_notice_sent_at',
        'ended_notice_sent_at',
        'participant_count',
        'compensable_user_count',
        'total_loss_amount',
        'total_claimed_amount',
    ];

    /**
     * 字段类型转换。
     */
    protected function casts(): array
    {
        return [
            'starts_at' => 'datetime',
            'ends_at' => 'datetime',
            'claim_deadline_at' => 'datetime',
            'started_notice_sent_at' => 'datetime',
            'ended_notice_sent_at' => 'datetime',
            'participant_count' => 'integer',
            'compensable_user_count' => 'integer',
            'total_loss_amount' => 'integer',
            'total_claimed_amount' => 'integer',
        ];
    }

    /**
     * 关联：开启活动的用户。
     */
    public function creator(): BelongsTo
    {
        return $this->belongsTo(User::class, 'created_by_user_id');
    }

    /**
     * 关联：结束活动的用户。
     */
    public function closer(): BelongsTo
    {
        return $this->belongsTo(User::class, 'closed_by_user_id');
    }

    /**
     * 关联：活动下的用户聚合记录。
     */
    public function records(): HasMany
    {
        return $this->hasMany(BaccaratLossCoverRecord::class, 'event_id');
    }

    /**
     * 关联：活动下的百家乐下注记录。
     */
    public function bets(): HasMany
    {
        return $this->hasMany(BaccaratBet::class, 'loss_cover_event_id');
    }

    /**
     * 判断活动当前是否允许领取补偿。
     */
    public function isClaimable(): bool
    {
        return $this->status === 'claimable'
            && $this->claim_deadline_at !== null
            && $this->claim_deadline_at->isFuture();
    }

    /**
     * 返回活动状态中文标签。
     */
    public function statusLabel(): string
    {
        return match ($this->status) {
            'scheduled' => '未开始',
            'active' => '进行中',
            'settlement_pending' => '等待结算',
            'claimable' => '可领取',
            'completed' => '已结束',
            'cancelled' => '已取消',
            default => '未知状态',
        };
    }
}
