#! /usr/bin/env python

import argparse
import sys
import os
import logging

from modbus_cli.definitions import Definitions
from modbus_cli.modbus_rtu import ModbusRtu
from modbus_cli.modbus_tcp import ModbusTcp
from modbus_cli.access import parse_accesses


def connect_to_device(args):
    if args.device[0] == '/':
        modbus = ModbusRtu(args.device, args.baud, args.stop_bits, args.slave_id)
    else:
        port = 502
        parts = args.device.split(':')
        if len(parts) == 2:
            host, port = parts
        elif len(parts) == 1:
            host = parts[0]
        else:
            logging.error("Invalid device %r", args.device)
            sys.exit(1)

        if host == '':
            host = 'localhost'

        port = int(port)

        modbus = ModbusTcp(host, port, args.slave_id)

    modbus.connect()

    return modbus


def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('-r', '--registers', action='append', default=[])
    parser.add_argument('-s', '--slave-id', type=int)
    parser.add_argument('-b', '--baud', type=int, default=19200)
    parser.add_argument('-p', '--stop-bits', type=int, default=1)
    parser.add_argument('-v', '--verbose', action='store_true')
    parser.add_argument('device')
    parser.add_argument('access', nargs='+')
    args = parser.parse_args()

    if args.verbose:
        logging.basicConfig(format='\033[90m%(message)s\033[39m', level=logging.DEBUG)

    definitions = Definitions()
    definitions.parse(args.registers + os.environ.get('MODBUS_DEFINITIONS', '').split(':'))

    connect_to_device(args).perform_accesses(parse_accesses(args.access, definitions), definitions).close()


main()
