#!/usr/bin/env python

# Get needed modules
import yaml
import subprocess
from os import path
from PyQt5.QtCore import QTimer
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *

# Available Updates count holder
avail = ""

# Use config.yml file to allow for compatibility with
# most terminal emulators possible & custom icon / timer duration
with open(path.expanduser("~/.config/systrayUpdater/systrayUpdater.yml")) as f:
    conf = yaml.load(f, yaml.FullLoader)
    term = str(conf['terminal'])
    opt = str(conf['option'])
    wait = int(conf['timer']) * 60000
    icn = path.join(path.expanduser("~/.config/systrayUpdater/"), str(conf['icon']))
    f.close()

# Run checkupdates command
# Populates the available updates count holder
def count():
    cmd = ['checkupdates']
    p1 = subprocess.Popen(cmd, stdout=subprocess.PIPE)
    p2 = subprocess.Popen(['wc', '-l'], stdin=p1.stdout, stdout=subprocess.PIPE)
    output = ((p2.communicate()[0]).decode()).rstrip('\n')
    global avail
    avail = str(output)+" Updates"

# Run system update
def update():
    cmd = [ term, opt, 'fpf', '-U']
    subprocess.Popen(cmd)

# Sets new text for available updates
def newText():
    count()
    option1.setText(avail)
    tray.setToolTip(avail)

# Initially populate available updates
count()

app = QApplication([])
app.setQuitOnLastWindowClosed(False)

# Adding an icon
icon = QIcon(icn)

# Adding item on the menu bar
tray = QSystemTrayIcon()
tray.setIcon(icon)
tray.setToolTip(avail)
tray.setVisible(True)

# Creating the options
menu = QMenu()
option1 = QAction(avail)
option1.triggered.connect(update)
option1.triggered.connect(newText)
menu.addAction(option1)

# Set up timer to update count
timer = QTimer()
timer.timeout.connect(newText)
timer.start(wait)

# To quit the app
quit = QAction("Quit")
quit.triggered.connect(app.quit)
menu.addAction(quit)

# Adding options to the System Tray
tray.setContextMenu(menu)

app.exec_()