#!/usr/bin/python2

print """
Variable Grabbler - version 4.0_pre6
------------------------------------"""
################################################################
# Changes in this version:
#===============================================================
# *"\?" in a variable will now be replaced with a simple ?
#  before processing, remember to double escape that because
#  json doesn't like \? (=> \\?)
# *commands are now not run over and over again if not needed
# *files are now not rewritten for each variable individually
# *some technical stuff

################################################################
# Exit codes:
#===============================================================
# 0 => normal exit
# 1 => command line argument error
# 2 => error while processing
#

# definitions
import os, json, sys, subprocess

def print_err(text):
  print >> sys.stderr, text

if not len(sys.argv)==3:
  print_err("Error: Exactly two arguments required: \"python variable_grabbler.py <file to be rewritten> <config file>\"")
  sys.exit(1)

print "Reading config file...",
config_file = open(sys.argv[2],"r")
config_values = json.loads(config_file.read().decode("utf-8"))
config_file.close()
print "Done."


print "Reading file: "+sys.argv[1]+"..."
file_in = open(sys.argv[1], "r")
file_content = file_in.read()
file_in.close()

print "Replacing variables:"
for variable in config_values:
  print "> "+variable.upper()+" => ",

  if config_values[variable][0] == "file":
    print "Found array. Adding file instead: " + config_values[variable][1]
    file_replacement = open(config_values[variable][1], "r")
    file_content = file_content.decode('utf-8').replace("%" + variable.upper() + "%", file_replacement.read()).encode('utf-8')
    file_replacement.close()
  elif config_values[variable][0] == "exec":
    print "Found array. Executing command instead: " + config_values[variable][1]
    if variable.upper() in file_content:
      process = subprocess.Popen(config_values[variable][1], shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
      stdout, stderr = process.communicate()
      if process.returncode == 0:
        print "Process exited normally. Replacing variable with the output from STDOUT..."
        print_err("Subprocess exited normally.\nThe following error messages were produced:")
        print_err(stderr)
        file_content = file_content.decode('utf-8').replace("%" + variable.upper() + "%", stdout).encode('utf-8')
      else:
        print "Process exited abnormally. Exiting. No changes will be made."
        print_err("Subprocess exited abnormally. Exiting.\nThe following output was produced:")
        print_err(stdout)
        print_err("The following error messages were produced:")
        print_err(stderr)
        print "Exiting now."
        sys.exit(2)
    else:
      print variable.upper(),
      print "was not found in the file. Skipping command execution."
  else:
    replacement = str(config_values[variable])
    # look for variable sections that contain question marks
    argument_positions = []
    i = 0
    while i<len(replacement):
      if replacement[i] == '?' and (i==0 or not replacement[i-1]=='\\'):
        argument_positions = argument_positions + [ i ]
      i = i+1
    #print "DEBUG: " + str(argument_positions)
    replacement = replacement.replace("\\?", "?")
    print repr(replacement)
    # actually replace variables
    if argument_positions == []:
      file_content = file_content.decode('utf-8').replace("%" + variable.upper() + "%", replacement).encode('utf-8')

print "Saving new file..."
file_out = open(sys.argv[1], "w")
file_out.write(file_content)
file_out.close()

print "Done."
