#!/usr/bin/python

import argparse
import os

from dolo import __version__

parser = argparse.ArgumentParser(description='Matlab compiler')
parser.add_argument('-v','--version', action='version', version=__version__)
parser.add_argument('-d','--diff',  action='store_const', const=True, default=False, help='compute symbolic derivatives')
parser.add_argument('-r','--print_residuals', action='store_const', const=True, default=False, help='print residuals at the steady-state')
parser.add_argument('-t','--model_type', nargs=1, type=str,  default=None, help='type of model')
parser.add_argument('--recipes', nargs=1, type=str, default=None, help='file containing recipes')

parser.add_argument('input', help='model file')
parser.add_argument('output',nargs='?',type=str,default=None,help='model file')

args = parser.parse_args()

######

input_file = args.input

# note input_rad is the full path with truncated filename
[input_rad, extension] = os.path.splitext(input_file)

if extension == '':
    extension = '.yaml'
elif extension != '.yaml':
    print('Unknown filetype : {}'.format(extension))
    exit(1)

filename = input_rad + extension

if args.output:
    output_filename = args.output
else: # we should determine some good output name in case none has been specified
    output_filename = input_rad + '.m'

######

from dolo.misc.yamlfile import yaml_import

model = yaml_import( filename, compiler=None )

import re

basename = os.path.basename(output_filename)
fname = re.compile('(.*)\.m').match(basename).group(1)
model.name = fname


# check steady-state
if args.print_residuals:
    from dolo.symbolic.model import print_residuals
    print_residuals(model)


if args.recipes:
    import yaml
    with file(args.recipes[0]) as f:
        recipes = yaml.load(f)
else:
    recipes = None

if args.diff:
    diff = True
else:
    diff = False

if args.model_type:
    model_type = args.model_type[0]
else:
    model_type = None

from dolo.compiler.compiler_matlab import CompilerMatlab
comp = CompilerMatlab(model, recipes=recipes, model_type=model_type)

txt = comp.process_output( diff=diff )

######

with file(output_filename,'w') as f:
    f.write(txt)
