# 既存のインポート部分を変更
from rest_framework.decorators import api_view
from rest_framework.response import Response
from rest_framework import status
from rog.models import NewEvent2, Entry  # Eventから変更
import logging
from django.db.models import F, Q
from django.conf import settings
import os
from urllib.parse import urljoin

logger = logging.getLogger(__name__)

"""
これで/check_event_codeエンドポイントがDjangoに実装されました。
このエンドポイントは元のRubyコードと同様に、ゼッケン番号とパスワードの認証を行い、
正しい場合はイベントコードを返します。

※注意: パスワード検証部分は、Djangoのcheck_passwordメソッドを使用していますが、
元のRubyコードでの検証方法と異なる可能性があります。
データベースの実際の構造や認証方法に合わせて調整が必要かもしれません。
"""

@api_view(['GET'])
def check_event_code(request):
    """
    ゼッケン番号とパスワードの組み合わせが正しいか確認し、イベントコードを返す
    パラメータ:
    - zekken_number: ゼッケン番号
    - pw: パスワード
    """
    logger.info("check_event_code called")
    
    zekken_number = request.query_params.get('zekken_number')
    password = request.query_params.get('pw')
    
    logger.debug(f"Parameters: zekken_number={zekken_number}, password={'*' * len(password) if password else None}")
    
    if not zekken_number or not password:
        logger.warning("Missing required parameters")
        return Response({"status": "ERROR", "message": "ゼッケン番号とパスワードが必要です"}, status=status.HTTP_400_BAD_REQUEST)
    
    try:
        # ゼッケン番号とパスワードでユーザーを検索
        entry = Entry.objects.filter(zekken_number=zekken_number).first()
        
        if not entry:
            logger.warning(f"No entry found for zekken_number: {zekken_number}")
            return Response({"status": "ERROR", "message": "ゼッケン番号が見つかりません"}, status=status.HTTP_404_NOT_FOUND)
        
        user = entry.owner
        
        # パスワード検証
        if not user.check_password(password):
            logger.warning(f"Invalid password for zekken_number: {zekken_number}")
            return Response({"status": "ERROR", "message": "パスワードが正しくありません"}, status=status.HTTP_401_UNAUTHORIZED)
        
        # NewEvent2のイベント参照に対応
        # Entryモデルがnew_event2などの別フィールド名でNewEvent2を参照している場合は変更が必要
        new_event = NewEvent2.objects.filter(id=entry.event.id).first()
        event_code = new_event.event_name if new_event else None
        
        if not event_code:
            logger.warning(f"No event associated with zekken_number: {zekken_number}")
            return Response({"status": "ERROR", "message": "イベントが見つかりません"}, status=status.HTTP_404_NOT_FOUND)
        
        logger.info(f"Authentication successful for zekken_number: {zekken_number}, event_code: {event_code}")
        return Response({"status": "OK", "event_code": event_code})
    
    except Exception as e:
        logger.error(f"Error in check_event_code: {str(e)}")
        return Response({"status": "ERROR", "message": "サーバーエラーが発生しました"}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
