#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
检测并修复缺失的字段声明
"""

import os
import re
from pathlib import Path

def find_missing_fields(file_path):
    """查找文件中使用的但未声明的字段"""
    with open(file_path, 'r', encoding='utf-8') as f:
        content = f.read()
    
    # 检查是否有@RequiredArgsConstructor
    if '@RequiredArgsConstructor' not in content:
        return []
    
    # 提取类名
    class_match = re.search(r'public\s+class\s+(\w+)', content)
    if not class_match:
        return []
    
    # 查找所有"xxxMapper."或"xxxService."或"xxxRepository."的使用
    field_usage_pattern = r'\b(\w+(?:Mapper|Service|Repository|Client|Template|Utils?))\.'
    used_fields = set(re.findall(field_usage_pattern, content))
    
    # 查找已声明的字段
    field_decl_pattern = r'private\s+final\s+\w+\s+(\w+);'
    declared_fields = set(re.findall(field_decl_pattern, content))
    
    # 找出未声明的字段
    missing_fields = used_fields - declared_fields
    
    return list(missing_fields)

def fix_missing_fields_in_file(file_path):
    """修复单个文件中缺失的字段声明"""
    with open(file_path, 'r', encoding='utf-8') as f:
        content = f.read()
    
    missing_fields = find_missing_fields(file_path)
    
    if not missing_fields:
        return False
    
    print(f"修复文件: {file_path}")
    print(f"  缺失字段: {missing_fields}")
    
    # 为每个缺失的字段添加声明
    field_declarations = []
    for field in missing_fields:
        # 根据字段名推断类型
        if field.endswith('Mapper'):
            field_type = field
        elif field.endswith('Service'):
            field_type = field
        elif field.endswith('Repository'):
            field_type = field
        elif field.endswith('Client'):
            field_type = field
        elif field.endswith('Template'):
            field_type = field
        else:
            field_type = field
        
        field_declarations.append(f'    private final {field_type} {field};')
    
    # 在类声明后的第一个位置插入字段声明
    field_declarations_str = '\n'.join(field_declarations)
    
    # 查找public class ClassName { 后的位置
    class_pattern = r'(public\s+class\s+\w+\s*\{)\n'
    match = re.search(class_pattern, content)
    if match:
        insert_pos = match.end()
        content = content[:insert_pos] + field_declarations_str + '\n' + content[insert_pos:]
    
    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目录和target目录
        if 'test' in str(java_file) or 'target' in str(java_file):
            continue
        
        try:
            if fix_missing_fields_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()
