from network import WLAN
import time
import ubinascii

from trap import * # 2.2.20


try:
    wlan = WLAN()
except:
    print("Wifi failed to initialize; rebooting...")
    machine.reset()

def disconnectWiFi():
    global wlan
    try:
        wlan.mode(1)
        wlan.disconnect()
        wlan.deinit()
    except:
        pass


def initWiFi(deviceSettings):
    global wlan
    if 'device_id' in deviceSettings:
        apName = "AM-" + deviceSettings['device_id']
    else:
        apName = "AM-" + ubinascii.hexlify(machine.unique_id())[:8].decode('utf-8')
    antenna = WLAN.INT_ANT
    if 'wifi_antenna' in deviceSettings:
        if deviceSettings['wifi_antenna']:
            antenna = WLAN.EXT_ANT
    if 'wifi_enabled' in deviceSettings:
        if deviceSettings['wifi_enabled'] and not deviceSettings['ap_enabled']:
            wlan.init(mode=WLAN.STA, antenna=antenna)
        if deviceSettings['wifi_enabled'] and deviceSettings['ap_enabled']:
            wlan.init(mode=WLAN.STA_AP, antenna=antenna, ssid=apName)
        if not deviceSettings['wifi_enabled'] and not deviceSettings['ap_enabled']:
            disconnectWiFi()
            return wlan, ''
    if 'wifi_antenna' in deviceSettings and 'wifi_enabled' in deviceSettings:
        if not deviceSettings['wifi_enabled'] and deviceSettings['ap_enabled']:
            wlan.init(mode=WLAN.AP, antenna=antenna, ssid=apName)
    else:
        if deviceSettings['ap_enabled']:
            wlan.init(mode=WLAN.AP, antenna=antenna, ssid=apName)
    return wlan, apName



def connectWiFi(ssid, password, antenna, fnBoot, sdAccess=False, force=False): # 2.2.20
    global wlan
    if not force and wlan.isconnected():
        return True # device is already connected

    print("Connecting to WiFi {}...".format(ssid),end='')
    if (password != '' and password != None):
        wlan.connect(ssid, auth=(WLAN.WPA2, password))
    else:
        wlan.connect(ssid)

    wifiTimeout = 120 # 2.2.20 60sec !!     15000
    while not wlan.isconnected() and wifiTimeout > 0:
        fnBoot(1) # 2.2.20    IamAlive()
        time.sleep_ms(500)
        wifiTimeout = wifiTimeout - 1 # 2.2.20   500

    connected = wlan.isconnected()
    if connected:
        print("Connected.")
        print("Network IP Address: {}".format(wlan.ifconfig(id=0)[0]))
    else:
        # 2.2.20 print("Failed.")
        file_errLog(0, "Fails to connect to WIFI - ", sdAccess)  # 2.2.20
    return connected



def scanWiFi():
    global wlan
    res = wlan.scan()
    ret = []
    for wifi in res:
        wifiObj = {}
        s = ubinascii.hexlify(wifi.bssid).decode()
        ret.append({ 'macAddress': ':'.join(s[i:i+2] for i in range(0, len(s), 2)), 'signalStrength': wifi.rssi, 'age': 0, 'channel': wifi.channel })
    return ret

def currentWifiInfo():
    global wlan
    info = wlan.joined_ap_info()
    s = ubinascii.hexlify(info.bssid).decode()
    msg = { "route": "wlan", "details": { "ssid": info.ssid, "macAddress": ':'.join(s[i:i+2] for i in range(0, len(s), 2)), "signalStrength": info.rssi, "channel": info.primary_chn }}
    return msg
