#!/usr/bin/env python3
"""停止后台运行的服务。"""

import json
import subprocess
import sys
from pathlib import Path

PID_FILE = Path(__file__).resolve().parent / ".run" / "pids.json"
CREATE_NO_WINDOW = 0x08000000 if sys.platform == "win32" else 0


def kill_pid(pid: int) -> None:
    if sys.platform == "win32":
        subprocess.run(
            ["taskkill", "/PID", str(pid), "/T", "/F"],
            stdout=subprocess.DEVNULL,
            stderr=subprocess.DEVNULL,
            creationflags=CREATE_NO_WINDOW,
        )
    else:
        subprocess.run(["kill", "-9", str(pid)], stderr=subprocess.DEVNULL)


def kill_port(port: int) -> None:
    if sys.platform != "win32":
        return
    result = subprocess.run(
        ["netstat", "-ano"],
        capture_output=True,
        text=True,
        creationflags=CREATE_NO_WINDOW,
    )
    for line in result.stdout.splitlines():
        if f":{port}" in line and "LISTENING" in line:
            parts = line.split()
            if parts:
                try:
                    kill_pid(int(parts[-1]))
                except ValueError:
                    pass


def main() -> None:
    if PID_FILE.exists():
        try:
            data = json.loads(PID_FILE.read_text(encoding="utf-8"))
            for pid in data.values():
                if isinstance(pid, int):
                    kill_pid(pid)
        finally:
            PID_FILE.unlink(missing_ok=True)
    kill_port(8000)
    kill_port(5173)

    if sys.platform == "win32" and "--quiet" not in sys.argv:
        try:
            from notify import notify

            notify("DeepSeek 对话智能体", "已停止服务")
        except Exception:
            pass


if __name__ == "__main__":
    main()
