"""把 coba-backend 打包成 tar.gz 上傳到 NAS,並解壓。"""

import io
import os
import sys
import tarfile
from pathlib import Path

try:
    sys.stdout.reconfigure(encoding="utf-8")
except (AttributeError, ValueError):
    pass

import paramiko

SECRETS = Path(r"C:\Users\user\Desktop\Coba\deploy_secrets.txt")
secrets = {}
for line in SECRETS.read_text(encoding="utf-8").splitlines():
    line = line.strip()
    if "=" in line and not line.startswith("#"):
        k, v = line.split("=", 1)
        secrets[k.strip()] = v.strip()

PROJECT = Path(r"C:\Users\user\Desktop\Coba\coba-backend")
REMOTE = "/volume1/homes/robertsu/coba/app"

# 排除清單
EXCLUDE_NAMES = {
    ".venv", "__pycache__", ".pytest_cache",
    "qdrant_data", "uploads", "coba.db", "coba.db-shm", "coba.db-wal",
    ".git", ".idea", ".vscode",
    "out", "profile",   # tools/web_scraper/{out,profile}
    "live.png", "command.json", "result.json", "state.json",
}


def should_skip(path: Path) -> bool:
    return any(part in EXCLUDE_NAMES for part in path.parts)


def build_tar() -> bytes:
    buf = io.BytesIO()
    with tarfile.open(fileobj=buf, mode="w:gz") as tar:
        for p in PROJECT.rglob("*"):
            rel = p.relative_to(PROJECT)
            if should_skip(rel):
                continue
            if p.is_file():
                tar.add(str(p), arcname="coba-backend/" + str(rel).replace("\\", "/"))
    return buf.getvalue()


def main():
    print("打包專案...")
    data = build_tar()
    print(f"  大小:{len(data) / 1024:.1f} KB")

    print("\nSSH 連線...")
    client = paramiko.SSHClient()
    client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    client.connect(
        hostname=secrets["NAS_HOST"],
        port=int(secrets["NAS_PORT"]),
        username=secrets["NAS_USER"],
        password=secrets["NAS_PASSWORD"],
        timeout=10,
        allow_agent=False,
        look_for_keys=False,
    )

    print("\n上傳 coba-backend.tar.gz(透過 SSH stdin)...")
    remote_path = "/volume1/homes/robertsu/coba/coba-backend.tar.gz"
    transport = client.get_transport()
    chan = transport.open_session()
    chan.exec_command(f"cat > {remote_path}")
    chan.sendall(data)
    chan.shutdown_write()
    code = chan.recv_exit_status()
    chan.close()
    print(f"  完成 (exit {code})")

    print("\n解壓...")
    cmds = [
        "rm -rf /volume1/homes/robertsu/coba/app",
        "cd /volume1/homes/robertsu/coba && tar -xzf coba-backend.tar.gz",
        "mv /volume1/homes/robertsu/coba/coba-backend /volume1/homes/robertsu/coba/app",
        "ls /volume1/homes/robertsu/coba/app | head -20",
    ]
    for cmd in cmds:
        stdin, stdout, stderr = client.exec_command(cmd, timeout=60)
        out = stdout.read().decode().strip()
        err = stderr.read().decode().strip()
        code = stdout.channel.recv_exit_status()
        print(f"  $ {cmd}  → {code}")
        if out:
            print(out)
        if err:
            print(f"  [stderr] {err}")

    client.close()
    print("\n完成。")


if __name__ == "__main__":
    main()
