#!/usr/bin/env python3
# code=UTF-8
# Copyright 2009 James P Goodwin ped tiny python editor
# This is a tiny editor created by James
import logging
import sys
import curses
import locale
import traceback
import gc
import os
import time
from optparse import OptionParser
from ped_core import editor_common
from ped_core import keymap
from ped_core import version

locale.setlocale(locale.LC_ALL,"")

def main(stdscr, piped_stdin, options, args):
    """ The main driver for the command line invocation of the editor, currently the only arguments are file names or none
    no arguments will launch the file dialog """
    if options.contrast:
        stdscr.bkgdset(' ',curses.A_BOLD)

    if options.dumpkeymap:
        keymap.dumpkeydef()
        keymap.dumpkeymap()
        return ""

    keymap.loadkeydef()
    keymap.loadkeymap()

    from ped_core.editor_manager import EditorManager
    from ped_core.editor_common import EditFile
    from ped_dialog.file_find import filefind
    from ped_core import extension_manager

    extension_manager.register_extensions()

    EditFile.default_readonly = options.readonly
    EditFile.default_backuproot = options.backuproot

    logging.basicConfig(filename=EditFile.get_backup_dir(EditFile.default_backuproot)+"/ped.log")

    gc.enable()
    try:
        e = EditorManager(stdscr)


        if options.filefind:
            fpat = ".*"
            cpat = ""
            recurse = False
            if len(args) > 0:
                fpat = args[0]
            if len(args) > 1:
                cpat = args[1]
            if len(args) > 2:
                if args[2].lower() == 'yes':
                    recurse = True
            if not e.fileFind( fpat, cpat, recurse ):
                return ""

        elif len(args):
            for f in args:
                e.addEditor(editor_common.Editor(stdscr,None,f))

        elif piped_stdin:
            e.addEditor(editor_common.StreamEditor(stdscr,None,time.asctime()+" > STDIN",piped_stdin))

        else:
            e.openEditor()

        e.main()
        e = None
    except Exception as e:
        logging.error(str(e))
        logging.error(traceback.format_exc())
        return str(e)
    return ""

if __name__ == '__main__':
    piped_stdin = None
    if not os.isatty(sys.stdin.fileno()):
        # grab the original stream
        piped_stdin = os.fdopen(os.dup(0))
        # open the terminal
        new_stdin = open(os.ttyname(sys.stdout.fileno()))
        # if it isn't on fd == 0 then force it to be
        if new_stdin.fileno() != 0:
            os.dup2(new_stdin.fileno(),0)
            new_stdin.close()
        # remap stdin object to be fd 0
        sys.stdin = os.fdopen(0)

    argv = sys.argv
    default_options_file = os.path.expanduser("~/.pedopts")
    if os.path.exists(default_options_file):
        default_options = open(default_options_file,"r").readline()
        default_options.strip()
        argv.extend(default_options.split())

    parser = OptionParser(usage="usage: {cmd |} %prog [options] {files to edit}", description="A tiny text editor in python by James P Goodwin.")
    parser.add_option("-f","--file_find", dest="filefind", action="store_true", default=False, help="start in file find mode, optional args file find pattern and text find pattern and recurse yes/no")
    parser.add_option("-c","--contrast", dest="contrast", action="store_true", default=False, help="start display in higher contrast")
    parser.add_option("-r","--readonly", dest="readonly", action="store_true", default=False, help="open file in read only mode")
    parser.add_option("-b","--backuproot", dest="backuproot", default="~", help="directory root for backup dir, if exists will be used, otherwise homedir will be used")
    parser.add_option("-d","--dumpkeymap", dest="dumpkeymap", action="store_true", default=False, help="dump the default keymap to ~/.pedkeymap and default kedefs to ~/.pedkeydef and exit")
    parser.add_option("-v","--version", dest="version", action="store_true", default=False, help="print the current version and exit")
    (options,args) = parser.parse_args(argv[1:])

    os.environ.setdefault('ESCDELAY','25')

    if options.version:
        print("ped version %s"%version.__version__)
        sys.exit(0)

    retval = curses.wrapper(main,piped_stdin,options,args)
    if retval:
        sys.exit(retval)
