#!/usr/bin/python
# -*- coding: utf-8 -*-



'''usage: pysed [-h] [-v] [-p] [-l] [-e] [-r] [-i]

Utility that parses and transforms text

optional arguments:
  -h, --help     show this help message and exit
  -v, --version  print version and exit
  -p, --print    print text
  -l, --lines	 print lines
		 'num' ['>', '<', '*']
  -e, --extract	 extract text
		 'text'
  -r, --replace  replace text
		 m max(num)/, u upper/, l lower/ ['^', ',', '*']
  -i, --insert	 insert text
                 m max(num)/'''




import re
import os
import sys
import platform


__prog__ = 'pysed'
__author__ = "dslackw"
__version__ = "0.1.1"
__license__ = "GNU General Public License v3 (GPLv3)"
__email__ = "d.zlatanidis@gmail.com"



if platform.system() == 'Linux':
	path = os.getcwd() + '/'

elif platform.system() == 'Windows':
	path = os.getcwd() + '\/'


def get_from_arg(arg):
	result = []
	for char in arg:
        	result.append(char)
        	if char == '/':
                	break

	return ''.join(result).replace('/','')



def get_nums(text):

	nums = '0123456789'

	result = []
	for t in text:
        	for n in nums:
                	if n == t:
                        	result.append(n)

	return ''.join(result)



def print_text(file, arg0, arg1, arg2, arg3):
	result = []

	extra_arg = get_from_arg(arg2)
	arg2 = arg2.replace(extra_arg + '/', '')

	nums = get_nums(extra_arg)
	extra_arg = extra_arg.replace(nums, '')
	if nums == '':
		nums = 0
	
	try :
		file = open(path + file, 'r')
	       	read = file.read()
        	file.close()


		try:
		        find_text = re.findall(arg2, read)
			if find_text == []:
				sys.exit()
		except re.error:
			sys.exit()

		if arg0 == '-p' or arg0 == '--print':
			print read,
			sys.exit()
		
		elif arg0 == '-l' or arg0 == '--lines':
			for line in read.splitlines():
			        result.append(line)

			if arg1 == '*':
				for num in result:
					print num
				sys.exit()

			elif arg1 == '>':
				print result[0]
				sys.exit()

			elif arg1 == '<':
				print result[len(result) -1] 
				sys.exit()

			else:

				try:
					line_nums = arg1.replace(',', '\n').split()
	
					for num in line_nums:
						if int(num) >= len(result):
							pass
						else:
							print result[int(num)]
					sys.exit()
				except ValueError:
					sys.exit()


		elif arg0 == '-e' or arg0 == '--extract':
			try:
				find_text = re.findall(arg1, read)
				print ' '.join(find_text)
			except re.error:
                        	sys.exit()


		elif arg0 == '-r' or arg0 == '--replace':
			if extra_arg == 'm':
	               	        result = read.replace(find_text[0], arg3, int(nums))

			elif extra_arg == 'u' and arg3 == '^':
				result = read.replace(find_text[0], find_text[0].upper())

			elif extra_arg == 'u' and arg3 == '*':
				result = read.upper()

			elif extra_arg == 'l' and arg3 == ',':
				result = read.replace(find_text[0], find_text[0].lower())			

			elif extra_arg == 'l' and arg3 == '*':
				result = read.lower()

			else:
				result = read.replace(find_text[0], arg3)

		elif arg0 == '-i' or arg0 == '--insert':
			if extra_arg == 'm':
	               	        result = read.replace(find_text[0], find_text[0] + arg3, int(nums))
			
			else:
				result = read.replace(find_text[0], find_text[0] + arg3)
		else:

			arguments_error(arg0, '')			



	        if result != []:
        	        print result,	

	except IOError:
                print ("%s: can't read %s: No such file or directory" % (__prog__, file))




def replace_text(file, arg1, arg2):
	result = []

	extra_arg = get_from_arg(arg1)
        arg1 = arg1.replace(extra_arg + '/', '')

        nums = get_nums(extra_arg)
        extra_arg = extra_arg.replace(nums, '')
        if nums == '':
                nums = 0

	try:
	        file =  open(path + file, 'r+')
		read = file.read()
	
		try:
			find_text = re.findall(arg1, read)
			if find_text == []:
                                sys.exit()
		except re.error:
			sys.exit()

		if extra_arg == 'm':
			result = read.replace(find_text[0], arg2, int(nums))

		elif extra_arg == 'u' and arg2 == '^':
	                result = read.replace(find_text[0], find_text[0].upper())

                elif extra_arg == 'u' and arg2 == '*':
        	        result = read.upper()

                elif extra_arg == 'l' and arg2 == ',':
                	result = read.replace(find_text[0], find_text[0].lower())

                elif extra_arg == 'l' and arg2 == '*':
	                result = read.lower()

		else:
			result = read.replace(find_text[0], arg2)
		
	
	        if result != []:
			file.seek(0)
			file.truncate()
			file.write(result)

		file.close()

	except IOError:
		print ("%s: can't read %s: No such file or directory" % (__prog__, file))



