<?php

namespace Kylin\LawCase\Traits;

use Kylin\LawCase\Services\EncryptionService;
use Illuminate\Support\Facades\App;

trait Encryptable
{
    /**
     * 获取加密字段列表
     * 子模型可覆盖此属性
     */
    protected function getEncryptableFields(): array
    {
        return property_exists($this, 'encryptable') ? $this->encryptable : [];
    }

    /**
     * 获取属性值 - 自动解密
     */
    public function getAttributeValue($key)
    {
        $value = parent::getAttributeValue($key);

        if (in_array($key, $this->getEncryptableFields()) && !is_null($value)) {
            return App::make(EncryptionService::class)->decrypt($value);
        }

        return $value;
    }

    /**
     * 设置属性值 - 自动加密
     */
    public function setAttribute($key, $value)
    {
        if (in_array($key, $this->getEncryptableFields()) && !is_null($value)) {
            $value = App::make(EncryptionService::class)->encrypt($value);
        }

        return parent::setAttribute($key, $value);
    }
}
