#!/usr/bin/env python3
"""
502エラー調査スクリプト: checkin_from_rogappエンドポイントのデバッグ
"""

import subprocess
import time
import requests
import json
from datetime import datetime

def test_checkin_endpoint():
    """
    checkin_from_rogappエンドポイントをテストして502エラーを再現
    """
    print("🔍 502エラー調査: checkin_from_rogappエンドポイント")
    print("=" * 60)
    
    # テストデータ
    test_data = {
        "event_code": "fc_gifu_2025",
        "team_name": "テストチーム",
        "cp_number": "1",
        "image": "data:image/jpeg;base64,/9j/4AAQSkZJRgABA...",  # 短縮版
        "buy_flag": False,
        "gps_coordinates": {
            "latitude": 35.6762,
            "longitude": 139.6503,
            "accuracy": 5.0,
            "timestamp": datetime.now().isoformat()
        },
        "camera_metadata": {
            "capture_time": datetime.now().isoformat(),
            "device_info": "debug_script"
        }
    }
    
    # URLを構築
    base_url = "http://localhost:8100"
    checkin_url = f"{base_url}/gifuroge/checkin_from_rogapp"
    
    print(f"🎯 テスト対象URL: {checkin_url}")
    print(f"📊 テストデータ: {json.dumps({k: v if k != 'image' else '[BASE64_DATA]' for k, v in test_data.items()}, indent=2, ensure_ascii=False)}")
    
    # まず、GETリクエストでエンドポイントの存在確認
    print(f"\n🔍 エンドポイント存在確認（GETリクエスト）")
    try:
        get_response = requests.get(checkin_url, timeout=10)
        print(f"GET レスポンス: {get_response.status_code}")
        if get_response.status_code == 405:
            print(f"✅ エンドポイントは存在するが、GETメソッドは許可されていない（正常）")
        elif get_response.status_code == 404:
            print(f"❌ エンドポイントが見つからない")
            return False
    except Exception as e:
        print(f"❌ GET テストエラー: {e}")
    
    # 正しいURLパターンでもテスト
    alternative_urls = [
        f"{base_url}/rog/checkin_from_rogapp",
        f"{base_url}/api/checkin_from_rogapp", 
        f"{base_url}/checkin_from_rogapp"
    ]
    
    print(f"\n🔍 代替URLパターンテスト")
    for url in alternative_urls:
        try:
            resp = requests.get(url, timeout=5)
            print(f"  {url}: {resp.status_code}")
            if resp.status_code in [200, 405]:
                print(f"    ✅ このURLが正しい可能性があります")
        except:
            print(f"  {url}: 接続エラー")
    
    try:
        print(f"\n🚀 POSTリクエスト送信中...")
        
        # リクエスト送信
        response = requests.post(
            checkin_url,
            json=test_data,
            headers={
                'Content-Type': 'application/json',
                'User-Agent': 'Debug-Script/1.0'
            },
            timeout=30
        )
        
        print(f"📥 レスポンス受信:")
        print(f"   ステータスコード: {response.status_code}")
        print(f"   ヘッダー: {dict(response.headers)}")
        
        if response.status_code == 405:
            print(f"❌ 405 Method Not Allowed エラー")
            print(f"   💡 原因: エンドポイントが存在するが、POSTメソッドが許可されていない")
            print(f"   📋 許可されているメソッドを確認が必要")
            print(f"   レスポンステキスト: {response.text}")
            return False
        elif response.status_code == 502:
            print(f"❌ 502 Bad Gateway エラーを確認しました")
            print(f"   レスポンステキスト: {response.text}")
            return False
        elif response.status_code == 200:
            print(f"✅ 正常レスポンス")
            print(f"   レスポンスデータ: {response.json()}")
            return True
        else:
            print(f"⚠️  予期しないステータスコード: {response.status_code}")
            print(f"   レスポンステキスト: {response.text}")
            return False
            
    except requests.exceptions.ConnectionError as e:
        print(f"❌ 接続エラー: {e}")
        return False
    except requests.exceptions.Timeout as e:
        print(f"❌ タイムアウトエラー: {e}")
        return False
    except Exception as e:
        print(f"❌ その他のエラー: {e}")
        return False

def monitor_logs_during_test():
    """
    テスト実行中のログを監視
    """
    print(f"\n🔍 ログ監視開始")
    print("-" * 40)
    
    try:
        # アプリケーションログを監視
        result = subprocess.run(
            ['docker', 'compose', 'logs', '--tail=20', '--follow', 'app'],
            capture_output=True,
            text=True,
            timeout=10
        )
        
        print(f"📋 アプリケーションログ:")
        print(result.stdout)
        
        if result.stderr:
            print(f"⚠️  エラー出力:")
            print(result.stderr)
            
    except subprocess.TimeoutExpired:
        print(f"⏰ ログ監視タイムアウト（正常）")
    except Exception as e:
        print(f"❌ ログ監視エラー: {e}")

