#!/usr/bin/env python3
# SPDX-License-Identifier: MPL-2.0
# SPDX-FileCopyrightText: Copyright (c) 2010-2025 python-nss-ng contributors

import inspect

import nss.io as io
import nss.ssl as ssl
import nss.nss as nss


def isint(obj):
    """Return true if the object is an integer."""
    return isinstance(obj, int)


def isstring(obj):
    """Return true if the object is a string."""
    return isinstance(obj, str)


class Package:
    def __init__(self, modules):
        self.modules = modules


class Class:
    def __init__(self, cls):
        self.cls = cls
        self.name = cls.__name__
        self.methods = [
            x[0]
            for x in inspect.getmembers(self.cls, inspect.ismethoddescriptor)
            if not x[0].startswith("_")
        ]
        self.properties = [
            x[0] for x in inspect.getmembers(cls, inspect.isgetsetdescriptor)
        ]


class Module:
    def __init__(self, module):
        self.module = module
        self.name = module.__name__
        self.classes = [
            Class(x)
            for x in [x[1] for x in inspect.getmembers(self.module, inspect.isclass)]
        ]
        self.functions = [
            x[0] for x in inspect.getmembers(self.module, inspect.isbuiltin)
        ]
        self.ints = [x[0] for x in inspect.getmembers(self.module, isint)]
        self.strings = [x[0] for x in inspect.getmembers(self.module, isstring)]

    def dump(self):
        for cls in self.classes:
            print(f"{self.name}.class.{cls.name}")
            for prop in cls.properties:
                print(f"{self.name}.property.{cls.name}.{prop}")
            for method in cls.methods:
                print(f"{self.name}.method.{cls.name}.{method}()")

        for func in self.functions:
            print(f"{self.name}.function.{func}()")

        for i in self.ints:
            print(f"{self.name}.int.{i}")

        for s in self.strings:
            print(f"{self.name}.str.{s}")


for m in (io, ssl, nss):
    mod = Module(m)
    mod.dump()
