#!/usr/bin/env python3
# -*- coding: utf-8 -*-

#**********************************************************************************
#*                                                                                *
#*                                   Silk Fontend                                 *
#*          ------------------------------------------------------------          *
#*                                                                                *
#**********************************************************************************
#
# Copyright 2025 Antonio Leal, Porto Salvo, Portugal
# All rights reserved.
#
# Redistribution and use of this script, with or without modification, is
# permitted provided that the following conditions are met:
#
# 1. Redistributions of this script must retain the above copyright
#    notice, this list of conditions and the following disclaimer.
#
#  THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
#  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
#  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO
#  EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
#  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
#  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
#  OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
#  WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
#  OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
#  ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# $Id:$

import readline
import rlcompleter
import atexit
import os
import configparser

# set history file
histfile = os.path.join(os.environ['HOME'], '.silkhistory')
try:
    readline.read_history_file(histfile)
except IOError:
    pass
atexit.register(readline.write_history_file, histfile)
del os, histfile, readline, rlcompleter

# show help in first run and ensure silkrc exists
exec(open("/usr/bin/silk").read())

# read silkrc into a tools dictionary
def gettools():
    home = os.path.expanduser('~')
    rc = f'{home}/.config/silkrc'
    config = configparser.ConfigParser()
    config.read(rc)
    tools={}
    for value in ['slapt-get', 'slapt-src', 'sbopkg', 'slackpkg']:
        key = config.get('settings',value)
        tools[key] = value
    return tools

def endmsg():
    print('\nProgram terminated by user.')

def preprompt(tool):
    print(f'\n\033[1;30mYou are running a {tool} shell, please type your commands directly.')
    if tool == 'Silk':
        print('Type "1-4" for entering the corresponding tool sub-shell.')
    print('Type "q", "quit" or press ctrl-d to end your session.\n')

# subshell for slapt-get, slapt-src, sbopkg and slackpkg
def subshell(key):
    os.system('clear')
    tools = gettools()
    try:
        if tools[key] == 'slapt-src':
            os.system(f'sudo /usr/bin/{tools[key]}')
        else:
            os.system(f'sudo /usr/sbin/{tools[key]}')
    except KeyError:
        return
    while(True):
        preprompt(tools[key])
        try:
            cmd = input(f'{tools[key]}>\033[0;0m ')
        except EOFError:
            endmsg()
            return
        except KeyboardInterrupt:
            endmsg()
            return
        if cmd.lower() == 'q' or cmd.lower() == 'quit':
            endmsg()
            return
        os.system('clear')
        if tools[key] == 'slapt-src':
            os.system(f'sudo /usr/bin/{tools[key]} ' + cmd)
        else:
            os.system(f'sudo /usr/sbin/{tools[key]} ' + cmd)

def main():
    while(True):
        preprompt('Silk')
        try:
            cmd = input('Silk>\033[0;0m ')
        except EOFError:
            endmsg()
            exit(0)
        except KeyboardInterrupt:
            endmsg()
            exit(0)
        if cmd.lower() == 'q' or cmd.lower() == 'quit':
            endmsg()
            exit(0)
        if len(cmd) == 1:
            if cmd in '1234':
                subshell(cmd[0])
        sys.argv = ['/usr/bin/silk'] + cmd.split()
        exec(open('/usr/bin/silk').read())

if __name__ == '__main__':
    main()
