from flask import Flask, render_template
import requests
import struct



app = Flask(__name__)

MODBUS_API_URL = "http://localhost:5000/modbus/call"
API_KEY = "tajny-klic"

def convert_to_floats(raw_list):
    """Převede seznam 16bit registrů (raw) na floaty po dvojicích."""
    floats = []
    try:
        # zpracujeme po 2 registrech (každý 16 bitů)
        for i in range(0, len(raw_list), 2):
            if i + 1 < len(raw_list):
                # spojíme dva 16bitové do jednoho 32bit integeru (big endian)
                raw = (raw_list[i] << 16) | raw_list[i + 1]
                # převedeme na float podle IEEE754
                val = struct.unpack('>f', struct.pack('>I', raw))[0]
                floats.append(round(val, 4))
        return floats
    except Exception as e:
        print(f"Chyba při převodu na float: {e}")
        return raw_list  # fallback – vrátíme původní hodnoty
# společná funkce na volání modbus API
def ensure_list(value):
    if isinstance(value, list):
        return value
    elif value is None:
        return []
    else:
        return [value]
def call_modbus(payload: dict):
    try:
        resp = requests.post(
            MODBUS_API_URL,
            json=payload,
            headers={"X-API-Key": API_KEY},
            verify=False  # protože voláš curl -k, tak i tady vypneme ověřování certu
        )
        resp.raise_for_status()
        return resp.json()
    except Exception as e:
        # vrátíme chybu, aby se to ukázalo na stránce
        return {"error": str(e)}

@app.route("/")
def index():
    req = {
        "ip": "192.168.11.155",
        "port": 503,
        "instr": 7,
        "addr": 1,
        "count": 8,
        "type": "raw"
    }
    data = call_modbus(req)
    inD = ensure_list(data.get("data") if isinstance(data, dict) else [])
    req = {
        "ip": "192.168.11.155",
        "port": 503,
        "instr": 2,
        "addr": 8193,
        "count": 8,
        # "type": "raw"  # nebo "uint16" nebo nic – podle toho, jak máš backend
    }
    data = call_modbus(req)
    outD = ensure_list(data.get("data") if isinstance(data, dict) else [])
    # 2) druhé čtení
    req = {
        "ip": "192.168.11.155",
        "port": 503,
        "instr": 1,
        "addr": 0,
        "count": 12,
        "type": "raw"
    }
    data = call_modbus(req)
    AMPs = ensure_list(data.get("data") if isinstance(data, dict) else [])
    AMPs = convert_to_floats(AMPs)
    req = {
        "ip": "192.168.11.155",
        "port": 503,
        "instr": 1,
        "addr": 13,
        "count": 12,
        "type": "raw"
    }
    data = call_modbus(req)
    VOLs = ensure_list(data.get("data") if isinstance(data, dict) else [])
    VOLs = convert_to_floats(VOLs)
    req = {
        "ip": "192.168.11.155",
        "port": 503,
        "instr": 1,
        "addr": 25,
        "count": 4,
        "type": "raw"
    }
    data = call_modbus(req)
    TEEs = ensure_list(data.get("data") if isinstance(data, dict) else [])
    TEEs = convert_to_floats(TEEs)
    # teď si to "uložíme do seznamu"
    # představ si, že data_1["data"] je list
    print(VOLs)
    print(AMPs)
    print(inD)
    print(TEEs)
    # předáme do šablony
    return render_template(
        "index.html",
        VOLs=VOLs,       
        AMPs=AMPs,
        inD=inD,
        TEEs=TEEs,
        outD=outD,
    )

if __name__ == "__main__":
    # debug jen na vývoj
    app.run(host="0.0.0.0", port=8001, debug=True)
