import datetime
import os
import sys
import threading
import time
from django.conf import settings

import subprocess

from django.http import JsonResponse


def get_reliable_uwsgi_path():
    """
    尝试多种方式获取 uwsgi 路径，优先使用 which 命令，其次尝试常见路径
    """
    # 方法一：使用 which 命令（最可靠）
    try:
        result = subprocess.run(['which', 'uwsgi'],
                                capture_output=True,
                                text=True,
                                check=True,
                                timeout=10)
        path = result.stdout.strip()
        if path and os.path.exists(path):
            return path
    except (subprocess.CalledProcessError, FileNotFoundError,
            subprocess.TimeoutExpired):
        pass

    # 方法二：检查项目虚拟环境中的路径（常见于宝塔面板）
    common_paths = [
        "/www/server/python_manager/venv/bin/uwsgi",  # 宝塔Python项目管理器的常见路径
        "/usr/local/bin/uwsgi",  # 常见的全局安装位置
        "/usr/bin/uwsgi",  # 系统包管理器可能安装的位置
        os.path.join(settings.BASE_DIR, "venv", "bin", "uwsgi"),  # 项目虚拟环境可能路径
        os.path.expanduser("~/.local/bin/uwsgi"),  # 用户本地安装
    ]

    for potential_path in common_paths:
        if os.path.exists(potential_path):
            return potential_path

    # 如果都找不到，返回 None
    return None


def writeRestartFile():
    with open(settings.RESTART_DIR, "w") as fields:
        now = str(datetime.datetime.now())
        fields.write(now)


def uWSGI_Reload():
    time.sleep(1)
    """跨平台uWSGI重启方案"""
    if sys.platform == 'win32':
        writeRestartFile()
        print("windowns系统需要手动重启才可以获得最好的重启系统")
    else:
        # Unix/Linux环境标准方案
        uwsgi_bin_path = get_reliable_uwsgi_path()
        pid_file = os.path.join(settings.BASE_DIR, "uwsgi.pid")
        time.sleep(1)

        if not os.path.exists(pid_file):
            print("未找到uWSGI pid文件，采用备用方案重启")
            writeRestartFile()
        else:
            if uwsgi_bin_path is None:
                print("⚠️  无法自动找到 uwsgi 可执行文件路径，将尝试使用 'uwsgi' 命令...")
                uwsgi_bin_path = "uwsgi"  # 回退到直接使用环境变量中的命令

            try:
                print(f"🔄 尝试使用 uWSGI 路径: {uwsgi_bin_path}")
                print(f"📁 PID 文件位置: {pid_file}")

                # 执行重启命令
                result = subprocess.run([uwsgi_bin_path, "--reload", pid_file],
                                        check=True,
                                        capture_output=True,
                                        text=True,
                                        timeout=30)
                print("✅ uWSGI 重启指令已发送成功")
                if result.stdout:
                    print(f"📋 输出: {result.stdout}")
            except subprocess.CalledProcessError as e:
                print(f"❌ uWSGI重启失败，退出码: {e.returncode}")
                if e.stderr:
                    print(f"📛 错误信息: {e.stderr}")
                # 此处可以加入你的备用重启方案，例如 touch-reload
                writeRestartFile()  # 取消注释如果你有这个函数
            except FileNotFoundError:
                print(f"❌ 未找到 uWSGI 可执行文件: {uwsgi_bin_path}")
                # 可以尝试其他备用方案
                writeRestartFile()
            except subprocess.TimeoutExpired:
                print("⏰ uWSGI 重启命令执行超时")
                writeRestartFile()
            except Exception as e:
                print(f"⚠️  重启过程中遇到未知错误: {str(e)}")
                writeRestartFile()


def restart_sys(request):

    # 创建一个线程来执行 uWSGI_Reload 函数
    reload_thread = threading.Thread(target=uWSGI_Reload)
    reload_thread.daemon = True  # 设置为守护线程，主线程退出时它会跟随退出（可选，根据你的需求）
    reload_thread.start()  # 启动线程
    return JsonResponse({
        'status': 200,
        "message": '系统将进行重启'
    },
                        content_type="application/json; charset=utf-8",
                        json_dumps_params={'ensure_ascii': False})
