#!python

import argparse
import copy
import logging
import sys

from rfdevices import RFDevice, Transmitter
from rfdevices.config import get_protocol

logging.basicConfig(level=logging.WARNING, datefmt='%Y-%m-%d %H:%M:%S',
                    format='%(asctime)-15s - [%(levelname)s] %(module)s: %(message)s',)


class DictAction(argparse.Action):
    def __call__(self, parser, namespace, values, option_string=None):
        try:
            k, v = values.split('=', 1)
        except ValueError:
            raise argparse.ArgumentError(self, "Format must be key=value")

        items = copy.copy(argparse._ensure_value(namespace, self.dest, {}))
        items[k] = v
        setattr(namespace, self.dest, items)

parser = argparse.ArgumentParser(description='Sends a decimal code via an RF GPIO device')
parser.add_argument('-v', '--verbose', action='store_true', default=False)
parser.add_argument('-g', '--gpio', type=int, help="GPIO pin")
parser.add_argument('-b', '--binary', action='store_true', default=False)
parser.add_argument('-a', '--action', action='store_true', default=False)
parser.add_argument('-t', '--protocol', type=str, help="Protocol", required=True)
parser.add_argument('-p', '--param', action=DictAction, required=False, default={})
parser.add_argument('code', metavar='CODE', type=str, help="Code to send")
args = parser.parse_args()

if args.verbose:
    logging.basicConfig(level=logging.DEBUG)

proto = get_protocol(args.protocol)
if not proto:
    print('Unknown protocol:', args.protocol)
    sys.exit(1)

with Transmitter(args.gpio) as tx:
    success = False
    if args.binary:
        success = tx.tx_bin(args.code, proto)
    elif args.action:
        device = RFDevice(transmitter=tx, protocol=proto, params=args.param)
        try:
            success = device.send(args.code)
        except KeyError:
            sys.stderr.write('Unknown action: {} (valid actions: {})\n'.format(args.code,
                                                                               ', '.join(device.codes.keys())))
            success = False
    else:
        success = tx.tx_code(int(args.code), proto)

exit(success)
