<?php

declare(strict_types=1);

namespace Kylin\SensitiveWord\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany;

/**
 * 敏感词模型
 *
 * 依据 TC260-003 内容安全标准，存储敏感词及其分类。
 * 支持 17 类风险分类：政治/色情/暴力/赌博/诈骗/毒品/邪教/分裂/谣言/极端/广告/侮辱/低俗/标题党/歧视/隐私/网络欺凌。
 *
 * @property int         $id
 * @property string      $word          敏感词
 * @property string      $category      分类编码
 * @property string      $risk_level    风险等级: high/medium/low
 * @property bool        $status        状态（1=启用 0=禁用）
 * @property int|null    $variant_of    变体所属原词 ID
 * @property string|null $variant_type  变体类型: homophone/char_split/pinyin/abbreviation
 * @property string      $version       词库版本号
 * @property string|null $source        词库来源: manual/sync/import
 */
class SensitiveWord extends Model
{
    protected $table = 'ks_sensitive_words';

    protected $fillable = [
        'word',
        'category',
        'risk_level',
        'status',
        'variant_of',
        'variant_type',
        'version',
        'source',
    ];

    protected $casts = [
        'status' => 'boolean',
    ];

    /**
     * 所属分类
     */
    public function categoryModel(): BelongsTo
    {
        return $this->belongsTo(WordCategory::class, 'category', 'code');
    }

    /**
     * 原词（如果是变体）
     */
    public function originalWord(): BelongsTo
    {
        return $this->belongsTo(self::class, 'variant_of');
    }

    /**
     * 变体词列表
     */
    public function variants(): HasMany
    {
        return $this->hasMany(self::class, 'variant_of');
    }

    /**
     * 仅查询启用的词
     */
    public function scopeActive($query)
    {
        return $query->where('status', 1);
    }

    /**
     * 仅查询原词（非变体）
     */
    public function scopeOriginal($query)
    {
        return $query->whereNull('variant_of');
    }

    /**
     * 按风险等级筛选
     */
    public function scopeRiskLevel($query, string $level)
    {
        return $query->where('risk_level', $level);
    }

    /**
     * 是否为变体词
     */
    public function isVariant(): bool
    {
        return $this->variant_of !== null;
    }
}
