from django.shortcuts import render, redirect, get_object_or_404
from django.contrib.sessions.models import Session
from django.contrib import messages
from django.core.mail import send_mail
from django.template.loader import render_to_string
from django.utils import timezone
from django.http import JsonResponse
from django.views.decorators.http import require_http_methods
from django.conf import settings
import json
from datetime import datetime

from .models import Event, Seminar, Member, News, Organizer, Sponsor, PastEventImage
from .forms import EntranceLoginForm, MemberRegistrationForm


def entrance_login(request):
    """
    エントランスページ - パスワード認証
    """
    if request.method == 'POST':
        form = EntranceLoginForm(request.POST)
        if form.is_valid():
            password = form.cleaned_data['password']
            # 最新のイベント情報を取得
            event = Event.objects.filter(is_deleted=False).first()
            
            if event and event.entrance_password == password:
                # パスワードが正しい場合、セッションに記録
                request.session['event_entered'] = True
                request.session['event_id'] = event.event_id
                messages.success(request, 'ログインしました')
                return redirect('events:lp_main', event_id=event.event_id)
            else:
                messages.error(request, 'パスワードが正しくありません')
    else:
        form = EntranceLoginForm()
    
    return render(request, 'events/entrance_login.html', {'form': form})


def check_event_access(request, event_id):
    """
    イベントへのアクセス権限を確認
    """
    if not request.session.get('event_entered'):
        return False
    if request.session.get('event_id') != event_id:
        return False
    return True


def lp_main(request, event_id):
    """
    LPメインページ
    """
    if not check_event_access(request, event_id):
        return redirect('events:entrance_login')
    
    event = get_object_or_404(Event, event_id=event_id, is_deleted=False)
    seminars = Seminar.objects.filter(event=event, is_deleted=False, is_published=True)
    organizers = Organizer.objects.filter(event=event, is_deleted=False, is_published=True)
    sponsors = Sponsor.objects.filter(event=event, is_deleted=False, is_published=True)
    news_items = News.objects.filter(event=event, is_deleted=False, is_published=True)
    past_images = PastEventImage.objects.filter(event=event, is_deleted=False, is_published=True)
    
    # スポンサーをランク別に分類
    sponsor_by_rank = {}
    for rank_key, rank_label in Sponsor.SPONSOR_RANK_CHOICES:
        sponsor_by_rank[rank_key] = sponsors.filter(sponsor_rank=rank_key)
    
    context = {
        'event': event,
        'seminars': seminars,
        'organizers': organizers,
        'sponsors': sponsors,
        'sponsor_by_rank': sponsor_by_rank,
        'news_items': news_items,
        'past_images': past_images,
    }
    
    return render(request, 'events/lp_main.html', context)


def seminar_detail(request, event_id, seminar_id):
    """
    セミナー詳細ページ
    """
    if not check_event_access(request, event_id):
        return redirect('events:entrance_login')
    
    event = get_object_or_404(Event, event_id=event_id, is_deleted=False)
    seminar = get_object_or_404(Seminar, seminar_id=seminar_id, event=event, 
                               is_deleted=False, is_published=True)
    
    context = {
        'event': event,
        'seminar': seminar,
    }
    
    return render(request, 'events/seminar_detail.html', context)


def registration_form(request, event_id):
    """
    イベント参加申込フォーム
    """
    if not check_event_access(request, event_id):
        return redirect('events:entrance_login')
    
    event = get_object_or_404(Event, event_id=event_id, is_deleted=False)
    
    # 申込み受付期間のチェック
    now = timezone.now()
    if now < event.registration_start_date or now > event.registration_end_date:
        messages.error(request, '現在、このイベントの申込み受付期間ではありません')
        return redirect('events:lp_main', event_id=event_id)
    
    if request.method == 'POST':
        form = MemberRegistrationForm(request.POST)
        if form.is_valid():
            # セッションにフォームデータを保存
            member_data = form.cleaned_data
            request.session['member_data'] = {
                'company_name': member_data.get('company_name'),
                'company_name_kana': member_data.get('company_name_kana'),
                'department': member_data.get('department'),
                'position': member_data.get('position'),
                'full_name': member_data.get('full_name'),
                'email': member_data.get('email'),
                'phone_number': member_data.get('phone_number'),
                'occupation': member_data.get('occupation'),
                'questionnaire_response': member_data.get('questionnaire_response'),
                'free_comment': member_data.get('free_comment'),
                'privacy_policy_agreed': member_data.get('privacy_policy_agreed'),
            }
            return redirect('events:registration_confirm', event_id=event_id)
    else:
        form = MemberRegistrationForm()
    
    context = {
        'event': event,
        'form': form,
    }
    
    return render(request, 'events/registration_form.html', context)


