#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
XML文件处理器
功能：
1. 交换new_value和odvl元素的值
2. 删除value为1的odvl元素
3. 为符合条件的record元素添加前置record元素
"""

import xml.etree.ElementTree as ET
import os
import argparse
from datetime import datetime

class XMLProcessor:
    def __init__(self, xml_path):
        self.xml_path = xml_path
        self.backup_path = self._create_backup_path()
        self.tree = None
        self.root = None
        
    def _create_backup_path(self):
        """创建备份文件路径"""
        timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
        base_name = os.path.splitext(self.xml_path)[0]
        return f"{base_name}_backup_{timestamp}.xml"
    
    def load_xml(self):
        """加载XML文件"""
        try:
            self.tree = ET.parse(self.xml_path)
            self.root = self.tree.getroot()
            print(f"✓ 成功加载XML文件: {self.xml_path}")
            return True
        except ET.ParseError as e:
            print(f"✗ XML解析错误: {e}")
            return False
        except Exception as e:
            print(f"✗ 文件加载错误: {e}")
            return False
    
    def create_backup(self):
        """创建备份文件"""
        try:
            self.tree.write(self.backup_path, encoding='utf-8', xml_declaration=True)
            print(f"✓ 备份文件已创建: {self.backup_path}")
            return True
        except Exception as e:
            print(f"✗ 备份创建失败: {e}")
            return False
    
    def swap_new_value_odvl(self):
        """交换new_value和odvl元素的值"""
        print("\n开始交换new_value和odvl的值...")
        
        record_count = 0
        swapped_count = 0
        
        # 遍历所有record元素
        for record in self.root.findall('.//record'):
            record_count += 1
            
            # 查找new_value和odvl元素（注意：元素类型可能是string或integer）
            new_value_elem = record.find(".//string[@id='new_value']")
            if new_value_elem is None:
                new_value_elem = record.find(".//integer[@id='new_value']")
            
            odvl_elem = record.find(".//string[@id='odvl']")
            if odvl_elem is None:
                odvl_elem = record.find(".//integer[@id='odvl']")
            
            # 如果两个元素都存在，则交换它们的值
            if new_value_elem is not None and odvl_elem is not None:
                new_value = new_value_elem.get('value')
                odvl_value = odvl_elem.get('value')
                
                # 交换值
                new_value_elem.set('value', odvl_value)
                odvl_elem.set('value', new_value)
                swapped_count += 1
        
        print(f"  总共处理了 {record_count} 个record元素")
        print(f"  成功交换了 {swapped_count} 对new_value和odvl的值")
        return swapped_count
    
    def delete_odvl_with_value_one(self):
        """删除所有value为1的odvl元素"""
        print("\n开始删除value为1的odvl元素...")
        
        deleted_count = 0
        
        # 查找并删除所有value为1的odvl元素
        # 使用递归方法遍历所有元素
        def delete_elements_recursively(element):
            nonlocal deleted_count
            # 创建副本以避免修改时出错
            children_to_remove = []
            for child in element:
                if child.tag == 'string' or child.tag == 'integer':
                    if child.get('id') == 'odvl' and child.get('value') == '1':
                        children_to_remove.append(child)
                else:
                    # 递归处理子元素
                    delete_elements_recursively(child)
            
            # 删除标记的元素
            for child in children_to_remove:
                element.remove(child)
                deleted_count += 1
        
        delete_elements_recursively(self.root)
        
        print(f"  成功删除了 {deleted_count} 个值为1的odvl元素")
        return deleted_count
    
    def add_preceding_records(self):
        """为符合条件的record元素添加前置record元素"""
        print("\n开始添加前置record元素...")
        
        processed_count = 0
        added_count = 0
        
        # 保存需要处理的record元素和它们的父元素
        records_to_process = []
        
        # 遍历所有record元素
        for parent in self.root.findall('.//'):
            for record in parent.findall('./record'):
                # 检查record是否包含所需的子元素
                has_new_value = (record.find(".//string[@id='new_value']") is not None or 
                                record.find(".//integer[@id='new_value']") is not None)
                has_db_unique_id = record.find(".//large[@id='db_unique_id']") is not None
                
                if has_new_value and has_db_unique_id:
                    records_to_process.append((parent, record))
        
        # 处理每个符合条件的record元素
        for parent, record in records_to_process:
            processed_count += 1
            
            # 获取需要的属性值
            db_unique_id_elem = record.find(".//large[@id='db_unique_id']")
            if db_unique_id_elem is not None:
                db_unique_id = db_unique_id_elem.get('value')
            else:
                db_unique_id = '8591572544203220405'  # 默认值
            
            version_elem = record.find(".//integer[@id='version']")
            if version_elem is not None:
                version = version_elem.get('value')
            else:
                version = '3719'  # 默认值
            
            # 创建新的record元素
            new_record = ET.Element('record')
            
            # 添加子元素到新record
            integer_db_type = ET.SubElement(new_record, 'integer')
            integer_db_type.set('id', 'database_table_type')
            integer_db_type.set('value', '55')
            
            large_db_id = ET.SubElement(new_record, 'large')
            large_db_id.set('id', 'db_unique_id')
            large_db_id.set('value', '4294967297')
            
            unsigned_prop = ET.SubElement(new_record, 'unsigned')
            unsigned_prop.set('id', 'property')
            unsigned_prop.set('value', '1094992978')
            
            # 创建内部record元素
            inner_record = ET.SubElement(new_record, 'record')
            inner_record.set('id', 'new_value')
            
            inner_integer_db_type = ET.SubElement(inner_record, 'integer')
            inner_integer_db_type.set('id', 'database_table_type')
            inner_integer_db_type.set('value', '1')
            
            inner_unsigned_dcty = ET.SubElement(inner_record, 'unsigned')
            inner_unsigned_dcty.set('id', 'dcty')
            inner_unsigned_dcty.set('value', '2')
            
            inner_large_db_id = ET.SubElement(inner_record, 'large')
            inner_large_db_id.set('id', 'db_unique_id')
            inner_large_db_id.set('value', db_unique_id)
            
            integer_version = ET.SubElement(new_record, 'integer')
            integer_version.set('id', 'version')
            integer_version.set('value', version)
            
            integer_db_random = ET.SubElement(new_record, 'integer')
            integer_db_random.set('id', 'db_random_id')
            integer_db_random.set('value', '489197305')
            
            boolean_client = ET.SubElement(new_record, 'boolean')
            boolean_client.set('id', 'is_client_field')
            boolean_client.set('value', 'true')
            
            # 在原record前插入新record
            record_index = list(parent).index(record)
            parent.insert(record_index, new_record)
            added_count += 1
        
        print(f"  总共处理了 {processed_count} 个record元素")
        print(f"  成功添加了 {added_count} 个前置record元素")
        return added_count
    
    def save_xml(self, output_path=None):
        """保存XML文件"""
        if output_path is None:
            output_path = self.xml_path
        
        try:
            self.tree.write(output_path, encoding='utf-8', xml_declaration=True)
            print(f"\n✓ XML文件已保存到: {output_path}")
            return True
        except Exception as e:
            print(f"\n✗ 保存文件失败: {e}")
            return False
    
    def process_all(self, output_path=None, 
                   do_swap=True, do_delete=True, do_add_preceding=False):
        """执行所有处理操作"""
        print("开始处理XML文件...")
        print("="*50)
        
        # 加载XML
        if not self.load_xml():
            return False
        
        # 创建备份
        self.create_backup()
        
        # 执行各种操作
        total_operations = 0
        
        if do_swap:
            total_operations += self.swap_new_value_odvl()
        
        if do_delete:
            total_operations += self.delete_odvl_with_value_one()
        
        if do_add_preceding:
            total_operations += self.add_preceding_records()
        
        print("="*50)
        print("处理完成！")
        print(f"总共执行了 {total_operations} 项操作")
        
        # 保存文件
        if self.save_xml(output_path):
            return True
        
        return False

def main():
    parser = argparse.ArgumentParser(description='XML文件处理器')
    parser.add_argument('xml_file', help='要处理的XML文件路径')
    parser.add_argument('-o', '--output', help='输出文件路径（可选）')
    parser.add_argument('--no-swap', action='store_true', help='跳过交换操作')
    parser.add_argument('--no-delete', action='store_true', help='跳过删除操作')
    parser.add_argument('--add-preceding', action='store_true', help='添加前置record元素')
    
    args = parser.parse_args()
    
    # 检查文件是否存在
    if not os.path.exists(args.xml_file):
        print(f"错误: 文件不存在 - {args.xml_file}")
        return
    
    # 创建处理器并执行
    processor = XMLProcessor(args.xml_file)
    
    success = processor.process_all(
        output_path=args.output,
        do_swap=not args.no_swap,
        do_delete=not args.no_delete,
        do_add_preceding=args.add_preceding
    )
    
    if success:
        print(f"\n✓ 所有操作已成功完成")
    else:
        print(f"\n✗ 处理过程中出现错误")

if __name__ == '__main__':
    # 如果直接运行脚本，使用默认参数
    import sys
    if len(sys.argv) == 1:
        # 默认处理当前目录下的1.xml文件
        xml_file = 'c:\\Users\\Administrator\\Desktop\\cs\\1.xml'
        if os.path.exists(xml_file):
            processor = XMLProcessor(xml_file)
            processor.process_all(
                output_path='c:\\Users\\Administrator\\Desktop\\cs\\1_processed.xml',
                do_swap=True,
                do_delete=True,
                do_add_preceding=True
            )
        else:
            print(f"默认XML文件不存在: {xml_file}")
    else:
        main()