""" Code to convert dates

Context : SRP
Module  : SRPCalendar.py
Version : 1.1.0
Author  : Stefano Covino
Date    : 19/08/2011
E-mail  : stefano.covino@brera.inaf.it
URL:    : http://www.merate.mi.astro.it/utenti/covino
Purpose : Convert dates in various formats

Usage   : SRPCalendar [-h] [-v] -d arg1 / -j arg2 / -m arg3 / -n arg4 
            -j Julian Date
            -m Modified Julian Date (MJD)
            -d Regular Date (UT) (yyyy/mm/dd hh:mm:ss)
            -n Present date


History : (07/04/2009) First version.
        : (07/06/2010) Minor bug corrected.
        : (15/12/2010) "Now" options added.
        : (19/08/2011) Better cosmetics.

"""


JD2MJD = 2400000.5


import time, sys
from optparse import OptionParser
import SRP.SRPConstants as SRPConstants
import SRP.TimeAstro_algs as TimeAstro_algs


parser = OptionParser(usage="usage: %prog [-h] [-v] -d arg1 / -j arg2 / -m arg3 / -n arg4", version="%prog 1.1.0")
parser.add_option("-j", "--julian", action="store", nargs=1, type="float", dest="julian", help="Julian Date")
parser.add_option("-v", "--verbose", action="store_true", dest="verbose", help="Fully describe operations")
parser.add_option("-m", "--modified", action="store", nargs=1, type="float", dest="modified", help="Modified Julian Date (MJD)")
parser.add_option("-d", "--date", action="store", nargs=2, type="string", dest="regular", help="Regular Date (UT) (yyyy/mm/dd hh:mm:ss)")
parser.add_option("-n", "--now", action="store_true", dest="now", help="Present date")
(options, args) = parser.parse_args()


if options.julian or options.modified or options.regular or options.now:
    if options.now:
        prestime = time.localtime()
        ltime = float(prestime[0]),float(prestime[1]),float(prestime[2]),float(prestime[3]),float(prestime[4]),float(prestime[5])
        jd = TimeAstro_algs.to_julian(ltime)
        mjd = jd - JD2MJD
        if options.verbose:
            print "Present date: %4d/%02d/%02d %02d:%02d:%.2f" % (float(prestime[0]),float(prestime[1]),float(prestime[2]),float(prestime[3]),float(prestime[4]),float(prestime[5]))
            print "JD: %.6f" % (jd)
            print "MJD: %.6f" % (mjd)
        else:
            print "%.6f %.6f %4d/%02d/%02d %02d:%02d:%.2f" % (jd, mjd, float(prestime[0]),float(prestime[1]),float(prestime[2]),float(prestime[3]),float(prestime[4]),float(prestime[5]))
    else:
        if options.julian and not (options.modified or options.regular):
            tt = TimeAstro_algs.to_calendar(options.julian)
            ttd = TimeAstro_algs.to_decimal((tt[3],tt[4],tt[5]))
            mjd = options.julian - JD2MJD
            if options.verbose:
                print "Date for JD %.6f: %4d/%02d/%02d %02d:%02d:%.2f" % (options.julian, tt[0], tt[1], tt[2], tt[3], tt[4], tt[5])
                print "MJD for JD %.6f : %.6f" % (options.julian, mjd)
            else:
                print "%.6f %.6f %4d/%02d/%02d %02d:%02d:%.2f" % (options.julian, mjd, tt[0], tt[1], tt[2], tt[3], tt[4], tt[5])
        elif options.modified and not (options.julian or options.regular):
            jd = options.modified + JD2MJD
            tt = TimeAstro_algs.to_calendar(jd)
            ttd = TimeAstro_algs.to_decimal((tt[3],tt[4],tt[5]))
            if options.verbose:
                print "Date for MJD %.6f: %4d/%02d/%02d %02d:%02d:%.2f" % (jd, tt[0], tt[1], tt[2], tt[3], tt[4], tt[5])
                print "JD for MJD %.6f    : %.6f" % (options.modified, jd)
            else:
                print "%.6f %.6f %4d/%02d/%02d %02d:%02d:%.2f" % (jd, options.modified, tt[0], tt[1], tt[2], tt[3], tt[4], tt[5])
        elif options.regular and not (options.julian or options.modified):
            yy = options.regular[0]
            hh = options.regular[1]
            yyt = yy.split('/')
            hht = hh.split(':')
            if not (len(yyt) == 3 and len(hht) == 3):
                parser.error("Date format not allowed.")
            try:
                ltime = float(yyt[0]),float(yyt[1]),float(yyt[2]),float(hht[0]),float(hht[1]),float(hht[2])
                jd = TimeAstro_algs.to_julian(ltime)
            except ValueError:
                parser.error("Date format not correct.")
            except AttributeError:
                parser.error("Date format not correct.")
            mjd = jd - JD2MJD
            if options.verbose:
                print "JD for %4d/%02d/%02d %02d:%02d:%.2f : %.6f" % (float(yyt[0]),float(yyt[1]),float(yyt[2]),float(hht[0]),float(hht[1]),float(hht[2]), jd)
                print "MJD for %4d/%02d/%02d %02d:%02d:%.2f: %.6f" % (float(yyt[0]),float(yyt[1]),float(yyt[2]),float(hht[0]),float(hht[1]),float(hht[2]), mjd)
            else:
                print "%.6f %.6f %4d/%02d/%02d %02d:%02d:%.2f" % (jd, mjd, float(yyt[0]),float(yyt[1]),float(yyt[2]),float(hht[0]),float(hht[1]),float(hht[2]))
        else:
            parser.print_help()
else:
    parser.print_help()
