<?php

declare(strict_types=1);

namespace Kylin\Fitness\Models;

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

/**
 * 体测数据模型
 *
 * 依据《个人信息保护法》第二十八条：
 * 健康数据（体测数据）属于敏感个人信息，需加密存储。
 *
 * 依据 GB/T 31267-2014 全民健身服务标准：
 * 体测数据需包含身高、体重、体脂率、肌肉量、BMI 等核心指标。
 *
 * @property int    $id
 * @property int    $member_id              会员 ID
 * @property string $test_date              测试日期
 * @property float  $height                 身高 (cm)
 * @property float  $weight                 体重 (kg)
 * @property float  $body_fat_rate          体脂率 (%)
 * @property float  $muscle_mass            肌肉量 (kg)
 * @property float  $basal_metabolic_rate   基础代谢率 (kcal)
 * @property int    $visceral_fat_level     内脏脂肪等级
 * @property float  $bmi                    身体质量指数
 * @property float  $body_water             身体水分量 (kg)
 * @property float  $bone_mass              骨量 (kg)
 * @property string $data_source            数据来源
 * @property string $device_model           设备型号
 * @property array  $raw_data               原始数据（加密存储）
 */
class FitnessTest extends BaseModel
{
    protected $table = 'kylin_fitness_tests';

    protected $fillable = [
        'member_id', 'test_date',
        'height', 'weight', 'body_fat_rate',
        'muscle_mass', 'basal_metabolic_rate',
        'visceral_fat_level', 'bmi',
        'body_water', 'bone_mass',
        'data_source', 'device_model', 'raw_data',
    ];

    protected $casts = [
        'test_date' => 'date',
        'height' => 'float',
        'weight' => 'float',
        'body_fat_rate' => 'float',
        'muscle_mass' => 'float',
        'basal_metabolic_rate' => 'float',
        'visceral_fat_level' => 'integer',
        'bmi' => 'float',
        'body_water' => 'float',
        'bone_mass' => 'float',
        'raw_data' => 'encrypted',
    ];

    /**
     * 所属会员
     */
    public function member(): BelongsTo
    {
        return $this->belongsTo(Member::class, 'member_id');
    }
}