"""boot.wim manipulation via wimtools (wimextract / wimupdate / wimdir).

Used by the startnet.cmd editor to extract + update the boot script
that runs when WinPE boots from PXE.
"""

import os
import shutil
import subprocess
import tempfile


def extract_startnet(wim_path):
    """Extract startnet.cmd from a WIM file. Returns the contents or None."""
    tmpdir = tempfile.mkdtemp()
    try:
        result = subprocess.run(
            ["wimextract", wim_path, "1",
             "/Windows/System32/startnet.cmd",
             "--dest-dir", tmpdir],
            capture_output=True, text=True, timeout=30,
        )
        startnet_path = os.path.join(tmpdir, "startnet.cmd")
        if result.returncode == 0 and os.path.isfile(startnet_path):
            with open(startnet_path, "r", encoding="utf-8", errors="replace") as fh:
                return fh.read()
        return None
    except Exception:
        return None
    finally:
        shutil.rmtree(tmpdir, ignore_errors=True)


def update_startnet(wim_path, content):
    """Update startnet.cmd inside a WIM file via wimupdate.

    Returns (ok, error_message). Writes CRLF line endings.
    """
    tmpdir = tempfile.mkdtemp()
    try:
        startnet_path = os.path.join(tmpdir, "startnet.cmd")
        with open(startnet_path, "w", encoding="utf-8", newline="\r\n") as fh:
            fh.write(content)
        update_cmd = f"add {startnet_path} /Windows/System32/startnet.cmd\n"
        result = subprocess.run(
            ["wimupdate", wim_path, "1"],
            input=update_cmd,
            capture_output=True, text=True, timeout=60,
        )
        if result.returncode != 0:
            return False, result.stderr.strip()
        return True, ""
    except Exception as exc:
        return False, str(exc)
    finally:
        shutil.rmtree(tmpdir, ignore_errors=True)


def list_files(wim_path, path="/"):
    """List files inside a WIM at the given path."""
    try:
        result = subprocess.run(
            ["wimdir", wim_path, "1", path],
            capture_output=True, text=True, timeout=30,
        )
        if result.returncode == 0:
            return [l.strip() for l in result.stdout.splitlines() if l.strip()]
        return []
    except Exception:
        return []
