#!/usr/bin/bash
set -u
set -o pipefail

PROJECT_DIR="$(cd "$(dirname "$0")" && pwd)"
BOOTSTRAP="$PROJECT_DIR/scripts/embed_bundled_runtime.py"
PY_QUERY="$PROJECT_DIR/.tmp_device_search_read.py"
REQUESTED_PORT="${1:-}"

find_serial_port() {
    local dev
    for dev in /dev/ttyACM* /dev/ttyUSB*; do
        [[ -e "$dev" ]] || continue
        if udevadm info -q property -n "$dev" 2>/dev/null | grep -q '^ID_VENDOR_ID=2e8a$'; then
            echo "$dev"
            return 0
        fi
    done
    return 1
}

select_python() {
    if [[ -x "$PROJECT_DIR/.venv/bin/python" ]] && "$PROJECT_DIR/.venv/bin/python" -c "import mpremote, serial, platformdirs" >/dev/null 2>&1; then
        echo "$PROJECT_DIR/.venv/bin/python"
        return 0
    fi
    if command -v python3 >/dev/null 2>&1 && python3 -c "import mpremote, serial, platformdirs" >/dev/null 2>&1; then
        if [[ -f "$BOOTSTRAP" ]]; then
            python3 "$BOOTSTRAP" --project "$PROJECT_DIR" --modules mpremote serial platformdirs >/dev/null 2>&1 || true
        fi
        if [[ -x "$PROJECT_DIR/.venv/bin/python" ]] && "$PROJECT_DIR/.venv/bin/python" -c "import mpremote, serial, platformdirs" >/dev/null 2>&1; then
            echo "$PROJECT_DIR/.venv/bin/python"
            return 0
        fi
        echo "python3"
        return 0
    fi
    return 1
}

if [[ -n "$REQUESTED_PORT" ]]; then
    PORT="$REQUESTED_PORT"
else
    PORT="$(find_serial_port || true)"
fi

if [[ -z "${PORT:-}" ]]; then
    echo "HIBA: Nem találok futó MicroPython-os Pico-t."
    exit 1
fi

PYTHON_BIN="$(select_python || true)"
if [[ -z "$PYTHON_BIN" ]]; then
    echo "HIBA: Nem található használható mpremote runtime a projektben vagy a rendszerben."
    exit 1
fi

cat > "$PY_QUERY" <<'PYEOF'
import sys
import os
import gc

try:
    import machine
except Exception as e:
    machine = None
    machine_import_error = repr(e)
else:
    machine_import_error = None

try:
    import ubinascii as binascii
except Exception:
    try:
        import binascii
    except Exception:
        binascii = None

def safe(callable_, default="n/a"):
    try:
        return callable_()
    except Exception:
        return default

def to_hex(data):
    try:
        if binascii is not None:
            return binascii.hexlify(data).decode()
    except Exception:
        pass
    try:
        return "".join("{:02x}".format(b) for b in data)
    except Exception:
        return "n/a"

print("=== PICO ESZKÖZADATOK ===")
print("platform:", safe(lambda: sys.platform))
print("python_version:", safe(lambda: sys.version.replace("\n", " ")))

impl = getattr(sys, "implementation", None)
if impl is not None:
    print("implementation_name:", getattr(impl, "name", "n/a"))
    print("implementation_version:", getattr(impl, "version", "n/a"))
    print("mpy:", getattr(impl, "_mpy", "n/a"))

u = safe(lambda: os.uname(), None)
if u not in (None, "n/a"):
    print("sysname:", getattr(u, "sysname", "n/a"))
    print("nodename:", getattr(u, "nodename", "n/a"))
    print("release:", getattr(u, "release", "n/a"))
    print("version:", getattr(u, "version", "n/a"))
    print("machine:", getattr(u, "machine", "n/a"))
else:
    print("uname: n/a")

gc.collect()
print("mem_alloc:", safe(lambda: gc.mem_alloc()))
print("mem_free:", safe(lambda: gc.mem_free()))

if machine is None:
    print("machine_module: n/a")
    print("machine_import_error:", machine_import_error)
else:
    print("cpu_freq_hz:", safe(lambda: machine.freq()))
    print("unique_id_hex:", safe(lambda: to_hex(machine.unique_id())))
    print("reset_cause:", safe(lambda: machine.reset_cause()))
    print("wake_reason:", safe(lambda: machine.wake_reason()))

try:
    st = os.statvfs("/")
    bsize = st[0]
    total = st[2] * bsize
    free = st[3] * bsize
    used = total - free
    print("flash_total_bytes:", total)
    print("flash_used_bytes:", used)
    print("flash_free_bytes:", free)
except Exception:
    print("flash_total_bytes: n/a")
    print("flash_used_bytes: n/a")
    print("flash_free_bytes: n/a")

try:
    files = os.listdir("/")
    files.sort()
    print("root_files:", ", ".join(files) if files else "(empty)")
except Exception:
    print("root_files: n/a")
PYEOF

"$PYTHON_BIN" -m mpremote connect "$PORT" run "$PY_QUERY"
rm -f "$PY_QUERY"
