#!/usr/bin/env python
"""
gifuroge.event_table から rogdb.rog_newevent2 への移行スクリプト

移行条件:
- event_day < '2024-10-01' のデータを移行
- self_rogaining = False として移行
- その他 = True として移行

フィールドマッピング:
- gifuroge.event_table.event_code → rogdb.rog_newevent2.event_name
- gifuroge.event_table.event_name → rogdb.rog_newevent2.event_description
- gifuroge.event_table.event_day + start_time → rogdb.rog_newevent2.start_datetime
- gifuroge.event_table.event_day + start_time + 5H → rogdb.rog_newevent2.end_datetime
- gifuroge.event_table.event_day + start_time - 3day → rogdb.rog_newevent2.deadlineDateTime
"""

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

if __name__ == '__main__':
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings')
    django.setup()

    from django.db import transaction
    from rog.models import NewEvent2
    from django.utils import timezone
    import pytz

    print("=== gifuroge.event_table から rogdb.rog_newevent2 への移行 ===")

    # JST タイムゾーン設定
    JST = pytz.timezone('Asia/Tokyo')

    def parse_datetime(event_day, start_time):
        """event_dayとstart_timeを結合してdatetimeオブジェクトを作成"""
        try:
            # event_dayの正規化
            if isinstance(event_day, str):
                # スラッシュをハイフンに置換
                if '/' in event_day:
                    event_day = event_day.replace('/', '-')
                # 年が2桁の場合は20を付加
                parts = event_day.split('-')
                if len(parts) == 3 and len(parts[0]) == 2:
                    parts[0] = '20' + parts[0]
                    event_day = '-'.join(parts)
            
            # start_timeの正規化（デフォルト値を設定）
            if not start_time or start_time == '':
                start_time = '09:00:00'
            
            # 時刻形式の確認と修正
            if start_time.count(':') == 1:
                start_time = start_time + ':00'
            elif start_time.count(':') == 0:
                start_time = start_time + ':00:00'
            
            # datetimeオブジェクトの作成
            datetime_str = f"{event_day} {start_time}"
            dt = datetime.strptime(datetime_str, '%Y-%m-%d %H:%M:%S')
            
            # JST タイムゾーンを設定
            dt_jst = JST.localize(dt)
            
            return dt_jst
            
        except Exception as e:
            print(f"⚠️ 日時解析エラー: event_day={event_day}, start_time={start_time}, error={e}")
            # デフォルト値として現在時刻を返す
            return timezone.now()

    try:
        # gifuroge データベースに接続
        gifuroge_conn = psycopg2.connect(
            host='postgres-db',
            database='gifuroge',
            user='admin',
            password='admin123456'
        )

        print("✅ gifurogeデータベースに接続成功")

        with gifuroge_conn.cursor() as cursor:
            # 移行対象データの取得
            print("\\n=== STEP 1: 移行対象データの確認 ===")
            
            cursor.execute("""
                SELECT event_code, event_name, start_time, event_day
                FROM event_table 
                WHERE event_day < '2024-10-01'
                  AND event_code IS NOT NULL
                  AND event_code != ''
                  AND start_time > '07:00:00'
                ORDER BY event_day
            """)
            
            events_to_migrate = cursor.fetchall()
            print(f"移行対象イベント: {len(events_to_migrate)}件")
            
            if len(events_to_migrate) == 0:
                print("移行対象のイベントがありません。")
                gifuroge_conn.close()
                sys.exit(0)
            
            # データの確認表示
            for event_code, event_name, start_time, event_day in events_to_migrate[:10]:
                print(f"  {event_code}: {event_name} ({event_day} {start_time})")
            
            if len(events_to_migrate) > 10:
                print(f"  ... 他 {len(events_to_migrate) - 10} 件")

            # 移行の実行
            print(f"\\n=== STEP 2: データ移行の実行 ===")
            
            migrated_count = 0
            updated_count = 0
            error_count = 0
            
            with transaction.atomic():
                for event_code, event_name, start_time, event_day in events_to_migrate:
                    try:
                        # 日時の計算
                        start_datetime = parse_datetime(event_day, start_time)
                        end_datetime = start_datetime + timedelta(hours=5)
                        deadline_datetime = start_datetime - timedelta(days=3)
                        
                        # 既存データのチェックと更新または新規作成
                        existing_event = NewEvent2.objects.filter(event_name=event_code).first()
                        
                        if existing_event:
                            # 既存データを更新
                            existing_event.event_description = event_name
                            existing_event.start_datetime = start_datetime
                            existing_event.end_datetime = end_datetime
                            existing_event.deadlineDateTime = deadline_datetime
                            existing_event.self_rogaining = False
                            existing_event.status = 'public'
                            existing_event.public = True
                            existing_event.hour_5 = True
                            existing_event.hour_3 = False
                            existing_event.class_general = True
                            existing_event.class_family = True
                            existing_event.class_solo_male = True
                            existing_event.class_solo_female = True
                            existing_event.event_code = event_code
                            existing_event.start_time = start_time
                            existing_event.event_day = event_day
                            
                            existing_event.save()
                            updated_count += 1
                            print(f"🔄 更新完了: {event_code}")
                        else:
                            # 新しいイベントレコードの作成
                            new_event = NewEvent2(
                                event_name=event_code,  # event_code → event_name
                                event_description=event_name,  # event_name → event_description
                                start_datetime=start_datetime,
                                end_datetime=end_datetime,
                                deadlineDateTime=deadline_datetime,
                                self_rogaining=False,  # 指定条件
                                # その他=True に相当するフィールドがないため、コメントで記録
                                # 必要に応じてフィールドを追加する
                                status='public',  # デフォルトステータス
                                public=True,  # 公開設定
                                hour_5=True,  # 5時間イベント
                                hour_3=False,  # 3時間イベントではない
                                class_general=True,  # 一般クラス有効
                                class_family=True,  # ファミリークラス有効
                                class_solo_male=True,  # 男子ソロクラス有効
                                class_solo_female=True,  # 女子ソロクラス有効
                                # MobServer統合フィールドの設定
                                event_code=event_code,
                                start_time=start_time,
                                event_day=event_day
                            )
                            
                            new_event.save()
                            migrated_count += 1
                            print(f"✅ 新規作成: {event_code}")
                        
                    except Exception as e:
                        error_count += 1
                        print(f"❌ 移行エラー: {event_code} - {e}")
                        continue

        print(f"\\n=== 移行結果 ===")
        print(f"新規作成: {migrated_count}件")
        print(f"更新完了: {updated_count}件")
        print(f"移行エラー: {error_count}件")
        print(f"合計処理: {migrated_count + updated_count + error_count}件")

        # 移行結果の確認
        print(f"\\n=== 移行後データ確認 ===")
        migrated_events = NewEvent2.objects.filter(
            self_rogaining=False
        ).order_by('start_datetime')
        
        print(f"移行されたイベント数: {migrated_events.count()}件")
        for event in migrated_events[:10]:
            print(f"  {event.event_name}: {event.event_description} ({event.start_datetime})")

    except Exception as e:
        print(f"❌ 移行処理でエラーが発生しました: {e}")
        import traceback
        traceback.print_exc()

    finally:
        if 'gifuroge_conn' in locals():
            gifuroge_conn.close()
            print("✅ データベース接続を閉じました")

    print("\\n=== 移行処理完了 ===")
