import os
import subprocess
import re
import sys
from typing import Tuple, Optional

def run_command(cmd: str) -> Tuple[int, str]:
    """执行命令并返回退出码和输出"""
    try:
        result = subprocess.run(cmd, shell=True, check=False, 
                              stdout=subprocess.PIPE, stderr=subprocess.PIPE,
                              text=True)
        return result.returncode, result.stdout.strip()
    except Exception as e:
        return -1, str(e)

def check_java() -> bool:
    """检查JDK 17+是否安装"""
    print("\n检查JDK 17+...")
    rc, output = run_command("java -version 2>&1")
    if rc != 0:
        print("❌ 未检测到Java,请安装JDK 17+")
        return False
    
    version_pattern = r'"(\d+)(?:\.\d+)*(?:_\d+)?'
    match = re.search(version_pattern, output)
    if not match:
        print("❌ 无法解析Java版本")
        return False
    
    version = int(match.group(1))
    if version >= 17:
        print(f"✅ JDK版本 {version} (满足17+要求)")
        return True
    else:
        print(f"❌ JDK版本 {version} (需要17+)")
        return False

def check_maven() -> bool:
    """检查Maven是否安装"""
    print("\n检查Maven...")
    rc, output = run_command("mvn -v")
    if rc == 0:
        print("✅ Maven已安装")
        return True
    else:
        print("❌ Maven未安装")
        return False

def check_node() -> bool:
    """检查Node.js 20+是否安装"""
    print("\n检查Node.js 20+...")
    rc, output = run_command("node -v")
    if rc != 0:
        print("❌ Node.js未安装")
        return False
    
    version_pattern = r'v(\d+)\.\d+\.\d+'
    match = re.search(version_pattern, output)
    if not match:
        print("❌ 无法解析Node.js版本")
        return False
    
    version = int(match.group(1))
    if version >= 20:
        print(f"✅ Node.js版本 {version} (满足20+要求)")
        return True
    else:
        print(f"❌ Node.js版本 {version} (需要20+)")
        return False

def check_pnpm() -> bool:
    """检查PNPM 9+是否安装"""
    print("\n检查PNPM 9+...")
    rc, output = run_command("pnpm -v")
    if rc != 0:
        print("❌ PNPM未安装")
        return False
    
    try:
        # 处理可能的版本号格式:v9.0.0 或 9.0.0 或 9
        version_str = output.strip().lstrip('v').split('.')[0]
        version = int(version_str)
        
        if version >= 9:
            print(f"✅ PNPM版本 {output.strip()} (满足9+要求)")
            return True
        else:
            print(f"❌ PNPM版本 {output.strip()} (需要9+)")
            return False
    except (ValueError, IndexError):
        print(f"❌ 无法解析PNPM版本: {output.strip()}")
        return False

def check_redis_connection() -> bool:
    """检查Redis连接"""
    print("\n检查Redis连接...")
    print("⚠️ 请确保已配置Redis连接信息并在jeecg-boot项目中正确配置")
    print("⚠️ 此检查需要根据实际项目配置进行验证")
    print("⚠️ 配置文件位置: jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/application-dev.yml")
    return True

def check_mysql_connection() -> bool:
    """检查MySQL连接"""
    print("\n检查MySQL连接...")
    print("⚠️ 请确保已配置MySQL连接信息并在jeecg-boot项目中正确配置")
    print("⚠️ 此检查需要根据实际项目配置进行验证")
    print("⚠️ 配置文件位置: jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/application-dev.yml")
    return True

def print_mysql_config():
    """打印MySQL配置并提示需要修改的位置"""
    print("\nMySQL配置参考 (请检查以下配置是否正确):")
    print("""
spring.datasource.dynamic.datasource:
  master:
    url: jdbc:mysql://127.0.0.1:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
    username: root       # ← 可能需要修改
    password: root       # ← 可能需要修改
    driver-class-name: com.mysql.cj.jdbc.Driver
""")

def check_ai_vector_db() -> bool:
    """检查AI向量库(pgvector)配置"""
    print("\n检查AI知识库向量库配置...")
    print("⚠️ 如果需要使用AI知识库功能,请配置pgvector向量库")
    print("⚠️ 配置文件位置: jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/application-dev.yml")
    print("\n配置参考:")
    print("""
jeecg.ai-rag:
    embed-store:
      host: 127.0.0.1       # ← 可能需要修改
      port: 5432            # ← 可能需要修改
      database: postgres    # ← 可能需要修改
      user: postgres        # ← 可能需要修改
      password: postgres    # ← 可能需要修改
      table: embeddings     # ← 可能需要修改
""")
    print("⚠️ 注意: 请确保已安装PostgreSQL并添加pgvector扩展!docker安装参考:https://help.jeecg.com/aigc/config")
    return True

def check_ai_config() -> bool:
    """检查AI账号配置"""
    print("\n检查AI功能配置...")
    print("⚠️ 如果需要使用AI聊天功能,请配置AI账号信息")
    print("⚠️ 配置文件位置: jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/application-dev.yml")
    print("\n配置参考:")
    print("""
jeecg:
  # AI集成
  ai-chat:
    enabled: true           # ← 启用AI功能
    model: deepseek-chat    # ← 模型名称
    apiKey: ??              # ← 必须修改为您的API Key
    apiHost: https://api.deepseek.com/v1  # ← API地址
    timeout: 60             # ← 超时时间(秒)
""")
    print("⚠️ 注意: 请确保已获取有效的API Key并正确配置!AI账号注册获取参考: https://help.jeecg.com/java/deepSeekSupport")
    return True


def print_redis_config():
    """打印Redis配置并提示需要修改的位置"""
    print("\nRedis配置参考 (请检查以下配置是否正确):")
    print("""
spring.redis:
  database: 0
  host: 127.0.0.1        # ← 可能需要修改
  port: 6379             # ← 可能需要修改
  password: ''           # ← 如果需要密码请修改
""")

def main():
    print("="*50)
    print("JeecgBoot 运行环境检查脚本")
    print("="*50)
    
    all_checks_passed = True
    
    # 检查各项依赖
    if not check_java():
        all_checks_passed = False
    
    if not check_maven():
        all_checks_passed = False
    
    if not check_node():
        all_checks_passed = False
    
    if not check_pnpm():
        all_checks_passed = False
    
    # 数据库提示
    print("="*50)
    check_redis_connection()
    print_redis_config()
    print("="*50)
    check_mysql_connection()
    print_mysql_config()
    print("="*50)
    check_ai_config()
    print("="*50)
    check_ai_vector_db()
    
    print("\n" + "="*50)
    if all_checks_passed:
        print("✅ 所有基础环境检查通过")
        print("⚠️ 注意: 请确保Redis和MySQL、AI账号、向量库pgvector 已正确配置并连接成功")
    else:
        print("❌ 部分环境检查未通过,请根据上述提示解决问题")
    
    print("="*50)

if __name__ == "__main__":
    main()
    input("\n按回车键退出...")  # 等待用户输入