from .Framework import ExecutableService


class MailInodes(ExecutableService):

    def __init__(self, *users):
        self.command = 'repquota -a'
        self.users = set([
            'mailnull',
            'postfix',
            'qmailq',
            'exim',
        ])

        self.users.update(users)

        ExecutableService.__init__(self)

    def _get_data(self):
        used_inodes = 0
        raw_output = self._get_raw_data()
        if raw_output:
            for line in self._get_raw_data():
                line_parts = line.split()
                try:
                    # Makes sure that line_parts isn't empty and its a relevant line
                    # All lines with users, have the second column '--'
                    if line_parts and line_parts[1] == '--':
                        if line_parts[0] in self.users:
                            used_inodes += self.parse_repquota(line_parts)['used_inodes']
                except IndexError:
                    pass

        return used_inodes


    def parse_repquota(self, line_parts):
        i = 0
        return_dict = {}

        return_dict['user'] = line_parts[i]
        i += 1

        return_dict['checks'] = line_parts[i]
        i += 1

        return_dict['used_blocks'] = int(line_parts[i])
        i += 1

        return_dict['soft_blocks'] = int(line_parts[i])
        i += 1

        return_dict['hard_blocks'] = int(line_parts[i])
        i += 1

        if return_dict['soft_blocks'] and return_dict['used_blocks'] > return_dict['soft_blocks']:
            return_dict['grace_blocks'] = int(line_parts[i])
            i += 1
        else:
            return_dict['grace_blocks'] = None

        return_dict['used_inodes'] = int(line_parts[i])
        i += 1

        return_dict['soft_inodes'] = int(line_parts[i])
        i += 1

        return_dict['hard_inodes'] = int(line_parts[i])
        i += 1

        if return_dict['soft_inodes'] and return_dict['used_inodes'] > return_dict['soft_inodes']:
            return_dict['grace_inodes'] = int(line_parts[i])
            i += 1
        else:
            return_dict['grace_inodes'] = None

        return return_dict