#!/usr/bin/env python
"""
修复球员数据脚本
解决数据导入过程中出现的字段值错误分配问题
"""

import os
import django
import sys
from pathlib import Path
from datetime import datetime, timedelta

# 添加项目根目录到Python路径
project_root = Path(__file__).resolve().parent
sys.path.insert(0, str(project_root))

# 设置Django环境
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'api.project_config.settings')
django.setup()

from api.models import Player


def fix_player_data():
    """
    修复球员数据中的错误
    """
    print("开始修复球员数据...")
    print("=" * 60)
    
    fixed_count = 0
    
    # 获取所有球员
    players = Player.objects.all()
    
    # 特别处理Gabriel Jesus等球员
    gabriel_players = Player.objects.filter(name__icontains='Gabriel')
    for player in gabriel_players:
        changed = False
        
        # 特殊处理Gabriel系列球员的错误数据
        if player.name == 'Gabriel Jesus' and player.height == 27:
            # 27应该是年龄而不是身高
            player.age = 27
            player.height = 175  # Gabriel Jesus的实际身高约为175cm
            print(f"  修复 '{player.name}': 设置正确的年龄和身高 (age={player.age}, height={player.height})")
            changed = True
            
        elif player.name == 'Gabriel Magalhaes' and player.height == 27:
            # 27应该是年龄而不是身高
            player.age = 27
            player.height = 190  # Gabriel Magalhaes的实际身高约为190cm
            print(f"  修复 '{player.name}': 设置正确的年龄和身高 (age={player.age}, height={player.height})")
            changed = True
            
        elif player.name == 'Gabriel Martinelli' and player.height == 23:
            # 23应该是年龄而不是身高
            player.age = 23
            player.height = 178  # Gabriel Martinelli的实际身高约为178cm
            print(f"  修复 '{player.name}': 设置正确的年龄和身高 (age={player.age}, height={player.height})")
            changed = True
        
        # 保存更改
        if changed:
            try:
                player.save()
                fixed_count += 1
            except Exception as e:
                print(f"  错误: 无法保存 '{player.name}' 的更改: {e}")
    
    # 处理其他球员
    for player in players:
        changed = False
        
        # 检查是否有数据错位的情况
        # 如果date_of_birth是空的，但age有值，可能age被错误地放在了date_of_birth位置
        if player.date_of_birth is None and player.age is not None:
            # 如果age看起来像一个年份 (比如20多岁到40多岁)
            if 20 <= player.age <= 45:
                # 假设这是一个年龄值，计算出生日期
                current_year = datetime.now().year
                birth_year = current_year - player.age
                try:
                    player.date_of_birth = datetime(birth_year, 1, 1).date()
                    print(f"  修复 '{player.name}': 设置出生日期为 {player.date_of_birth} (基于年龄 {player.age})")
                    changed = True
                except Exception as e:
                    print(f"  警告: 无法为 '{player.name}' 设置出生日期: {e}")
        
        # 检查height字段是否包含年龄信息
        if player.height is not None:
            # 如果height看起来像一个年龄值 (比如10-50)
            if isinstance(player.height, int) and 10 <= player.height <= 50:
                # 检查age是否看起来更像身高 (比如170-200)
                if player.age is not None and 170 <= player.age <= 200:
                    # 交换height和age
                    original_height = player.height
                    original_age = player.age
                    player.height = original_age
                    player.age = original_height
                    print(f"  修复 '{player.name}': 交换height和age (height={player.height}, age={player.age})")
                    changed = True
        
        # 如果height字段包含"cm"，则提取数值部分
        if player.height is not None and isinstance(player.height, str) and 'cm' in player.height:
            try:
                # 提取数字部分
                height_value = int(player.height.replace('cm', '').strip())
                player.height = height_value
                print(f"  修复 '{player.name}': 提取身高数值 {player.height}cm")
                changed = True
            except Exception as e:
                print(f"  警告: 无法解析 '{player.name}' 的身高字段 '{player.height}': {e}")
        
        # 如果height字段包含"|"分隔符，尝试解析
        if player.height is not None and isinstance(player.height, str) and '|' in player.height:
            try:
                parts = player.height.split('|')
                if len(parts) == 2:
                    # 假设格式是"age|height"
                    age_part = int(parts[0].strip())
                    height_part = int(parts[1].replace('cm', '').strip())
                    player.age = age_part
                    player.height = height_part
                    print(f"  修复 '{player.name}': 解析分隔数据 (age={player.age}, height={player.height})")
                    changed = True
            except Exception as e:
                print(f"  警告: 无法解析 '{player.name}' 的分隔数据 '{player.height}': {e}")
        
        # 保存更改
        if changed:
            try:
                player.save()
                if player.name not in [p.name for p in gabriel_players]:  # 避免重复计数
                    fixed_count += 1
            except Exception as e:
                print(f"  错误: 无法保存 '{player.name}' 的更改: {e}")
    
    print("=" * 60)
    print(f"修复完成，共处理 {fixed_count} 名球员")


def main():
    """
    主函数
    """
    fix_player_data()


if __name__ == "__main__":
    main()