#! /usr/bin/env python

'''
kozai-ekm

Evolve TripleOctupole from the command line.
'''

import argparse
import numpy as np
import sys
from kozai.ekm import TripleOctupole

def process_command_line(argv):
  '''Process the command line.'''
  
  if argv is None:
    argv = sys.argv[1:]

  # Configure the command line options
  parser = argparse.ArgumentParser()

  def_trip = TripleOctupole()
  default_tstop = 100
  parser.add_argument('-e', '--e1', dest='e1', type=float, 
    default=def_trip.e1, help = 
    'Inner eccentricity [%g]' % def_trip.e1, metavar='\b')
  parser.add_argument('-i', '--inc', dest='inc', type=float,
    default=def_trip.inc, help = 
    'Inclination of the third body in degrees [%g]' % def_trip.inc,
    metavar='\b')
  parser.add_argument('-g', '--g1', dest='g1', type=float, 
    default=def_trip.g1, help = 
    'Inner argument of periapsis in degrees [%g]' % def_trip.g1,
      metavar='\b')
  parser.add_argument('-L', '--Omega', dest='Omega', type=float, 
    default=def_trip.Omega, help = 
    'Longitude of ascending node in degrees [%g]' % def_trip.Omega,
    metavar='\b')
  parser.add_argument('-t', '--end', dest='tstop', type=float, 
    default=default_tstop, help = 'Total time of integration in years [%g]' 
    % default_tstop, metavar='\b')
  parser.add_argument('-C', '--cpu', dest='cputstop', type=float, 
    default=def_trip.cputstop, help = 
    'cpu time limit in seconds, if -1 then no limit [%g]' %
    def_trip.cputstop, metavar='\b')
  parser.add_argument('-F', '--freq', dest='outfreq', type=int, 
    default=def_trip.outfreq, help = 'Output frequency [%g]' % 
    def_trip.outfreq, metavar='\b')
  parser.add_argument('-A', '--abstol', dest='atol', type=float, 
    default=def_trip.atol, help = 'Absolute accuracy [%g]' % 
    def_trip.atol, metavar='\b')
  parser.add_argument('-R', '--reltol', dest='rtol', type=float, 
    default=def_trip.rtol, help = 'Relative accuracy [%g]' % 
    def_trip.rtol, metavar='\b')
  parser.add_argument('--epsoct', dest='epsoct', type=float, help = 
    'Set epsilon_octupole parameter (override SMA and e2 settings)',
    metavar='\b')
  parser.add_argument('--phiq', dest='phiq', type=float, help =
    'Set the constant phi_q (override e1, g1, and Omega)', metavar='\b')
  parser.add_argument('--chi', dest='chi', type=float, help =
    'Set the constant chi (override e1, g1, and Omega)', metavar='\b')
  parser.add_argument('--algorithm', dest='algo', type=str,
    default=def_trip.algo, help = 'Integration algorithm [%s]' 
    % def_trip.algo)

  arguments = parser.parse_args()
  return arguments

def main(argv=None):
  args = process_command_line(argv)
  to = TripleOctupole()

  for elem in args.__dict__:
    setattr(to, elem, args.__dict__[elem])

  ev = to.evolve(args.tstop)
  for elem in ev:
    print ' '.join(map(str, elem))

  return 0

if __name__=='__main__':
  status = main()
  sys.exit(status)
