<?php

namespace Kylin\AntiAddiction\Models;

use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Kylin\Core\Models\BaseModel;

/**
 * 游戏会话模型
 *
 * 记录每次游戏会话的详细信息，用于防沉迷时长统计和行为分析。
 *
 * @property int $id
 * @property int $user_id
 * @property int $game_id
 * @property \Carbon\Carbon $session_start 会话开始时间
 * @property ?\Carbon\Carbon $session_end   会话结束时间
 * @property int $duration                  会话时长（秒）
 * @property string $ip_address
 * @property ?array $device_info            设备信息（JSON）
 */
class PlaySession extends BaseModel
{
    protected $table = 'kylin_play_sessions';

    protected $fillable = [
        'user_id',
        'game_id',
        'session_start',
        'session_end',
        'duration',
        'ip_address',
        'device_info',
    ];

    protected $casts = [
        'session_start' => 'datetime',
        'session_end' => 'datetime',
        'device_info' => 'array',
    ];

    /**
     * 关联用户
     */
    public function user(): BelongsTo
    {
        $userModel = config('kylin-anti-addiction.models.user', \Kylin\User\Models\User::class);

        return $this->belongsTo($userModel);
    }

    /**
     * 标记会话结束
     */
    public function end(): void
    {
        $this->update([
            'session_end' => now(),
            'duration' => $this->session_start->diffInSeconds(now()),
        ]);
    }

    /**
     * 是否仍在进行中
     */
    public function isActive(): bool
    {
        return $this->session_end === null;
    }

    /**
     * 获取用户当日所有会话总时长（秒）
     */
    public static function dailyTotalDuration(int $userId, int $gameId): int
    {
        return static::where('user_id', $userId)
            ->where('game_id', $gameId)
            ->whereDate('session_start', now()->toDateString())
            ->sum('duration');
    }
}
