import time
import cv2

from flask import Flask, request, render_template

import auth
from config import cfg
from network import WIFINetWork, DefaultWIFIGateway
from audio import AudioController
from video import VideoController


app = Flask(__name__)

START_WAITTING_TIME = 5      #s
CAPTURE_QR_INTERVAL = 2      #s



@app.route("/", methods=["POST"])
def configurer():
    token = request.form.get("token")
    if token == "": abort(401)
    if not auth.checktoken(token): abort(401)
    
    return render_template("configurer.html")


def WatchandSet(token, iface):
    if not VideoController.Open(token):
        # print("Open camera failed")
        return False

    id = None
    pw = None
    while True:
        if not VideoController.Capture(token, "/mdata", "wifiqr.jpg"):
            # print("Capture image from camera failed")
            break
        
        image = cv2.imread("/mdata/wifiqr.jpg")
        qrcode = cv2.QRCodeDetector()
        result, points, code = qrcode.detectAndDecode(image)
        infos = result.split(";")
        for info in infos:
            if info.startswith("P:"):
                pw = info[2:]
            elif info.startswith("S:"):
                id = info[2:]
    
        if id is not None and pw is not None:
            # print("id: %s, pw: %s" % (id, pw))
            break
    
        time.sleep(CAPTURE_QR_INTERVAL)
        # print("Capture image do not have qr.")

    VideoController.Close(token)
    
    AudioController.Play(token, "/conf/voice/config.wav")
    if WIFINetWork.SetIPInfo(token, iface, id, pw):
        return True
    else:
        # print("Can not set WIFI IP info to host node")
        return False


if __name__ == '__main__':
    # time.sleep(START_WAITTING_TIME)

    un = cfg.get("host", "user")
    pw = cfg.get("host", "pw")
    (hr, token) = auth.login(un, pw)
    if not hr:
        print("Login user to node failed")
    else:
        ipi = WIFINetWork.GetIPInfo(token)
        if ipi is None:
            print("Can not get WIFI IP info from host node")
        else:
            reachable = WIFINetWork.IPReachable(ipi["gateway"])
            if not reachable :
                iface = ipi["iface"]
                while not reachable:
                    AudioController.Play(token, "/conf/voice/nonet.wav")
                    if WatchandSet(token, iface):
                        reachable = WIFINetWork.IPReachable(DefaultWIFIGateway)
                    else:
                        print("Watch QR and Set IP failed")
                        break
                    
                if reachable:
                    AudioController.Play(token, "/conf/voice/success.wav") 
                    print("Set WIFI success")

    port = cfg.getint("server","port")
    app.run(
        host = '0.0.0.0',
        port = port,
        debug = False
    )
    