def registration_confirm(request, event_id):
    """
    イベント参加申込確認画面
    """
    if not check_event_access(request, event_id):
        return redirect('events:entrance_login')
    
    event = get_object_or_404(Event, event_id=event_id, is_deleted=False)
    member_data = request.session.get('member_data')
    
    if not member_data:
        return redirect('events:registration_form', event_id=event_id)
    
    if request.method == 'POST':
        action = request.POST.get('action')
        
        if action == 'confirm':
            # 登録完了処理
            try:
                member = Member.objects.create(
                    event=event,
                    company_name=member_data.get('company_name'),
                    company_name_kana=member_data.get('company_name_kana'),
                    department=member_data.get('department'),
                    position=member_data.get('position'),
                    full_name=member_data.get('full_name'),
                    email=member_data.get('email'),
                    phone_number=member_data.get('phone_number'),
                    occupation=member_data.get('occupation'),
                    questionnaire_response=member_data.get('questionnaire_response'),
                    free_comment=member_data.get('free_comment'),
                    privacy_policy_agreed=member_data.get('privacy_policy_agreed'),
                )
                
                # メール送信
                send_registration_email(event, member)
                
                # セッションをクリア
                del request.session['member_data']
                request.session['registered_member_id'] = member.member_id
                
                return redirect('events:registration_complete', event_id=event_id)
            except Exception as e:
                messages.error(request, '登録処理中にエラーが発生しました')
                return redirect('events:registration_form', event_id=event_id)
        
        elif action == 'edit':
            # フォーム編集に戻る
            return redirect('events:registration_form', event_id=event_id)
    
    context = {
        'event': event,
        'member_data': member_data,
    }
    
    return render(request, 'events/registration_confirm.html', context)


def registration_complete(request, event_id):
    """
    登録完了画面（サンクスページ）
    """
    if not check_event_access(request, event_id):
        return redirect('events:entrance_login')
    
    event = get_object_or_404(Event, event_id=event_id, is_deleted=False)
    member_id = request.session.get('registered_member_id')
    
    if not member_id:
        return redirect('events:registration_form', event_id=event_id)
    
    member = get_object_or_404(Member, member_id=member_id)
    
    # セッションをクリア
    if 'registered_member_id' in request.session:
        del request.session['registered_member_id']
    
    context = {
        'event': event,
        'member': member,
    }
    
    return render(request, 'events/registration_complete.html', context)


def mypage_login(request, event_id):
    """
    マイページログイン画面
    """
    if not check_event_access(request, event_id):
        return redirect('events:entrance_login')
    
    event = get_object_or_404(Event, event_id=event_id, is_deleted=False)
    
    if request.method == 'POST':
        member_id = request.POST.get('member_id')
        email = request.POST.get('email')
        
        try:
            member = Member.objects.get(
                member_id=member_id,
                email=email,
                event=event,
                is_deleted=False,
                is_cancelled=False
            )
            request.session['mypage_member_id'] = member.member_id
            return redirect('events:mypage', event_id=event_id)
        except Member.DoesNotExist:
            messages.error(request, '会員番号またはメールアドレスが正しくありません')
    
    context = {
        'event': event,
    }
    
    return render(request, 'events/mypage_login.html', context)


def mypage(request, event_id):
    """
    会員マイページ
    """
    if not check_event_access(request, event_id):
        return redirect('events:entrance_login')
    
    event = get_object_or_404(Event, event_id=event_id, is_deleted=False)
    member_id = request.session.get('mypage_member_id')
    
    if not member_id:
        return redirect('events:mypage_login', event_id=event_id)
    
    member = get_object_or_404(Member, member_id=member_id, event=event, is_deleted=False)
    
    context = {
        'event': event,
        'member': member,
    }
    
    return render(request, 'events/mypage.html', context)


def cancellation_confirm(request, event_id):
    """
    参加キャンセル確認画面
    """
    if not check_event_access(request, event_id):
        return redirect('events:entrance_login')
    
    event = get_object_or_404(Event, event_id=event_id, is_deleted=False)
    member_id = request.session.get('mypage_member_id')
    
    if not member_id:
        return redirect('events:mypage_login', event_id=event_id)
    
    member = get_object_or_404(Member, member_id=member_id, event=event, 
                              is_deleted=False, is_cancelled=False)
    
    if request.method == 'POST':
        action = request.POST.get('action')
        
        if action == 'cancel':
            return redirect('events:cancellation_complete', event_id=event_id)
        elif action == 'back':
            return redirect('events:mypage', event_id=event_id)
    
    context = {
        'event': event,
        'member': member,
    }
    
    return render(request, 'events/cancellation_confirm.html', context)


def cancellation_complete(request, event_id):
    """
    参加キャンセル完了画面
    """
    if not check_event_access(request, event_id):
        return redirect('events:entrance_login')
    
    event = get_object_or_404(Event, event_id=event_id, is_deleted=False)
    member_id = request.session.get('mypage_member_id')
    
    if not member_id:
        return redirect('events:mypage_login', event_id=event_id)
    
    member = get_object_or_404(Member, member_id=member_id, event=event, is_deleted=False)
    
    # キャンセル処理
    member.is_cancelled = True
    member.cancelled_at = timezone.now()
    member.save()
    
    # セッションをクリア
    if 'mypage_member_id' in request.session:
        del request.session['mypage_member_id']
    
    context = {
        'event': event,
        'member': member,
    }
    
    return render(request, 'events/cancellation_complete.html', context)


def send_registration_email(event, member):
    """
    参加申込完了メール送信
    """
    subject = f'{event.event_name} 参加申し込み完了'
    
    html_message = render_to_string('events/email/registration_email.html', {
        'event': event,
        'member': member,
    })
    
    send_mail(
        subject,
        '',  # プレーンテキスト版
        settings.DEFAULT_FROM_EMAIL,
        [member.email],
        html_message=html_message,
        fail_silently=False,
    )


def get_countdown_data(request, event_id):
    """
    カウントダウンタイマーのデータをJSON返却
    """
    event = get_object_or_404(Event, event_id=event_id)
    
    now = timezone.now()
    event_datetime = event.event_date
    
    if now >= event_datetime:
        time_remaining = 0
    else:
        time_remaining = int((event_datetime - now).total_seconds())
    
    return JsonResponse({
        'event_date': event_datetime.isoformat(),
        'time_remaining': time_remaining,
    })
