<?php

/**
 * 文件功能：用户名黑名单模型
 *
 * 支持两种类型的禁用记录：
 *   temp      — 用户改名后旧名称的临时保留（30天），到期后其他人可注册
 *   permanent — 管理员设置的永久禁用词（攻击性词汇、领导人名称等），永不可注册
 *
 * 凡是 isBlocked() 返回 true 的名称，无论注册还是改名均不允许使用。
 *
 * @author   ChatRoom Laravel
 *
 * @version  2.0.0
 */

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class UsernameBlacklist extends Model
{
    protected $table = 'username_blacklist';

    /** 只有 created_at，无 updated_at */
    public $timestamps = false;

    protected $fillable = ['username', 'type', 'reserved_until', 'reason', 'created_at'];

    protected function casts(): array
    {
        return [
            'reserved_until' => 'datetime',
            'created_at' => 'datetime',
        ];
    }

    // ──────────────────────────────────────────
    //  公共查询方法
    // ──────────────────────────────────────────

    /**
     * 获取拦截该名称的具体黑名单记录（如果有）。
     *
     * @param  string  $username  要检测的用户名
     * @return static|null
     */
    public static function getBlockingRecord(string $username): ?self
    {
        // 1. 检查是否存在精确匹配且未过期的“临时改名保留”名称
        $tempRecord = static::where('type', 'temp')
            ->where('username', $username)
            ->where('reserved_until', '>', now())
            ->first();

        if ($tempRecord) {
            return $tempRecord;
        }

        // 2. 检查永久禁用词，改为【模糊匹配】（只要新注册的名字中包含禁用词，拦截）
        // 比如数据库禁用了 "admin"，那么 "admin123" 也会触发拦截
        $permanentRecord = static::where('type', 'permanent')
            ->where('username', '!=', '')
            ->whereRaw('? LIKE CONCAT("%", username, "%")', [$username])
            ->first();

        return $permanentRecord;
    }

    /**
     * 判断给定名称是否被禁止使用。
     *
     * @param  string  $username  要检测的用户名
     */
    public static function isBlocked(string $username): bool
    {
        return static::getBlockingRecord($username) !== null;
    }

    /**
     * 兼容旧调用：isReserved() 等同于 isBlocked()。
     *
     * @param  string  $username  要检测的用户名
     *
     * @deprecated 请使用 isBlocked()
     */
    public static function isReserved(string $username): bool
    {
        return static::isBlocked($username);
    }

    // ──────────────────────────────────────────
    //  作用域（Scopes）
    // ──────────────────────────────────────────

    /**
     * 仅查询永久禁用词（管理员维护的列表）。
     */
    public function scopePermanent($query)
    {
        return $query->where('type', 'permanent');
    }

    /**
     * 仅查询临时保留记录（改名后旧名）。
     */
    public function scopeTemp($query)
    {
        return $query->where('type', 'temp');
    }
}