def check_docker_services():
    """
    Dockerサービスの状態確認
    """
    print(f"\n🐳 Dockerサービス状態確認")
    print("-" * 40)
    
    try:
        # サービス状態確認
        result = subprocess.run(
            ['docker', 'compose', 'ps'],
            capture_output=True,
            text=True,
            check=True
        )
        
        print(f"📊 サービス状態:")
        print(result.stdout)
        
        # ヘルスチェック
        health_result = subprocess.run(
            ['docker', 'compose', 'exec', 'app', 'python', 'manage.py', 'check'],
            capture_output=True,
            text=True
        )
        
        if health_result.returncode == 0:
            print(f"✅ Djangoアプリケーション: 正常")
            print(health_result.stdout)
        else:
            print(f"❌ Djangoアプリケーション: エラー")
            print(health_result.stderr)
            
    except subprocess.CalledProcessError as e:
        print(f"❌ Dockerコマンドエラー: {e}")
        print(f"stderr: {e.stderr}")
    except Exception as e:
        print(f"❌ その他のエラー: {e}")

def analyze_nginx_config():
    """
    nginx設定の確認
    """
    print(f"\n🌐 nginx設定確認")
    print("-" * 40)
    
    try:
        # nginx設定テスト
        result = subprocess.run(
            ['docker', 'compose', 'exec', 'nginx', 'nginx', '-t'],
            capture_output=True,
            text=True
        )
        
        if result.returncode == 0:
            print(f"✅ nginx設定: 正常")
            print(result.stdout)
        else:
            print(f"❌ nginx設定: エラー")
            print(result.stderr)
            
        # 最近のnginxエラーログ
        error_log_result = subprocess.run(
            ['docker', 'compose', 'logs', '--tail=10', 'nginx'],
            capture_output=True,
            text=True
        )
        
        print(f"\n📋 nginx最近のログ:")
        print(error_log_result.stdout)
        
    except Exception as e:
        print(f"❌ nginx確認エラー: {e}")

def check_django_configuration():
    """
    Django設定の確認
    """
    print(f"\n⚙️  Django設定確認")
    print("-" * 40)
    
    try:
        # Django URL設定の確認
        result = subprocess.run(
            ['docker', 'compose', 'exec', 'app', 'python', 'manage.py', 'show_urls'],
            capture_output=True,
            text=True
        )
        
        if result.returncode == 0:
            print(f"✅ URL確認コマンド実行成功")
            # checkin_from_rogappが含まれているかチェック
            if 'checkin_from_rogapp' in result.stdout:
                print(f"✅ checkin_from_rogappエンドポイントがURL設定に存在")
            else:
                print(f"❌ checkin_from_rogappエンドポイントがURL設定に見つからない")
            print(f"URL一覧（抜粋）:")
            for line in result.stdout.split('\n'):
                if 'checkin' in line.lower() or 'rogapp' in line.lower():
                    print(f"  {line}")
        else:
            print(f"⚠️  show_urlsコマンドが利用できません")
            
        # CSRF設定確認
        csrf_result = subprocess.run(
            ['docker', 'compose', 'exec', 'app', 'python', '-c', 
             "import django; django.setup(); from django.conf import settings; print(f'CSRF_COOKIE_SECURE: {settings.CSRF_COOKIE_SECURE}'); print(f'CSRF_TRUSTED_ORIGINS: {getattr(settings, \"CSRF_TRUSTED_ORIGINS\", \"Not set\")}')"],
            capture_output=True,
            text=True
        )
        
        if csrf_result.returncode == 0:
            print(f"\n🔒 CSRF設定:")
            print(csrf_result.stdout)
        else:
            print(f"⚠️  CSRF設定確認エラー: {csrf_result.stderr}")
            
    except Exception as e:
        print(f"❌ Django設定確認エラー: {e}")

def main():
    """
    メイン実行関数
    """
    print(f"🚨 405 Method Not Allowed エラー調査ツール")
    print(f"時刻: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
    print("=" * 60)
    
    # 1. Dockerサービス状態確認
    check_docker_services()
    
    # 2. nginx設定確認
    analyze_nginx_config()
    
    # 3. Django設定確認
    check_django_configuration()
    
    # 4. エンドポイントテスト
    print(f"\n🎯 エンドポイントテスト実行")
    print("-" * 40)
    
    success = test_checkin_endpoint()
    
    # 5. ログ確認
    monitor_logs_during_test()
    
    # 結果まとめ
    print(f"\n📊 調査結果まとめ")
    print("=" * 60)
    
    if success:
        print(f"✅ checkin_from_rogappエンドポイントは正常に動作しています")
        print(f"💡 502エラーは一時的な問題だった可能性があります")
    else:
        print(f"❌ 405 Method Not Allowed エラーを確認しました")
        print(f"💡 問題の原因と対策:")
        print(f"   🔧 考えられる原因:")
        print(f"      1. CSRFトークンの問題")
        print(f"      2. @api_viewデコレータの設定問題")
        print(f"      3. URLパターンの不一致")
        print(f"      4. nginx設定でPOSTメソッドがブロックされている")
        print(f"   🛠️  推奨対策:")
        print(f"      1. views.pyで@api_view(['POST'])の設定確認")
        print(f"      2. urls.pyでのルーティング確認")
        print(f"      3. nginx設定でPOSTメソッド許可確認")
        print(f"      4. CSRF設定の確認")

if __name__ == "__main__":
    main()
