#!/usr/bin/env python3.5
#
# (c) 2017 Fetal-Neonatal Neuroimaging & Developmental Science Center
#                   Boston Children's Hospital
#
#              http://childrenshospital.org/FNNDSC/
#                        dev@babyMRI.org
#

import sys, os
sys.path.insert(1, os.path.join(os.path.dirname(__file__), '..'))

import argparse, socket, json, sys, pfurl

str_defIP   = [l for l in ([ip for ip in socket.gethostbyname_ex(socket.gethostname())[2] if not ip.startswith("127.")][:1], [[(s.connect(('8.8.8.8', 53)), s.getsockname()[0], s.close()) for s in [socket.socket(socket.AF_INET, socket.SOCK_DGRAM)]][0][1]]) if l][0][0]
str_defPort = '5055'
parser  = argparse.ArgumentParser(description = 'curl-type comms in the pman system')

parser.add_argument(
    '--msg',
    action  = 'store',
    dest    = 'msg',
    default = '',
    help    = 'Message to send to pman or similar listener.'
)
parser.add_argument(
    '--verb',
    action  = 'store',
    dest    = 'verb',
    default = 'POST',
    help    = 'REST verb.'
)
parser.add_argument(
    '--http',
    action  = 'store',
    dest    = 'http',
    default = '%s:%s' % (str_defIP, str_defPort),
    help    = 'HTTP string: <IP>[:<port>]</some/path/>'
)
parser.add_argument(
    '--auth',
    action  = 'store',
    dest    = 'auth',
    default = '',
    help    = 'user:passwd authorization'
)
parser.add_argument(
    '--jsonwrapper',
    action  = 'store',
    dest    = 'jsonwrapper',
    default = '',
    help    = 'wrap msg in optional field'
)
parser.add_argument(
    '--quiet',
    help    = 'if specified, only echo final JSON output returned from server',
    dest    = 'b_quiet',
    action  = 'store_true',
    default = False
)
parser.add_argument(
    '--raw',
    help    = 'if specified, do not wrap return data from remote call in json field',
    dest    = 'b_raw',
    action  = 'store_true',
    default = False
)
parser.add_argument(
    '--oneShot',
    help    = 'if specified, transmit a shutdown ctl to the remote service after event',
    dest    = 'b_oneShot',
    action  = 'store_true',
    default = False
)
parser.add_argument(
    '--man',
    help    = 'request help: --man commands',
    dest    = 'man',
    action  = 'store',
    default = ''
)
parser.add_argument(
    '--content-type',
    help    = 'content type',
    dest    = 'contentType',
    action  = 'store',
    default = ''
)
parser.add_argument(
    '--jsonpprintindent',
    help    = 'pretty print json-formatted payloads',
    dest    = 'jsonpprintindent',
    action  = 'store',
    default = 0
)


args    = parser.parse_args()
pfurl  = pfurl.Pfurl(
    msg          = args.msg,
    http         = args.http,
    verb         = args.verb,
    contentType  = args.contentType,
    auth         = args.auth,
    b_raw        = args.b_raw,
    b_quiet      = args.b_quiet,
    b_oneShot    = args.b_oneShot,
    jsonwrapper  = args.jsonwrapper,
    man          = args.man,
    startFromCLI = True
    )

if not args.jsonpprintindent:
    print(pfurl())
else:
    print(json.dumps(json.loads(pfurl()), indent=int(args.jsonpprintindent)))

sys.exit(0)
