<?php

namespace Kylin\AntiAddiction\Models;

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

/**
 * 防沉迷记录模型
 *
 * 记录每个用户的防沉迷状态信息，包括年龄分组、每日/累计游戏时长、会话数等。
 * 每个用户一条记录，每日凌晨重置 daily_play_time。
 *
 * @property int $id
 * @property int $user_id
 * @property AgeGroup $age_group
 * @property int $daily_play_time  当日游戏时长（秒）
 * @property int $total_play_time  累计游戏时长（秒）
 * @property string $last_play_date 最后游戏日期（Y-m-d）
 * @property int $session_count     当日会话数
 */
class AntiAddictionRecord extends BaseModel
{
    protected $table = 'kylin_anti_addiction_records';

    protected $fillable = [
        'user_id',
        'age_group',
        'daily_play_time',
        'total_play_time',
        'last_play_date',
        'session_count',
    ];

    protected $casts = [
        'age_group' => AgeGroup::class,
        'last_play_date' => 'date:Y-m-d',
    ];

    protected $attributes = [
        'daily_play_time' => 0,
        'total_play_time' => 0,
        'session_count' => 0,
    ];

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

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

    /**
     * 检查是否需要重置每日数据
     */
    public function needsDailyReset(): bool
    {
        return $this->last_play_date?->format('Y-m-d') !== now()->format('Y-m-d');
    }

    /**
     * 重置每日数据
     */
    public function resetDaily(): void
    {
        $this->update([
            'daily_play_time' => 0,
            'session_count' => 0,
            'last_play_date' => now()->format('Y-m-d'),
        ]);
    }

    /**
     * 累加游戏时长
     */
    public function addPlayTime(int $seconds): void
    {
        if ($this->needsDailyReset()) {
            $this->resetDaily();
        }

        $this->increment('daily_play_time', $seconds);
        $this->increment('total_play_time', $seconds);
    }

    /**
     * 获取当日游戏时长（分钟）
     */
    public function dailyPlayTimeInMinutes(): float
    {
        return round($this->daily_play_time / 60, 1);
    }
}
