#!/usr/bin/env python
"""
FC岐阜イベント限定データ移行スクリプト
FC岐阜イベントに関連するチーム・エントリーのみを移行して問題を解決
"""

import os
import sys
import django

if __name__ == '__main__':
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings')
    django.setup()
    
    from django.db import connection
    from rog.models import NewEvent2, Team, Entry, NewCategory, CustomUser
    
    print("=== FC岐阜イベント限定データ移行 ===")
    
    try:
        # FC岐阜イベントを確認
        fc_event = NewEvent2.objects.filter(event_name__icontains='FC岐阜').first()
        if not fc_event:
            print("❌ FC岐阜イベントが見つかりません")
            sys.exit(1)
            
        print(f"✅ FC岐阜イベント: {fc_event.event_name} (ID: {fc_event.id})")
        
        with connection.cursor() as cursor:
            # まず、全体的なデータ構造を確認
            print("\\n=== データベース構造調査 ===")
            
            # 1. rog_entry テーブルの全体状況
            cursor.execute("SELECT COUNT(*) FROM rog_entry;")
            total_entries = cursor.fetchone()[0]
            print(f"総エントリー数: {total_entries}件")
            
            # 2. rog_entry のフィールド構造確認
            cursor.execute("""
                SELECT column_name, data_type, is_nullable
                FROM information_schema.columns 
                WHERE table_name = 'rog_entry' 
                ORDER BY ordinal_position;
            """)
            entry_columns = cursor.fetchall()
            print("\\nrog_entry テーブル構造:")
            for col_name, data_type, nullable in entry_columns:
                print(f"  - {col_name}: {data_type} {'(NULL可)' if nullable == 'YES' else '(NOT NULL)'}")
            
            # 3. rog_team テーブルも確認（ゼッケン情報がチーム側にある可能性）
            cursor.execute("""
                SELECT column_name, data_type, is_nullable
                FROM information_schema.columns 
                WHERE table_name = 'rog_team' 
                ORDER BY ordinal_position;
            """)
            team_columns = cursor.fetchall()
            print("\\nrog_team テーブル構造:")
            for col_name, data_type, nullable in team_columns:
                if 'zekken' in col_name.lower() or 'number' in col_name.lower():
                    print(f"  🎯 {col_name}: {data_type} {'(NULL可)' if nullable == 'YES' else '(NOT NULL)'}")
                else:
                    print(f"  - {col_name}: {data_type}")
            
            # 4. イベント別エントリー数確認
            cursor.execute("""
                SELECT e.id, e.event_name, COUNT(re.id) as entry_count
                FROM rog_newevent2 e
                LEFT JOIN rog_entry re ON e.id = re.event_id
                GROUP BY e.id, e.event_name
                ORDER BY entry_count DESC
                LIMIT 10;
            """)
            event_entries = cursor.fetchall()
            print("\\n=== イベント別エントリー数（上位10件） ===")
            for event_id, event_name, count in event_entries:
                print(f"  Event {event_id}: '{event_name}' - {count}件")
            
            # 5. FC岐阜関連のより広範囲な検索
            cursor.execute("""
                SELECT re.*, rt.team_name, rt.zekken_number as team_zekken
                FROM rog_entry re
                JOIN rog_newevent2 e ON re.event_id = e.id
                JOIN rog_team rt ON re.team_id = rt.id
                WHERE e.event_name LIKE '%FC岐阜%' OR e.event_name LIKE '%fc岐阜%' OR e.event_name LIKE '%FC%'
                LIMIT 20;
            """)
            
            fc_entry_data = cursor.fetchall()
            print(f"\\n✅ FC岐阜関連エントリー（広範囲検索）: {len(fc_entry_data)}件")
            
            if fc_entry_data:
                print("\\n🔍 FC岐阜関連データ詳細:")
                for row in fc_entry_data[:5]:  # 最初の5件を表示
                    print(f"  Entry ID: {row[0]}, Team: {row[-2]}, Team Zekken: {row[-1]}")
            
            # 6. チームテーブルでゼッケン番号がある場合を確認
            cursor.execute("""
                SELECT rt.id, rt.team_name, rt.zekken_number, rt.event_id
                FROM rog_team rt
                JOIN rog_newevent2 e ON rt.event_id = e.id
                WHERE e.event_name LIKE '%FC岐阜%'
                AND rt.zekken_number IS NOT NULL
                AND rt.zekken_number != ''
                ORDER BY CAST(rt.zekken_number AS INTEGER)
                LIMIT 20;
            """)
            
            team_zekken_data = cursor.fetchall()
            print(f"\\n✅ FC岐阜チームのゼッケン番号: {len(team_zekken_data)}件")
            
            if team_zekken_data:
                print("\\n🎯 チーム側のゼッケン番号データ:")
                for team_id, team_name, zekken, event_id in team_zekken_data[:10]:
                    print(f"  チーム{team_id}: {team_name} - ゼッケン{zekken}")
                
                # チーム側にゼッケン情報がある場合、それを使ってエントリーを作成
                print("\\n=== チーム側ゼッケン情報からエントリー作成 ===")
                created_entries = 0
                
                for team_id, team_name, zekken, event_id in team_zekken_data:
                    # チームを取得
                    try:
                        team = Team.objects.get(id=team_id)
                        
                        # エントリーを作成
                        entry, entry_created = Entry.objects.get_or_create(
                            team=team,
                            event=fc_event,
                            defaults={
                                'category': team.category,
                                'date': fc_event.start_datetime,
                                'owner': team.owner,
                                'zekken_number': int(zekken) if zekken.isdigit() else 0,
                                'zekken_label': f"FC岐阜-{zekken}",
                                'is_active': True,
                                'hasParticipated': False,
                                'hasGoaled': False
                            }
                        )
                        
                        if entry_created:
                            created_entries += 1
                            print(f"    エントリー作成: {team_name} - ゼッケン{zekken}")
                    
                    except Team.DoesNotExist:
                        print(f"    ⚠️  チーム{team_id}が新DBに存在しません: {team_name}")
                    except Exception as e:
                        print(f"    ❌ エラー: {e}")
                
                print(f"\\n✅ 作成されたエントリー: {created_entries}件")
            else:
                print("❌ チーム側にもゼッケン情報がありません")
            
            # 7. 最終確認
            fc_entries = Entry.objects.filter(event=fc_event).order_by('zekken_number')
            print(f"\\n=== 最終結果 ===")
            print(f"FC岐阜イベント総エントリー: {fc_entries.count()}件")
            
            if fc_entries.exists():
                print("\\n🎉 ゼッケン番号一覧（最初の10件）:")
                for entry in fc_entries[:10]:
                    print(f"  ゼッケン{entry.zekken_number}: {entry.team.team_name}")
                print("\\n🎉 FC岐阜イベントのゼッケン番号表示問題が解決されました！")
            else:
                print("\\n❌ まだエントリーデータがありません")
                
                # 8. デバッグ用：全てのチームデータを確認
                all_teams = Team.objects.all()[:10]
                print(f"\\n🔍 新DBの全チーム（最初の10件、総数: {Team.objects.count()}件）:")
                for team in all_teams:
                    entries = Entry.objects.filter(team=team)
                    print(f"  Team {team.id}: {team.team_name} (エントリー: {entries.count()}件)")
                    
                # 9. FC岐阜イベントの詳細情報
                print(f"\\n🔍 FC岐阜イベント詳細:")
                print(f"  ID: {fc_event.id}")
                print(f"  名前: {fc_event.event_name}")
                print(f"  開始日: {fc_event.start_datetime}")
                print(f"  終了日: {fc_event.end_datetime}")
                
    except Exception as e:
        print(f"❌ エラーが発生しました: {e}")
        import traceback
        traceback.print_exc()
