<?php

declare(strict_types=1);

namespace Kylin\Agriculture\Traits;

use Illuminate\Database\Eloquent\Casts\Attribute;

/**
 * 操作人员脱敏 Trait
 *
 * 依据《个人信息保护法》第二十八条，敏感个人信息需脱敏处理。
 * 在模型序列化/API 输出时自动对操作人员姓名进行脱敏（张**格式）。
 *
 * 使用方式：
 *  use Kylin\Agriculture\Traits\DesensitizesOperator;
 *
 *  class FarmRecord extends Model
 *  {
 *      use DesensitizesOperator;
 *  }
 */
trait DesensitizesOperator
{
    /**
     * 注册操作人员脱敏
     */
    protected static function bootDesensitizesOperator(): void
    {
        if (! config('kylin-agriculture.operator_desensitize', true)) {
            return;
        }

        // 隐藏操作人员原始 ID 字段
        static::addGlobalScope('desensitize', function ($query) {
            // 不隐藏 ID，仅隐藏关联的姓名
        });
    }

    /**
     * 操作人员脱敏访问器
     */
    protected function operatorName(): Attribute
    {
        return Attribute::get(function (): ?string {
            if (! config('kylin-agriculture.operator_desensitize', true)) {
                return $this->operator?->name;
            }

            $name = $this->operator?->name;

            if (! $name) {
                return null;
            }

            // 脱敏规则：保留首尾字符，中间用 * 替换
            return $this->desensitizeName($name);
        });
    }

    /**
     * 姓名脱敏
     *
     * 示例：
     *   张三 → 张*
     *   张三丰 → 张*丰
     *   欧阳娜娜 → 欧**娜
     */
    protected function desensitizeName(string $name): string
    {
        $len = mb_strlen($name);

        if ($len <= 1) {
            return '*';
        }

        if ($len === 2) {
            return mb_substr($name, 0, 1) . '*';
        }

        return mb_substr($name, 0, 1) . str_repeat('*', $len - 2) . mb_substr($name, -1);
    }
}