#!/usr/bin/env python3
# ============================================================
# ZONGYUAN-ROOT 通用Worker部署脚本 V1.0
# 支持：Linux / macOS / Windows
# 功能：自动部署Worker+看门狗守护组件，建立定时任务
# 锚定：Ω₀⊂⊙∞⊂Ω | DID-BR-000002
# 用法：python3 deploy_worker.py [NODE_ID]
# ============================================================

import os, sys, platform, json, time, subprocess, socket
import urllib.request

GATEWAY = "https://www.huodouai.com"
DID = "DID-BR-000002"
DEPLOY_URL = f"{GATEWAY}/deploy/universal"

def log(msg):
    print(f"[WORKER-DEPLOY] {msg}")

def sh(cmd):
    try:
        return subprocess.check_output(cmd, shell=True, stderr=subprocess.DEVNULL, timeout=30).decode().strip()
    except:
        return ""

def detect_platform():
    system = platform.system()
    if system == "Linux": return "linux"
    elif system == "Darwin": return "macos"
    elif system == "Windows": return "windows"
    return "unknown"

def download_file(url, dest):
    """下载文件"""
    try:
        urllib.request.urlretrieve(url, dest)
        return os.path.isfile(dest)
    except:
        return False

def deploy_linux(node_id):
    """Linux部署"""
    deploy_dir = os.path.expanduser("~/zongyuan-worker")
    os.makedirs(deploy_dir, exist_ok=True)
    os.makedirs(f"{deploy_dir}/logs", exist_ok=True)

    # 下载Worker脚本
    worker_url = f"{DEPLOY_URL}/octop_worker.py"
    worker_path = f"{deploy_dir}/octop_worker.py"
    if not download_file(worker_url, worker_path):
        log("Worker下载失败")
        return False

    # 修改节点ID
    content = open(worker_path).read()
    content = content.replace('NODE_ID = "EXT-NODE-06B5F58617"', f'NODE_ID = "{node_id}"')
    open(worker_path, "w").write(content)

    # 创建systemd服务
    service_content = f"""[Unit]
Description=ZONGYUAN-ROOT Worker {node_id}
After=network.target

[Service]
Type=simple
User={os.environ.get('USER', 'root')}
WorkingDirectory={deploy_dir}
ExecStart=/usr/bin/python3 {worker_path}
Restart=always
RestartSec=30
StandardOutput=append:{deploy_dir}/logs/worker.log
StandardError=append:{deploy_dir}/logs/worker.log

[Install]
WantedBy=multi-user.target
"""
    service_path = f"/etc/systemd/system/zongyuan-worker-{node_id}.service"
    try:
        with open("/tmp/zr-worker.service", "w") as f:
            f.write(service_content)
        sh(f"sudo mv /tmp/zr-worker.service {service_path}")
        sh("sudo systemctl daemon-reload")
        sh(f"sudo systemctl enable zongyuan-worker-{node_id}.service")
        sh(f"sudo systemctl start zongyuan-worker-{node_id}.service")
        log(f"systemd服务已创建: zongyuan-worker-{node_id}")
    except:
        log("systemd服务创建失败，使用nohup启动")
        sh(f"nohup python3 {worker_path} >> {deploy_dir}/logs/worker.log 2>&1 &")

    return True

def deploy_macos(node_id):
    """macOS部署"""
    deploy_dir = os.path.expanduser("~/zongyuan-worker")
    os.makedirs(deploy_dir, exist_ok=True)
    os.makedirs(f"{deploy_dir}/logs", exist_ok=True)

    worker_url = f"{DEPLOY_URL}/octop_worker.py"
    worker_path = f"{deploy_dir}/octop_worker.py"
    if not download_file(worker_url, worker_path):
        log("Worker下载失败")
        return False

    content = open(worker_path).read()
    content = content.replace('NODE_ID = "EXT-NODE-06B5F58617"', f'NODE_ID = "{node_id}"')
    open(worker_path, "w").write(content)

    # 创建launchd plist
    plist_content = f"""<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key><string>com.zongyuan.worker.{node_id}</string>
    <key>ProgramArguments</key>
    <array><string>/usr/bin/python3</string><string>{worker_path}</string></array>
    <key>WorkingDirectory</key><string>{deploy_dir}</string>
    <key>RunAtLoad</key><true/>
    <key>KeepAlive</key><true/>
    <key>StandardOutPath</key><string>{deploy_dir}/logs/worker.log</string>
    <key>StandardErrorPath</key><string>{deploy_dir}/logs/worker.log</string>
</dict>
</plist>"""
    plist_path = os.path.expanduser(f"~/Library/LaunchAgents/com.zongyuan.worker.{node_id}.plist")
    with open(plist_path, "w") as f:
        f.write(plist_content)
    sh(f"launchctl load {plist_path}")
    log(f"launchd服务已创建")
    return True

def deploy_windows(node_id):
    """Windows部署"""
    deploy_dir = os.path.join(os.environ.get('USERPROFILE', 'C:\\'), 'zongyuan-worker')
    os.makedirs(deploy_dir, exist_ok=True)
    os.makedirs(os.path.join(deploy_dir, 'logs'), exist_ok=True)

    worker_url = f"{DEPLOY_URL}/octop_worker.py"
    worker_path = os.path.join(deploy_dir, 'octop_worker.py')
    if not download_file(worker_url, worker_path):
        log("Worker下载失败")
        return False

    content = open(worker_path, encoding='utf-8').read()
    content = content.replace('NODE_ID = "EXT-NODE-06B5F58617"', f'NODE_ID = "{node_id}"')
    open(worker_path, "w", encoding='utf-8').write(content)

    # 创建计划任务
    task_name = f"ZONGYUAN-ROOT-Worker-{node_id}"
    cmd = f'schtasks /Create /SC ONSTART /TN "{task_name}" /TR "python {worker_path}" /F /RL HIGHEST'
    sh(cmd)
    # 立即启动
    sh(f'start /B python {worker_path}')
    log(f"计划任务已创建: {task_name}")
    return True

def main():
    node_id = sys.argv[1] if len(sys.argv) > 1 else socket.gethostname()
    plat = detect_platform()

    print("=" * 60)
    print("  ZONGYUAN-ROOT 通用Worker部署")
    print(f"  节点: {node_id} | 平台: {plat}")
    print("=" * 60)

    log(f"开始部署Worker守护组件...")

    if plat == "linux":
        success = deploy_linux(node_id)
    elif plat == "macos":
        success = deploy_macos(node_id)
    elif plat == "windows":
        success = deploy_windows(node_id)
    else:
        log(f"不支持的平台: {plat}")
        sys.exit(1)

    if success:
        log(f"[DONE] Worker部署完成")
        print(f"\n节点: {node_id}")
        print(f"部署目录: {os.path.expanduser('~/zongyuan-worker')}")
        print(f"日志: ~/zongyuan-worker/logs/worker.log")
        print(f"验证: curl {GATEWAY}/api/status")
    else:
        log("部署失败")
        sys.exit(1)

if __name__ == "__main__":
    main()
