<?php

namespace App\BO;

/**
 * UpdatePasswordBo - 更新密码业务对象
 * 用于接收前端的密码更新请求
 */
class UpdatePasswordBo
{
    /**
     * @var string 旧密码（必填）
     */
    public $oldPassword;

    /**
     * @var string 新密码（必填）
     */
    public $newPassword;

    /**
     * 构造函数
     * @param string $oldPassword 旧密码
     * @param string $newPassword 新密码
     */
    public function __construct($oldPassword = '', $newPassword = '')
    {
        $this->oldPassword = $oldPassword;
        $this->newPassword = $newPassword;
    }

    /**
     * 验证密码更新对象的有效性
     * @return array 返回验证结果 ['valid' => bool, 'errors' => array]
     */
    public function validate()
    {
        $errors = [];

        if (empty($this->oldPassword)) {
            $errors[] = '旧密码不能为空';
        }

        if (empty($this->newPassword)) {
            $errors[] = '新密码不能为空';
        }

        if (!empty($this->oldPassword) && !empty($this->newPassword)) {
            if ($this->oldPassword === $this->newPassword) {
                $errors[] = '新密码不能与旧密码相同';
            }

            if (strlen($this->newPassword) < 6) {
                $errors[] = '新密码长度不能少于6个字符';
            }

            if (strlen($this->newPassword) > 32) {
                $errors[] = '新密码长度不能超过32个字符';
            }
        }

        return [
            'valid' => empty($errors),
            'errors' => $errors
        ];
    }

    /**
     * 将对象转换为数组
     * @return array
     */
    public function toArray()
    {
        return [
            'oldPassword' => $this->oldPassword,
            'newPassword' => $this->newPassword,
        ];
    }

    /**
     * 从数组创建对象
     * @param array $data
     * @return UpdatePasswordBo
     */
    public static function fromArray($data)
    {
        return new self(
            $data['oldPassword'] ?? '',
            $data['newPassword'] ?? ''
        );
    }
}
