#!/usr/bin/env python3

import argparse
import asyncio
import time

from pydaikin.daikin_brp069 import DaikinBRP069 as appliance
import pydaikin.discovery as discovery


def list_all_devices():
    for dev in discovery.get_devices():
        print("%18s: %s" % (dev['ip'], dev['name']))


parser = argparse.ArgumentParser(description='Daikin wireless interface.')

group = parser.add_mutually_exclusive_group(required=True)

group.add_argument(
    'device', metavar='dev', nargs='?', help='device, either ip or common name'
)

group.add_argument(
    '-l', '--list', action='store_true', help='list all the devices found'
)

parser.add_argument(
    '-a',
    '--all',
    action='store_true',
    help='show all the values available for the device',
)

parser.add_argument(
    '-p', '--password', help='unit\'s password (only used by SkyFi devices)'
)

parser.add_argument('-k', '--key', help='unit\'s key (only used by BRP072Cxx devices)')

settings = parser.add_argument_group('device settings', 'Modify paramaters of a device')

settings.add_argument(
    '-m', '--mode', choices=appliance.daikin_values('mode'), help='set working mode'
)

settings.add_argument('-t', '--temp', type=int, help='set target temperature')

settings.add_argument('-y', '--humidity', type=int, help='set target humidity')

settings.add_argument(
    '-f', '--fan', choices=appliance.daikin_values('f_rate'), help='set fan speed'
)

settings.add_argument(
    '-d',
    '--direction',
    choices=appliance.daikin_values('f_dir'),
    help='set fan movement',
)

settings.add_argument(
    '-w', '--away', choices=appliance.daikin_values('en_hol'), help='set away mode'
)

settings.add_argument(
    '-s', '--sensor', action='store_true', help='tail sensors\'s value'
)

settings.add_argument(
    '-v', '--verbose', action='store_true', help='enable logging debug'
)

args = parser.parse_args()

if args.verbose:
    import logging

    logging.basicConfig(level=logging.NOTSET)

if args.list:
    list_all_devices()

else:
    settings = {}

    if args.mode:
        settings.update({"mode": args.mode})

    if args.temp:
        settings.update({"stemp": str(args.temp)})

    if args.humidity:
        settings.update({"shum": str(args.humidity)})

    if args.fan:
        settings.update({"f_rate": args.fan})

    if args.direction:
        settings.update({"f_dir": args.direction})

    if args.away:
        settings.update({"en_hol": args.away})

    if args.all:
        only_summary = False
    else:
        only_summary = True

    loop = asyncio.get_event_loop()
    daikin = loop.run_until_complete(
        appliance.factory(args.device, key=args.key, password=args.password)
    )

    if settings == {}:
        daikin.show_values(only_summary)

    else:
        loop.run_until_complete(daikin.set(settings))

    if args.sensor:
        print('\nPress CTRL+C to stop tailing sensor data...\n')
        try:
            while True:
                loop.run_until_complete(daikin.update_status())
                daikin.show_sensors()
                time.sleep(30)
        except KeyboardInterrupt:
            pass
