#!/usr/bin/env python3
"""
テストステップ1: 大垣3イベントをコピーして大垣テストイベントを作成し、
テストユーザー、チーム、メンバーを含む完全なテストデータを構築する
"""

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

# Django設定を読み込み
sys.path.append('/app')
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings')
django.setup()

from rog.models import NewEvent2, NewCategory, Entry, Team, Member, CustomUser

def create_test_event():
    """大垣3イベントをベースに大垣テストイベントを作成"""
    print("=== テストイベント作成開始 ===")
    
    # 既存の大垣３イベントを検索
    base_event = None
    for event in NewEvent2.objects.all():
        if "大垣３" == event.event_name:
            base_event = event
            print(f"ベースイベント発見: {event.event_name} (ID: {event.id})")
            break
    
    if not base_event:
        print("大垣３イベントが見つかりません")
        return None
    
    # 大垣テストイベントが既に存在するかチェック
    test_event = NewEvent2.objects.filter(event_name__contains="大垣テスト").first()
    if test_event:
        print(f"テストイベントは既に存在します: {test_event.event_name} (ID: {test_event.id})")
        return test_event
    
    # 新しいテストイベントを作成
    now = datetime.now()
    test_event = NewEvent2.objects.create(
        event_name="大垣テスト",
        start_datetime=now + timedelta(days=1),
        end_datetime=now + timedelta(days=2),
        event_type=base_event.event_type,
        location=base_event.location,
        url=base_event.url,
        active=True,
        organizer=base_event.organizer
    )
    
    print(f"テストイベント作成完了: {test_event.event_name} (ID: {test_event.id})")
    return test_event

def create_test_user():
    """テストユーザーを作成"""
    print("\n=== テストユーザー作成開始 ===")
    
    email = "test_user@example.com"
    
    # 既存ユーザーをチェック
    test_user = CustomUser.objects.filter(email=email).first()
    if test_user:
        print(f"テストユーザーは既に存在します: {test_user.email} (ID: {test_user.id})")
        return test_user
    
    # 新しいテストユーザーを作成
    test_user = CustomUser.objects.create(
        email=email,
        firstname="テスト",
        lastname="太郎",
        date_of_birth=datetime(1990, 1, 1).date(),
        female=False,
        is_active=True
    )
    test_user.set_password("testpassword123")
    test_user.save()
    
    print(f"テストユーザー作成完了: {test_user.email} (ID: {test_user.id})")
    return test_user

def create_test_team(test_user, test_event):
    """テストチームを作成"""
    print("\n=== テストチーム作成開始 ===")
    
    team_name = "テストチーム1"
    
    # 既存チームをチェック
    test_team = Team.objects.filter(
        team_name=team_name,
        event=test_event
    ).first()
    
    if test_team:
        print(f"テストチームは既に存在します: {test_team.team_name} (ID: {test_team.id})")
        return test_team
    
    # デフォルトカテゴリーを取得
    default_category = NewCategory.objects.filter(category_name__contains="Default").first()
    if not default_category:
        # 適当なカテゴリーを取得
        default_category = NewCategory.objects.first()
    
    # 新しいテストチームを作成
    test_team = Team.objects.create(
        team_name=team_name,
        owner=test_user,
        category=default_category,
        event=test_event,
        zekken_number="T001"
    )
    
    print(f"テストチーム作成完了: {test_team.team_name} (ID: {test_team.id})")
    return test_team

def create_test_member(test_user, test_team):
    """テストメンバーを作成"""
    print("\n=== テストメンバー作成開始 ===")
    
    # 既存メンバーをチェック
    test_member = Member.objects.filter(
        team=test_team,
        user=test_user
    ).first()
    
    if test_member:
        print(f"テストメンバーは既に存在します: {test_member.user.email} (ID: {test_member.id})")
        return test_member
    
    # 新しいテストメンバーを作成
    test_member = Member.objects.create(
        team=test_team,
        user=test_user,
        firstname=test_user.firstname,
        lastname=test_user.lastname,
        date_of_birth=test_user.date_of_birth,
        female=test_user.female
    )
    
    print(f"テストメンバー作成完了: {test_member.user.email} (ID: {test_member.id})")
    return test_member

def create_test_entries(test_event, test_team):
    """利用可能な全カテゴリーでエントリーを作成"""
    print("\n=== テストエントリー作成開始 ===")
    
    # 利用可能なカテゴリーを取得
    categories = NewCategory.objects.all()
    print(f"利用可能なカテゴリー数: {categories.count()}")
    
    created_entries = []
    for category in categories[:3]:  # 最初の3つのカテゴリーのみでテスト
        # 既存エントリーをチェック
        existing_entry = Entry.objects.filter(
            team=test_team,
            event=test_event,
            category=category
        ).first()
        
        if existing_entry:
            print(f"エントリーは既に存在します: {category.category_name}")
            created_entries.append(existing_entry)
            continue
        
        try:
            # 新しいエントリーを作成
            entry = Entry.objects.create(
                team=test_team,
                event=test_event,
                category=category,
                date=test_event.start_datetime,
                owner=test_team.owner,
                zekken_number=1
            )
            created_entries.append(entry)
            print(f"エントリー作成完了: {category.category_name} (ID: {entry.id})")
            
        except Exception as e:
            print(f"エントリー作成エラー ({category.category_name}): {e}")
    
    print(f"合計 {len(created_entries)} 個のエントリーを作成/確認しました")
    return created_entries

def main():
    """メイン処理"""
    print("テストデータ作成スクリプト開始")
    print("=" * 50)
    
    try:
        # 1. テストイベント作成
        test_event = create_test_event()
        if not test_event:
            print("テストイベント作成に失敗しました")
            return
        
        # 2. テストユーザー作成
        test_user = create_test_user()
        
        # 3. テストチーム作成
        test_team = create_test_team(test_user, test_event)
        
        # 4. テストメンバー作成
        test_member = create_test_member(test_user, test_team)
        
        # 5. テストエントリー作成
        test_entries = create_test_entries(test_event, test_team)
        
        print("\n" + "=" * 50)
        print("テストデータ作成完了!")
        print(f"イベント: {test_event.event_name}")
        print(f"ユーザー: {test_user.email}")
        print(f"チーム: {test_team.team_name}")
        print(f"メンバー: {test_member.user.email}")
        print(f"エントリー数: {len(test_entries)}")
        
    except Exception as e:
        print(f"エラーが発生しました: {e}")
        import traceback
        traceback.print_exc()

if __name__ == "__main__":
    main()
