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

# Fenrir TTY screen reader
# By Chrys, Storm Dragon, and contributers.

from fenrirscreenreader.core import debug
import getpass, time, string, os
from select import select

def removeNonprintable(text):
    # Get the difference of all ASCII characters from the set of printable characters
    nonprintable = set([chr(i) for i in range(128)]).difference(string.printable)
    # Use translate to remove all non-printable characters
    return text.translate({ord(character):None for character in nonprintable})

def insertNewlines(string, every=64):
    return '\n'.join(string[i:i+every] for i in range(0, len(string), every))

def splitEvery(toSplit, every=64):
    return list(toSplit[i:i+every] for i in range(0, len(toSplit), every))
def createScreenEventData(content):
    eventData = {
        'bytes': content,
        'lines': content['lines'],
        'columns': content['columns'],
        'textCursor': 
            {
                'x': int( content['cursor'][0]),
                'y': int( content['cursor'][1])
            },
        'screen': content['screen'],
        'text': content['text'],
        'attributes': content['attributes'],
        'screenUpdateTime': time.time(),
    }
    return eventData.copy() 

def hasMore(fd, timetout=0.05):
    r, _, _ = select([fd], [], [], timetout)
    return (fd in r)

def hasMoreWhat(fdList, timetout=0.05):
    if not isinstance(fdList, list):
        return []  
    elif fdList == []:
        return []
    r, _, _ = select(fdList, [], [], timetout)
    return r

def isValidShell(shell = ''):
    if not isinstance(shell, str):
        return False
    if shell == '':
        return False
    try:
        if not os.path.isfile(shell):
            return False
        if not os.access(shell,os.X_OK):
            return False
    except:
            return False
    return True

def getShell():
    try:
        shell = os.environ["FENRIRSHELL"]
        if isValidShell(shell):
            return shell
    except:
        pass        
    try:
        shell = os.environ["SHELL"]
        if isValidShell(shell):
            return shell
    except:
        pass
    try:
        if os.acess('/etc/passwd'):
            with open('/etc/passwd') as f:
                users = f.readlines()
                for user in users:
                    (username, encrypwd, uid, gid, gecos, homedir, shell) = user.split(':')
                    shell = shell.replace('\n','')
                    if username == getpass.getuser():
                        if isValidShell(shell):
                            return shell
    except:
        pass
    if isValidShell('/bin/bash'):
        return '/bin/bash'
    return '/bin/sh'
