#!/usr/bin/env python3

import rclpy
from rclpy.node import Node
import sys
from random import choice
from string import ascii_letters
from subprocess import check_output, CalledProcessError
from time import sleep
from importlib import import_module

rclpy.init(args=None)
node = Node('service_wrapper_' + ''.join(choice(ascii_letters) for _ in range(8)))

server = node.declare_parameter('server', '').value

if not server:
    sys.exit(0)

# wait and identify which service type is here
srv = ''

while srv == '':
    sleep(1)
    try:
        srv = check_output(f'ros2 service type {server}'.split()).decode().strip()
    except CalledProcessError:
        pass

pkg,_,srv = srv.split('/')
pkg = import_module(pkg + '.srv')
srv = getattr(pkg, srv)
req = srv.Request()

# declare request fields as node params
for field in req.get_fields_and_field_types():
    print('current field:',field,getattr(req,field))
    default_val = getattr(req,field)
    try:
        param = node.declare_parameter(field, default_val)
    except TypeError:   # some numpy array
        param = node.declare_parameter(field, default_val.tolist())

    # handle namespace
    if param.value == '__ns':
        setattr(req, field, node.get_namespace())
    else:
        setattr(req, field, param.value)

# call and exit
client = node.create_client(srv, server)
client.wait_for_service()
res = client.call_async(req)

while not res.done():
    rclpy.spin_once(node)
node.destroy_node()
rclpy.shutdown()
