'bool', 'last_login_at' => 'datetime' ]; public function setPassword(string $password): void { $this->password = password_hash($password, PASSWORD_DEFAULT); } public function verifyPassword(string $password): bool { return password_verify($password, $this->password); } public function isAdmin(): bool { return $this->role === 'admin'; } public function updateLastLogin(string $ip = null): bool { return $this->update($this->id, [ 'last_login_at' => date('Y-m-d H:i:s'), 'login_ip' => $ip ]); } public static function findByUsername(\PDO $pdo, string $username): ?array { $stmt = $pdo->prepare("SELECT * FROM users WHERE username = :username AND is_active = 1"); $stmt->execute(['username' => $username]); return $stmt->fetch(\PDO::FETCH_ASSOC) ?: null; } public static function findByEmail(\PDO $pdo, string $email): ?array { $stmt = $pdo->prepare("SELECT * FROM users WHERE email = :email AND is_active = 1"); $stmt->execute(['email' => $email]); return $stmt->fetch(\PDO::FETCH_ASSOC) ?: null; } public static function createAdmin(\PDO $pdo, string $username, string $email, string $password): int { $data = [ 'username' => $username, 'email' => $email, 'role' => 'admin', 'is_active' => true ]; $userModel = new self($pdo); $userModel->setPassword($password); $data['password'] = $userModel->password; return $userModel->create($data); } public static function getStats(\PDO $pdo): array { $stmt = $pdo->query(" SELECT COUNT(*) as total_users, COUNT(CASE WHEN role = 'admin' THEN 1 END) as admin_users, COUNT(CASE WHEN last_login_at IS NOT NULL THEN 1 END) as active_users FROM users "); return $stmt->fetch(\PDO::FETCH_ASSOC); } }