import psutil
import os
import sys
import signal
import shlex


nargs = len(sys.argv)
proc_name = sys.argv[1] if nargs > 1 else ''
user_name = sys.argv[2] if nargs > 2 else 'all'


def split_quoted_string(input_string):
    return shlex.split(input_string)

def print_process(proc_name = '', username = None):
    nfound = 0
    proc_dict = {}
    for proc in psutil.process_iter(['pid', 'name', 'username', 'cmdline']):
        if username == 'all' or (proc.info['username'] and username in proc.info['username']):
            if proc_name == '' or proc_name in proc.name():
                nfound += 1

                print("-" * 40)
                print(f"process name: {proc.info['name']}")
                args = ''
                if proc.info.get('cmdline', None):
                    filename = os.path.basename(proc.info['cmdline'][0])
                    args = ' '.join(proc.info['cmdline'][1:])
                    if len(args) >= 60: args = args[:60] + ' ...'
#            print(f"exec path: {filename}")
#            print(f"Command Line: ", proc.info['cmdline'][1:])

                print(f"  args : {args}")
                print(f"  owner: {proc.info['username']}")
                print(f"  PID  : {proc.info['pid']}")
                proc_dict[proc.pid] = proc

    if nfound == 0:
        print(f"\nNo process found with {proc_name}.")

    return proc_dict

def kill_process_interactive(proc_name = '', username = None):    
    while True:
        print()
        inf = print_process(proc_name, username)
        print()
        pid = input("input PID to kill [ENTER to terminate] >> ")
        if pid == '': break
        
        try:
            os.kill(int(pid), signal.SIGTERM)
#        if os.kill(pid, signal.SIGKILL):
            print(f"Process {proc_dict[pid]['name']} (PID: {pid}) terminated")
        except:
            print(f"Failed to kill process (PID: {pid})")


    print()
    

print(f"proc_name: {proc_name}")
print(f"user_name: {user_name}")
print_process(proc_name, user_name)
