from devlib.module import Module


class HotplugModule(Module):

    name = 'hotplug'
    base_path = '/sys/devices/system/cpu'

    @classmethod
    def probe(cls, target):  # pylint: disable=arguments-differ
        # If a system has just 1 CPU, it makes not sense to hotplug it.
        # If a system has more than 1 CPU, CPU0 could be configured to be not
        # hotpluggable. Thus, check for hotplug support by looking at CPU1
        path = cls._cpu_path(target, 1)
        return target.file_exists(path) and target.is_rooted

    @classmethod
    def _cpu_path(cls, target, cpu):
        if isinstance(cpu, int):
            cpu = 'cpu{}'.format(cpu)
        return target.path.join(cls.base_path, cpu, 'online')

    def online_all(self):
        self.online(*range(self.target.number_of_cpus))

    def online(self, *args):
        for cpu in args:
            self.hotplug(cpu, online=True)

    def offline(self, *args):
        for cpu in args:
            self.hotplug(cpu, online=False)

    def hotplug(self, cpu, online):
        path = self._cpu_path(self.target, cpu)
        if not self.target.file_exists(path):
            return
        value = 1 if online else 0
        self.target.write_value(path, value)

