#!/usr/bin/env python

#
#    Copyright (c) 2021 Project CHIP Authors
#    All rights reserved.
#
#    Licensed under the Apache License, Version 2.0 (the "License");
#    you may not use this file except in compliance with the License.
#    You may obtain a copy of the License at
#
#        http://www.apache.org/licenses/LICENSE-2.0
#
#    Unless required by applicable law or agreed to in writing, software
#    distributed under the License is distributed on an "AS IS" BASIS,
#    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#    See the License for the specific language governing permissions and
#    limitations under the License.
#

from IPython import embed
import chip
import chip.logging
import coloredlogs
import logging

def main():
    # The chip imports at the top level will be visible in the ipython REPL.

    coloredlogs.install(level='DEBUG')
    chip.logging.RedirectToPythonLogging()

    # trace/debug logging is not friendly to an interactive console. Only keep errors.
    logging.getLogger().setLevel(logging.ERROR)

    embed(header = '''
Welcome to the CHIP python REPL utilty.

Usage examples:

######## Enable detailed logging if needed #########

import logging
logging.getLogger().setLevel(logging.DEBUG)

######## List available BLE adapters #########
import chip.ble
print(chip.ble.GetAdapters())

######## Discover chip devices #########
import chip.ble

chip.ble.DiscoverAsync(2000, lambda *x: print('Discovered: %r' % (x,)), lambda: print('Done'))

for device in chip.ble.DiscoverSync(2000):
    print(device)

####### Commision a BLE device #########

import chip.ble.commissioning

device = chip.ble.commissioning.Connect(discriminator=3840, pin=20202021)
if device.needsNetworkCredentials:
  device.ConnectToWifi("ssid", "password")

######## Thread provisioning ########

import chip.ble.commissioning
device = chip.ble.commissioning.Connect(discriminator=3840, pin=20202021)

# Thread data is an opaque blob, but it can be build with internal constructs
# starting from a memset(0) equivalent
from chip.internal.thread import ThreadNetworkInfo

data = ThreadNetworkInfo.parse(b'\\x00'*ThreadNetworkInfo.sizeof())
data.NetworkName = "OpenThread"
data.ExtendedPANId = b"\\xde\\xad\\x00\\xbe\\xef\\x00\\xca\\xfe"
data.MasterKey = b"\\x00\\x11\\x22\\x33\\x44\\x55\\x66\\x77\\x88\\x99\\xAA\\xBB\\xCC\\xDD\\xEE\\xFF"
data.PANId = 0xabcd
data.Channel = 15


if device.needsNetworkCredentials:
  device.ConnectToThread(ThreadNetworkInfo.build(data))

######## Node discovery ########

import chip.discovery

chip.discovery.FindAddressAsync(123, 456, lambda x: print("%r", x))

print(chip.discovery.FindAddress(123, 456)

    '''.strip())

if __name__ == "__main__":
    main()
