import asyncio
import sys

if sys.platform == 'win32':
    asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())

from openhtf.util import multicast
multicast.MulticastListener.run = lambda self: None

import openhtf as htf
from openhtf.output.callbacks import json_factory
from openhtf.output.servers import station_server
from openhtf.util import units


@htf.measures(
    htf.Measurement('device_connected').equals(True).doc('Is the device connected?')
)
def connection_check(test):
    test.measurements.device_connected = True


@htf.measures(
    htf.Measurement('voltage_mv')
    .in_range(minimum=4900, maximum=5100)
    .with_units(units.MILLIVOLT)
    .doc('Supply voltage must be 5000mV ± 100mV')
)
def voltage_test(test):
    test.measurements.voltage_mv = 5012


@htf.measures(
    htf.Measurement('led_blink_count')
    .in_range(minimum=3, maximum=3)
    .doc('LED must blink exactly 3 times')
)
def led_blink_test(test):
    test.measurements.led_blink_count = 3


@htf.measures(
    htf.Measurement('serial_number')
    .matches_regex(r'^SN-\d{6}$')
    .doc('Serial number must match format SN-XXXXXX')
)
def serial_number_check(test):
    test.measurements.serial_number = 'SN-001234'


def get_dut_id():
    return input('\nEnter DUT ID (e.g. UNIT-001): ').strip() or 'UNIT-001'


def main():
    test = htf.Test(
        connection_check,
        voltage_test,
        led_blink_test,
        serial_number_check,
        test_name='Bruce_Demo_Test',
    )

    test.add_output_callbacks(
        json_factory.OutputToJSON(
            './{dut_id}_{metadata[test_name]}_{start_time_millis}.json',
            indent=2,
        )
    )

    print('Browse to: http://localhost:12000')

    with station_server.StationServer() as server:
        while True:
            test.execute(test_start=get_dut_id)


if __name__ == '__main__':
    main()
