#!/usr/bin/env python3

import math
import shutil
import sys
import os
import re

from subprocess import check_call, DEVNULL, CalledProcessError

try:
    import psutil
except:
    pass

try:
    from pyfiglet import figlet_format
except ImportError:
    def figlet_format(string, *args, **kwargs):
       return string + '\n'

term_r, term_c = os.popen('stty size', 'r').read().split()

class Termutils:
    BLACK = '\33[30m'
    RED = '\33[31m'
    GREEN = '\33[32m'
    YELLOW = '\33[33m'
    BLUE = '\33[34m'
    MAGENTA = '\33[35m'
    CYAN = '\33[36m'
    WHITE = '\33[37m'
    GREY = '\33[30;1m'
    DISABLE = '\033[0m'

    PADDING = '  '

    @staticmethod
    def print_padded(*arg, **kwarg):
        print(Termutils.PADDING, end='')
        print(*arg, **kwarg)

    @staticmethod
    def print_progress_bar(percent, label='', length=60):
        percent_color = Termutils.GREEN
        bar = '['
        for i in range(0, length):
            if i >= math.ceil(percent * length):
                bar += Termutils.GREY
            elif i == 0:
                bar += Termutils.GREEN
            elif i == math.ceil(length * 0.6):
                bar += Termutils.YELLOW
                percent_color = Termutils.YELLOW
            elif i == math.ceil(length * 0.9):
                bar += Termutils.RED
                percent_color = Termutils.RED

            bar += '='
        bar += '{}]{}{:7.2%}{} {}'.format(
            Termutils.DISABLE,
            percent_color,
            percent,
            Termutils.DISABLE,
            label
        )
        Termutils.print_padded(bar)

def to_gb(bytes_count):
    return bytes_count/1024/1024/1024

def print_hostname():
    print(
          Termutils.CYAN
        + figlet_format(os.uname()[1], 'slant')
        + Termutils.DISABLE
        + '\n'
        + os.popen('uptime').read().strip()
        + '\n'
    )

def print_services():
    if 'MOTD_SERVICES' in os.environ:
        print('Services:')
        for service in set(os.environ['MOTD_SERVICES'].split()):
            Termutils.print_padded('{:<15.15}'.format(service), end='')
            try:
                check_call(['systemctl', 'is-active', service], stdout=DEVNULL, stderr=DEVNULL)
                print('{}  ● active{}'.format(Termutils.GREEN, Termutils.DISABLE))
            except CalledProcessError:
                print('{}  ● inactive{}'.format(Termutils.RED, Termutils.DISABLE))
        print('')


def print_mem():
    try:
        memory = psutil.virtual_memory()
        print('{:<18}  {:6.2f}G used  {:6.2f}G free  {:6.2f}G total'.format(
            'Memory:',
            to_gb(memory.used),
            to_gb(memory.free),
            to_gb(memory.total)
        ))
        Termutils.print_progress_bar(memory.used / memory.total)
        print('')
    except NameError:
        pass


def print_fs():
    print('Filesystems:')
    with open('/etc/mtab') as mtab:
        for line in mtab:
            line = line.strip()
            if line.startswith('/'):
                mount_point = line.split()[1]
                usage = shutil.disk_usage(mount_point)
                Termutils.print_padded('{:<15.15}  {:7.2f}G used  {:7.2f}G free  {:7.2f}G total'.format(
                    mount_point,
                    to_gb(usage.used),
                    to_gb(usage.free),
                    to_gb(usage.total)
                ))
                Termutils.print_progress_bar(
                    percent=(usage.used / usage.total)
                )
    print('')

def print_tmux():
    try:
        check_call(['tmux', 'info'], stdout=DEVNULL, stderr=DEVNULL)
        print('tmux:')
        tmux_session = os.popen('tmux display-message -p "#S"', 'r').read().strip()
        with os.popen('tmux list-sessions', 'r') as tmux_ls:
            for line in tmux_ls:
                line = line.strip()
                if line.startswith(tmux_session) and 'TMUX' in os.environ:
                    print(Termutils.GREEN, end='')
                Termutils.print_padded(
                      line
                    + Termutils.DISABLE)
        print('')
    except CalledProcessError:
        pass


print_hostname()
print_services()
print_mem()
print_fs()
print_tmux()