def append_text(file, arg1, arg2):
	result = []

	extra_arg = get_from_arg(arg1)
        arg1 = arg1.replace(extra_arg + '/', '')

        nums = get_nums(extra_arg)
        extra_arg = extra_arg.replace(nums, '')
        if nums == '':
                nums = 0


	try:
		file = open(path + file, 'r+')
        	read = file.read()
	
		try:
		        find_text = re.findall(arg1, read)
			if find_text == []:
                                sys.exit()
		except re.error:
        	        sys.exit()
	
		if extra_arg == 'm':
			result = read.replace(find_text[0], find_text[0] + arg2, int(nums))

                else:
   			result = read.replace(find_text[0], find_text[0] + arg2)



	        if result != []:
			file.seek(0)
			file.truncate()
	                file.write(result)

	        file.close()

	except IOError:
		print ("%s: can't read %s: No such file or directory" % (__prog__, file))



def version():
	print ('version :'),  __version__	
	print ('License :'),  __license__
	print ('Email   :'),  __email__



def arguments_view():
	print ('usage: pysed [-h] [-v] [-p] [-l] [-e] [-r] [-i]\n')
        print ('Utility that parses and transforms text\n')
        print ('optional arguments:')
        print ('  -h, --help     show this help message and exit')
        print ('  -v, --version  print version and exit')
        print ('  -p, --print    print text')
	print ('  -l, --lines	 print lines')
	print ('		 \'num\' [\'>\', \'<\', \'*\']')
	print ('  -e, --extract	 extract text')
	print ('		 \'text\'')
        print ('  -r, --replace  replace text')
	print ('		 m max(num)/, u upper/, l lower/ [\'^\', \',\', \'*\']')
        print ('  -i, --insert	 insert text')
	print ('                 m max(num)/')



def arguments_error(arg0, argx):
	print ('usage: %s [-h] [-v] [-p] [-l] [-e] [-r] [-i]\n' % __prog__)

	if arg0 == '':
		print ('%s: error: argument: expected one argument' % __prog__)


	elif arg0 in ['-p', '--print',
		      '-l', '--lines',
		      '-e', '--extract',
		      '-r', '--replace',
		      '-i', '--insert']:
		print ('%s: argument %s: expected at least one argument' % (__prog__, arg0))

	else:
		print ('%s: error: unrecognized arguments: %s %s' % (__prog__, arg0, ' '.join(argx)))



def main():

	arg = sys.argv
	arg.pop(0)


	if len(arg) == 2:
		file = arg[1]

        elif len(arg) == 3:
                file = arg[2]

	elif len(arg) == 4:
		file = arg[3]

	elif len(arg) == 5:
		file = arg[4]


	if len(arg) == 0:
		arguments_error('', '')

	elif len(arg) == 1 and arg[0] == '-h' or len(arg) == 1 and arg[0] == '--help':
		arguments_view()

	elif len(arg) == 1 and arg[0] == '-v' or len(arg) == 1 and arg[0] == '--version':
		version()

	elif len(arg) == 2 and arg[0] == '-p' or len(arg) == 2 and arg[0] == '--print':
		print_text(file, arg[0], arg[1], '', '')

	elif len(arg) == 5 and arg[1] == '-p' or len(arg) == 5 and arg[1] == '--print':
		print_text(file, arg[0], arg[1], arg[2], arg[3])

	elif len(arg) == 3 and arg[0] == '-l' or len(arg) == 3 and arg[0] == '--lines':
                print_text(file, arg[0], arg[1], '', '')

	elif len(arg) == 3 and arg[0] == '-e' or len(arg) == 3 and arg[0] == '--extract':
                print_text(file, arg[0], arg[1], '', '')

	elif len(arg) == 4 and arg[0] == '-r' or len(arg) == 4 and arg[0] == '--replace':
		replace_text(file, arg[1], arg[2])

	elif len(arg) == 4 and arg[0] == '-i' or len(arg) == 4 and arg[0] == '--insert':
		append_text(file, arg[1], arg[2])

	elif not any([
		len(arg) == 1 and arg[0] == '-p', len(arg) == 1 and arg[0] == '--print',
		len(arg) == 1 and arg[0] == '-l', len(arg) == 1 and arg[0] == '--lines',
		len(arg) == 1 and arg[0] == '-e', len(arg) == 1 and arg[0] == '--extract',
		len(arg) == 1 and arg[0] == '-r', len(arg) == 1 and arg[0] == '--replace',
		len(arg) == 1 and arg[0] == '-i', len(arg) == 1 and arg[0] == '--insert',
		]):
		arguments_error(arg[0], arg[1:])

	elif arg[0] in ['-p', '--print',
			'-l', '--lines',
			'-e', '--extract',
			'-r', '--replace',
		        '-i', '--insert']:
		arguments_error(arg[0], arg[1:])



if __name__ == "__main__":
    main()
