#!/usr/bin/env python3
"""Script to run pydaikin."""

import argparse
from asyncio import run, sleep
from contextlib import nullcontext

from aiohttp import ClientError

from pydaikin import discovery  # pylint: disable=cyclic-import
from pydaikin.daikin_brp069 import (  # noqa: E0611; pylint: disable=no-name-in-module
    DaikinBRP069 as appliance,
)


async def list_all_devices():
    """Print all discovered devices."""
    for dev in discovery.get_devices():
        try:
            appl = await appliance.factory(dev['ip'])
            support_energy_consumption = (
                "Supported" if appl.support_energy_consumption else "Unsupported"
            )
        except ClientError:
            support_energy_consumption = "Unknown"
        print(
            "%18s (%s): %s - %s energy consumption"
            % (dev['ip'], dev['mac'], dev['name'], support_energy_consumption)
        )


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=float, 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('--file', type=str, help='file path for sensors logging')

settings.add_argument(
    '-v',
    '--verbose',
    help='Verbose level (none: critical, v: error, vv: warning, vvv: info, vvvv: debug)',
    action='count',
    default=0,
)


async def main():  # pylint: disable=too-many-branches
    """Main function."""

    args = parser.parse_args()

    if args.verbose:
        import logging  # pylint: disable=import-outside-toplevel

        logging.basicConfig(
            level=[
                logging.CRITICAL,
                logging.ERROR,
                logging.WARNING,
                logging.INFO,
                logging.DEBUG,
            ][args.verbose]
        )

    _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.list:
        await list_all_devices()
    else:
        daikin = await appliance.factory(
            args.device, key=args.key, password=args.password
        )

        if _settings == {}:
            daikin.show_values(not args.all)
        else:
            await daikin.set(_settings)

        if args.sensor:
            print('\nPress CTRL+C to stop logging sensor data...\n')

            with (open(args.file, 'a') if args.file else nullcontext()) as file:
                try:
                    while True:
                        await daikin.update_status()
                        daikin.show_sensors()
                        if args.file:
                            daikin.log_sensors(file)
                        await sleep(30)
                except KeyboardInterrupt:
                    pass


run(main())
