"""
Web Views for Jingles App

This module provides web interface views for jingle detection management,
including template management, detection results, and ad break monitoring.
"""

from django.shortcuts import render, get_object_or_404, redirect
from django.contrib.auth.decorators import login_required
from django.utils.decorators import method_decorator
from django.views.generic import ListView, DetailView, CreateView, UpdateView
from django.db.models import Q
from django.core.paginator import Paginator
from django.urls import reverse_lazy
from django.contrib import messages

from apps.jingles.models import JingleTemplate, JingleDetection, AdBreak
from apps.jingles.forms import JingleTemplateForm


@method_decorator(login_required, name='dispatch')
class JingleTemplateListView(ListView):
    """List view for jingle templates"""
    model = JingleTemplate
    template_name = 'jingles/templates/list.html'
    context_object_name = 'templates'
    paginate_by = 20
    
    def get_queryset(self):
        queryset = JingleTemplate.objects.all().order_by('-created_at')
        search = self.request.GET.get('search')
        if search:
            queryset = queryset.filter(
                Q(name__icontains=search) | 
                Q(description__icontains=search) |
                Q(category__icontains=search)
            )
        return queryset
    
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['search'] = self.request.GET.get('search', '')
        return context


@method_decorator(login_required, name='dispatch')
class JingleTemplateCreateView(CreateView):
    """Create view for jingle templates"""
    model = JingleTemplate
    form_class = JingleTemplateForm
    template_name = 'jingles/templates/form.html'
    success_url = reverse_lazy('jingles:template_list')
    
    def form_valid(self, form):
        """Set the created_by user before saving."""
        form.instance.created_by = self.request.user
        messages.success(self.request, f'Jingle template "{form.instance.name}" created successfully!')
        return super().form_valid(form)
    
    def form_invalid(self, form):
        """Handle form validation errors."""
        messages.error(self.request, 'Please correct the errors below.')
        return super().form_invalid(form)


@method_decorator(login_required, name='dispatch')
class JingleTemplateUpdateView(UpdateView):
    """Update view for jingle templates"""
    model = JingleTemplate
    form_class = JingleTemplateForm
    template_name = 'jingles/templates/form.html'
    success_url = reverse_lazy('jingles:template_list')
    
    def form_valid(self, form):
        """Handle successful form submission."""
        messages.success(self.request, f'Jingle template "{form.instance.name}" updated successfully!')
        return super().form_valid(form)
    
    def form_invalid(self, form):
        """Handle form validation errors."""
        messages.error(self.request, 'Please correct the errors below.')
        return super().form_invalid(form)


@method_decorator(login_required, name='dispatch')
class JingleDetectionListView(ListView):
    """List view for jingle detections"""
    model = JingleDetection
    template_name = 'jingles/detections/list.html'
    context_object_name = 'detections'
    paginate_by = 20
    
    def get_queryset(self):
        queryset = JingleDetection.objects.select_related('template', 'session').order_by('-detection_time')
        template_id = self.request.GET.get('template')
        if template_id:
            queryset = queryset.filter(template_id=template_id)
        return queryset
    
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['templates'] = JingleTemplate.objects.filter(is_active=True)
        context['selected_template'] = self.request.GET.get('template', '')
        return context


@method_decorator(login_required, name='dispatch')
class AdBreakListView(ListView):
    """List view for ad breaks"""
    model = AdBreak
    template_name = 'jingles/adbreaks/list.html'
    context_object_name = 'ad_breaks'
    paginate_by = 20
    
    def get_queryset(self):
        queryset = AdBreak.objects.select_related('session').order_by('-start_time')
        session_id = self.request.GET.get('session')
        if session_id:
            queryset = queryset.filter(session_id=session_id)
        return queryset
    
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        return context


@method_decorator(login_required, name='dispatch')
class JingleTemplateDetailView(DetailView):
    """Detail view for jingle template"""
    model = JingleTemplate
    template_name = 'jingles/templates/detail.html'
    context_object_name = 'template'
    
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        template = self.get_object()
        context['recent_detections'] = JingleDetection.objects.filter(
            template=template
        ).select_related('session').order_by('-detection_time')[:10]
        return context


@method_decorator(login_required, name='dispatch')
class JingleDetectionDetailView(DetailView):
    """Detail view for jingle detection"""
    model = JingleDetection
    template_name = 'jingles/detections/detail.html'
    context_object_name = 'detection'


@method_decorator(login_required, name='dispatch')
class AdBreakDetailView(DetailView):
    """Detail view for ad break"""
    model = AdBreak
    template_name = 'jingles/adbreaks/detail.html'
    context_object_name = 'ad_break'
    
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        ad_break = self.get_object()
        context['detections'] = JingleDetection.objects.filter(
            session=ad_break.session,
            detection_time__range=[ad_break.start_time, ad_break.end_time]
        ).select_related('template').order_by('detection_time')
        return context
