from plumbum import local, ProcessExecutionError
from rich.progress import Progress
from rich.console import Console
from pathlib import Path
from typing import List
import httpx
import typer


TOOLS = Path("tools")
ORIGINAL = Path("original")
MODIFIED = Path("modified")
DECOMPILED = Path("decompiled")
PATCHES = Path("patches")
CONFIGS = Path("configs")


def ensure_dirs():
    for d in [TOOLS, ORIGINAL, MODIFIED, DECOMPILED, PATCHES, CONFIGS]:
        d.mkdir(exist_ok=True)

def run(console: Console, cmd: List[str], hide_output=True):
    prog = local[cmd[0]][cmd[1:]]
    try:
        prog() if hide_output else prog & FG # type: ignore [reportUndefinedVariable]
    except ProcessExecutionError as e:
        console.print(f"[red]Ошибка при выполнении команды: {' '.join(cmd)}")
        console.print(e.stderr)
        raise typer.Exit(1)

def download(console: Console, url: str, dest: Path):
    console.print(f"[cyan]Скачивание {url} → {dest.name}")

    with httpx.Client(follow_redirects=True, timeout=60.0) as client:
        with client.stream("GET", url) as response:
            response.raise_for_status()
            total = int(response.headers.get("Content-Length", 0))

            dest.parent.mkdir(parents=True, exist_ok=True)

            with open(dest, "wb") as f, Progress(console=console) as progress:
                task = progress.add_task("Загрузка", total=total if total else None)
                for chunk in response.iter_bytes(chunk_size=8192):
                    f.write(chunk)
                    progress.update(task, advance=len(chunk))
