#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
批量修复@Autowired字段注入问题
将字段注入改为构造器注入（使用Lombok的@RequiredArgsConstructor）
"""

import os
import re
from pathlib import Path

def fix_autowired_in_file(file_path):
    """修复单个文件中的@Autowired注入"""
    with open(file_path, 'r', encoding='utf-8') as f:
        content = f.read()
    
    original_content = content
    
    # 检查是否有@Autowired
    if '@Autowired' not in content:
        return False
    
    # 查找类声明
    class_match = re.search(r'public\s+class\s+(\w+)', content)
    if not class_match:
        return False
    
    class_name = class_match.group(1)
    
    # 查找所有@Autowired字段
    autowired_pattern = r'\s+@Autowired\s+\n?\s+private\s+(\w+)\s+(\w+);'
    autowired_fields = re.findall(autowired_pattern, content)
    
    if not autowired_fields:
        return False
    
    print(f"修复文件: {file_path}")
    print(f"  发现 {len(autowired_fields)} 个@Autowired字段")
    
    # 移除所有@Autowired和对应的private字段声明
    content = re.sub(autowired_pattern, '', content)
    
    # 移除import org.springframework.beans.factory.annotation.Autowired;
    content = re.sub(r'import\s+org\.springframework\.beans\.factory\.annotation\.Autowired;\n?', '', content)
    
    # 添加final修饰符到字段（如果还没有）
    for field_type, field_name in autowired_fields:
        # 查找private Type fieldName; 改为 private final Type fieldName;
        old_pattern = rf'private\s+{field_type}\s+{field_name};'
        new_pattern = f'private final {field_type} {field_name};'
        content = re.sub(old_pattern, new_pattern, content)
    
    # 添加@RequiredArgsConstructor
    if '@RequiredArgsConstructor' not in content:
        # 在类声明前添加
        content = re.sub(
            rf'(public\s+class\s+{class_name})',
            r'@RequiredArgsConstructor\n\1',
            content
        )
        
        # 添加import
        if 'import lombok.RequiredArgsConstructor;' not in content:
            content = re.sub(
                r'(import lombok\.[^;]+;\n)',
                r'\1import lombok.RequiredArgsConstructor;\n',
                content
            )
    
    # 清理多余的空行
    content = re.sub(r'\n{3,}', '\n\n', content)
    
    with open(file_path, 'w', encoding='utf-8') as f:
        f.write(content)
    
    print(f"  [OK] 已修复")
    return True

def main():
    """主函数"""
    services_dir = Path('D:/FzxBDSH/services')
    fixed_count = 0
    
    # 遍历所有Java文件
    for java_file in services_dir.rglob('*.java'):
        # 跳过test目录
        if 'test' in str(java_file):
            continue
        
        try:
            if fix_autowired_in_file(str(java_file)):
                fixed_count += 1
        except Exception as e:
            print(f"  [FAIL] 修复失败: {java_file}, 错误: {e}")
    
    print(f"\n总计修复文件数: {fixed_count}")

if __name__ == '__main__':
    main()
