#! /usr/bin/env -S python3 -B

import io
import json
import logging
import time
from subprocess import PIPE

import click
from chiptest.accessories import AppsRegister
from chiptest.runner import Runner
from chiptest.test_definition import App, ExecutionCapture
from yaml.paths_finder import PathsFinder

TEST_NODE_ID = '0x12344321'
TEST_VID = '0xFFF1'
TEST_PID = '0x8001'


class DarwinToolRunner:
    def __init__(self, runner, command):
        self.process = None
        self.outpipe = None
        self.runner = runner
        self.lastLogIndex = 0
        self.command = command
        self.stdin = None

    def start(self):
        self.process, self.outpipe, errpipe = self.runner.RunSubprocess(self.command,
                                                                        name='DARWIN-TOOL',
                                                                        wait=False,
                                                                        stdin=PIPE)
        self.stdin = io.TextIOWrapper(self.process.stdin, line_buffering=True)

    def stop(self):
        if self.process:
            self.process.kill()

    def waitForMessage(self, message):
        logging.debug('Waiting for %s' % message)

        start_time = time.monotonic()
        ready, self.lastLogIndex = self.outpipe.CapturedLogContains(
            message, self.lastLogIndex)
        while not ready:
            if self.process.poll() is not None:
                died_str = ('Process died while waiting for %s, returncode %d' %
                            (message, self.process.returncode))
                logging.error(died_str)
                raise Exception(died_str)
            if time.monotonic() - start_time > 10:
                raise Exception('Timeout while waiting for %s' % message)
            time.sleep(0.1)
            ready, self.lastLogIndex = self.outpipe.CapturedLogContains(
                message, self.lastLogIndex)

        logging.debug('Success waiting for: %s' % message)


class InteractiveDarwinTool(DarwinToolRunner):
    def __init__(self, runner, binary_path):
        self.prompt = "WAITING FOR COMMANDS NOW"
        super().__init__(runner, [binary_path, "interactive", "start", "--additional-prompt", self.prompt])

    def waitForPrompt(self):
        self.waitForMessage(self.prompt)

    def sendCommand(self, command):
        logging.debug('Sending command %s' % command)
        print(command, file=self.stdin)
        self.waitForPrompt()


@click.group(chain=True)
@click.pass_context
def main(context):
    pass


@main.command(
    'run', help='Execute the test')
@click.option(
    '--darwin-framework-tool',
    help="what darwin-framework-tool to use")
@click.option(
    '--ota-requestor-app',
    help='what ota requestor app to use')
@click.option(
    '--ota-data-file',
    required=True,
    help='The file to use to store our OTA data.  This file does not need to exist.')
@click.option(
    '--ota-image-file',
    required=True,
    help='The file to use to store the OTA image we plan to send.  This file does not need to exist.')
@click.option(
    '--ota-destination-file',
    required=True,
    help='The destination file to use for the requestor\'s download.  This file does not need to exist.')
@click.option(
    '--ota-candidate-file',
    required=True,
    help='The file to use for our OTA candidate JSON.  This file does not need to exist.')
@click.pass_context
def cmd_run(context, darwin_framework_tool, ota_requestor_app, ota_data_file, ota_image_file, ota_destination_file, ota_candidate_file):
    paths_finder = PathsFinder()

    if darwin_framework_tool is None:
        darwin_framework_tool = paths_finder.get('darwin-framework-tool')
    if ota_requestor_app is None:
        ota_requestor_app = paths_finder.get('chip-ota-requestor-app')

    runner = Runner()
    runner.capture_delegate = ExecutionCapture()

    apps_register = AppsRegister()
    apps_register.init()

    darwin_tool = None

    try:
        apps_register.createOtaImage(ota_image_file, ota_data_file, "This is some test OTA data", vid=TEST_VID, pid=TEST_PID)
        json_data = {
            "deviceSoftwareVersionModel": [{
                "vendorId": int(TEST_VID, 16),
                "productId": int(TEST_PID, 16),
                "softwareVersion": 2,
                "softwareVersionString": "2.0",
                "cDVersionNumber": 18,
                "softwareVersionValid": True,
                "minApplicableSoftwareVersion": 0,
                "maxApplicableSoftwareVersion": 100,
                "otaURL": ota_image_file
            }]
        }
        with open(ota_candidate_file, "w") as f:
            json.dump(json_data, f)

        requestor_app = App(runner, [ota_requestor_app, '--otaDownloadPath', ota_destination_file])
        apps_register.add('default', requestor_app)

        requestor_app.start()

        pairing_cmd = [darwin_framework_tool, 'pairing', 'code', TEST_NODE_ID, requestor_app.setupCode]
        runner.RunSubprocess(pairing_cmd, name='PAIR', dependencies=[apps_register])

        # pairing get-commissioner-node-id does not seem to work right in interactive mode for some reason
        darwin_tool = DarwinToolRunner(runner, [darwin_framework_tool, 'pairing', 'get-commissioner-node-id'])
        darwin_tool.start()
        darwin_tool.waitForMessage(": Commissioner Node Id")
        nodeIdLine = darwin_tool.outpipe.FindLastMatchingLine('.*: Commissioner Node Id (0x[0-9A-F]+)')
        if not nodeIdLine:
            raise Exception("Unable to find commissioner node id")
        commissionerNodeId = nodeIdLine.group(1)
        darwin_tool.stop()

        darwin_tool = InteractiveDarwinTool(runner, darwin_framework_tool)
        darwin_tool.start()

        darwin_tool.waitForPrompt()

        darwin_tool.sendCommand("otasoftwareupdateapp candidate-file-path %s" % ota_candidate_file)
        darwin_tool.sendCommand("otasoftwareupdateapp set-reply-params --status 0")
        darwin_tool.sendCommand("otasoftwareupdaterequestor announce-otaprovider %s 0 0 0 %s 0" %
                                (commissionerNodeId, TEST_NODE_ID))

        # Now wait for the OTA download to finish.
        requestor_app.waitForMessage("OTA image downloaded to %s" % ota_destination_file)

        # Make sure the right thing was downloaded.
        apps_register.compareFiles(ota_data_file, ota_destination_file)

    except Exception:
        logging.error("!!!!!!!!!!!!!!!!!!!! ERROR !!!!!!!!!!!!!!!!!!!!!!")
        runner.capture_delegate.LogContents()
        raise
    finally:
        if darwin_tool is not None:
            darwin_tool.stop()
        apps_register.killAll()
        apps_register.factoryResetAll()
        apps_register.removeAll()
        apps_register.uninit()


if __name__ == '__main__':
    main(auto_envvar_prefix='CHIP')
