<?php
declare(strict_types=1);

/**
 * 找回密码令牌，对应 admin_password_reset 表
 * 跟 Auth 的"记住我" cookie 用同一套 selector/validator 模式：链接里只带明文，库里只存哈希
 */
class PasswordReset extends Model
{
    protected string $table = 'admin_password_reset';
    protected string $key = 'admin_password_reset_id';

    private const EXPIRE_MINUTES = 30;

    /**
     * 生成一条新的重置记录，返回拼好的 "selector:validator"（用于拼到邮件里的重置链接）
     */
    public function createForUser(int $adminId): string
    {
        $selector = bin2hex(random_bytes(16));
        $validator = bin2hex(random_bytes(32));

        $this->db->insert($this->table, [
            'admin_password_reset_lnk_admin_id'   => $adminId,
            'admin_password_reset_selector'       => $selector,
            'admin_password_reset_validator_hash' => hash('sha256', $validator),
            'admin_password_reset_expire_time'    => date('Y-m-d H:i:s', time() + self::EXPIRE_MINUTES * 60),
        ]);

        return $selector . ':' . $validator;
    }

    /**
     * 校验 "selector:validator" 令牌是否有效（未过期、未使用、validator 匹配），有效则返回对应的用户记录
     */
    public function findValidUser(string $selector, string $validator): ?array
    {
        $row = $this->db->get($this->table, '*', ['admin_password_reset_selector' => $selector]);

        if (!$row
            || (int) $row['admin_password_reset_used'] === 1
            || strtotime($row['admin_password_reset_expire_time']) < time()
            || !hash_equals($row['admin_password_reset_validator_hash'], hash('sha256', $validator))
        ) {
            return null;
        }

        return $this->db->get('admin_user', '*', ['admin_id' => $row['admin_password_reset_lnk_admin_id']]) ?: null;
    }

    /**
     * 标记令牌已使用（改密码成功后调用，防止同一个链接被重复使用）
     */
    public function markUsed(string $selector): void
    {
        $this->db->update($this->table, ['admin_password_reset_used' => 1], ['admin_password_reset_selector' => $selector]);
    }
}
