<?php

namespace Kylin\WordFilter\Models;

use Illuminate\Database\Eloquent\Relations\HasMany;
use Kylin\Core\Models\BaseModel;
use Kylin\WordFilter\Enums\RiskLevel;

/**
 * 敏感词分类模型
 *
 * 管理敏感词分类，如政治敏感、色情、暴力、广告等。
 *
 * @property int       $id
 * @property string    $code         分类编码
 * @property string    $name         分类名称
 * @property RiskLevel $risk_level   风险等级
 * @property string    $description  分类描述
 * @property int       $word_count   词数量
 */
class WordCategory extends BaseModel
{
    protected $table = 'kylin_word_categories';

    protected $fillable = [
        'code',
        'name',
        'risk_level',
        'description',
        'word_count',
    ];

    protected $casts = [
        'risk_level' => RiskLevel::class,
        'word_count' => 'integer',
    ];

    /**
     * 分类下的敏感词
     */
    public function words(): HasMany
    {
        return $this->hasMany(SensitiveWord::class, 'category_id');
    }

    /**
     * 是否高风险分类
     */
    public function isHighRisk(): bool
    {
        return $this->risk_level === RiskLevel::High;
    }

    /**
     * 查询作用域：高风险分类
     */
    public function scopeHighRisk($query)
    {
        return $query->where('risk_level', RiskLevel::High->value);
    }

    /**
     * 查询作用域：中风险分类
     */
    public function scopeMediumRisk($query)
    {
        return $query->where('risk_level', RiskLevel::Medium->value);
    }

    /**
     * 根据 code 查找分类
     */
    public static function findByCode(string $code): ?self
    {
        return static::where('code', $code)->first();
    }

    /**
     * 刷新分类下的词数统计
     */
    public function refreshWordCount(): void
    {
        $this->update([
            'word_count' => $this->words()->active()->count(),
        ]);
    }
}
