import os

from twisted.internet.defer import succeed


class Processes:
    def __init__(self, proc_dir="/proc"):
        self._proc_dir = proc_dir

    def register(self, sysinfo):
        self._sysinfo = sysinfo

    def run(self):
        num_processes = 0
        num_zombies = 0
        for pid in os.listdir(self._proc_dir):
            if not pid.isdigit():
                continue
            status_path = os.path.join(self._proc_dir, pid, "stat")

            try:
                with open(status_path, "rb") as fd:
                    data = fd.read()
            except OSError:
                continue

            num_processes += 1

            if data.split(b" ", 3)[2] == b"Z":
                num_zombies += 1

        if num_zombies:
            if num_zombies == 1:
                msg = "There is 1 zombie process."
            else:
                msg = f"There are {num_zombies:d} zombie processes."
            self._sysinfo.add_note(msg)
        self._sysinfo.add_header("Processes", str(num_processes))
        return succeed(None)
