# -*- coding: utf-8 -*-
"""
Channels App Views with Class-Based Views and Permissions

This module contains all views for the channels app including channel management,
zones, codecs, EPG, jingles, and schedules with comprehensive permission system.
"""

from django.shortcuts import render, get_object_or_404, redirect
from django.contrib.auth.decorators import login_required
from django.contrib.auth.mixins import LoginRequiredMixin
from django.views.generic import (
    ListView, DetailView, CreateView, UpdateView, DeleteView,
    TemplateView, FormView, View
)
from django.contrib import messages
from django.http import JsonResponse, HttpResponseRedirect
from django.core.paginator import Paginator
from django.db.models import Q, Count, Avg, Sum
from django.utils import timezone
from django.views.decorators.http import require_http_methods
from django.db import transaction
from django.urls import reverse_lazy, reverse
from datetime import timedelta, datetime
import json
import logging

from .models import (
    Channel, ChannelZone, ChannelCodec, ChannelZoneRelation,
    EPGProgram, Jingle, JingleDetection, ChannelSchedule
)
from .permissions import (
    ChannelPermissionRequiredMixin, ChannelManagementPermissions,
    has_channel_management_permission, has_channel_zone_permission,
    has_epg_management_permission
)
from apps.activities.models import Activity
from apps.activities.helpers import log_user_activity

logger = logging.getLogger(__name__)


# ============================================================================
# Dashboard Views
# ============================================================================

class ChannelDashboardView(ChannelPermissionRequiredMixin, TemplateView):
    """Channels management dashboard."""
    template_name = 'channels/dashboard.html'
    permission_required = [ChannelManagementPermissions.CAN_VIEW_CHANNELS]
    
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        
        # Basic stats
        context['stats'] = {
            'total_channels': Channel.objects.count(),
            'active_channels': Channel.objects.filter(status='active').count(),
            'online_channels': Channel.objects.filter(is_online=True).count(),
            'total_zones': ChannelZone.objects.count(),
            'active_zones': ChannelZone.objects.filter(is_active=True).count(),
            'total_programs': EPGProgram.objects.count(),
            'today_programs': EPGProgram.objects.filter(
                start_time__date=timezone.now().date()
            ).count(),
            'total_jingles': Jingle.objects.count(),
            'active_jingles': Jingle.objects.filter(is_active=True).count(),
        }
        
        # Recent data
        context['recent_channels'] = Channel.objects.select_related(
            'codec'
        ).order_by('-created_at')[:5]
        
        context['recent_activities'] = Activity.objects.filter(
            content_type__model__in=['channel', 'epgprogram', 'jingle']
        ).select_related('user').order_by('-created_at')[:10]
        
        # Permission context
        context['permissions'] = {
            'can_view_channels': self.request.user.has_perm(ChannelManagementPermissions.CAN_VIEW_CHANNELS),
            'can_add_channels': self.request.user.has_perm(ChannelManagementPermissions.CAN_ADD_CHANNELS),
            'can_change_channels': self.request.user.has_perm(ChannelManagementPermissions.CAN_CHANGE_CHANNELS),
            'can_delete_channels': self.request.user.has_perm(ChannelManagementPermissions.CAN_DELETE_CHANNELS),
            'can_view_zones': self.request.user.has_perm(ChannelManagementPermissions.CAN_VIEW_ZONES),
            'can_add_zones': self.request.user.has_perm(ChannelManagementPermissions.CAN_ADD_ZONES),
            'can_view_epg': self.request.user.has_perm(ChannelManagementPermissions.CAN_VIEW_EPG),
            'can_add_epg': self.request.user.has_perm(ChannelManagementPermissions.CAN_ADD_EPG),
            'can_view_jingles': self.request.user.has_perm(ChannelManagementPermissions.CAN_VIEW_JINGLES),
            'can_add_jingles': self.request.user.has_perm(ChannelManagementPermissions.CAN_ADD_JINGLES),
        }
        
        return context


# ============================================================================
# Channel Management Views
# ============================================================================

class ChannelListView(ChannelPermissionRequiredMixin, ListView):
    """List all channels with search and filtering."""
    model = Channel
    template_name = 'channels/channel_list.html'
    context_object_name = 'channels'
    paginate_by = 20
    permission_required = [ChannelManagementPermissions.CAN_VIEW_CHANNELS]
    
    def get_queryset(self):
        queryset = Channel.objects.select_related('codec').prefetch_related('zones')
        
        # Search functionality
        search = self.request.GET.get('search')
        if search:
            queryset = queryset.filter(
                Q(name__icontains=search) |
                Q(display_name__icontains=search) |
                Q(channel_number__icontains=search) |
                Q(description__icontains=search)
            )
        
        # Filter by channel type
        channel_type = self.request.GET.get('channel_type')
        if channel_type:
            queryset = queryset.filter(channel_type=channel_type)
        
        # Filter by status
        status = self.request.GET.get('status')
        if status:
            queryset = queryset.filter(status=status)
        
        # Filter by zone
        zone = self.request.GET.get('zone')
        if zone:
            queryset = queryset.filter(zones__id=zone)
        
        # Annotate with program and jingle counts
        queryset = queryset.annotate(
            program_count=Count('programs'),
            jingle_count=Count('jingles')
        )
        
        return queryset.order_by('channel_number', 'name')
    
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['zones'] = ChannelZone.objects.filter(is_active=True)
        context['channel_types'] = Channel.CHANNEL_TYPES
        context['status_choices'] = Channel.STATUS_CHOICES
        context['search'] = self.request.GET.get('search', '')
        context['selected_channel_type'] = self.request.GET.get('channel_type', '')
        context['selected_status'] = self.request.GET.get('status', '')
        context['selected_zone'] = self.request.GET.get('zone', '')
        
        # Permission context
        context['can_add_channels'] = self.request.user.has_perm(ChannelManagementPermissions.CAN_ADD_CHANNELS)
        context['can_change_channels'] = self.request.user.has_perm(ChannelManagementPermissions.CAN_CHANGE_CHANNELS)
        context['can_delete_channels'] = self.request.user.has_perm(ChannelManagementPermissions.CAN_DELETE_CHANNELS)
        
        return context


class ChannelDetailView(ChannelPermissionRequiredMixin, DetailView):
    """Display channel details."""
    model = Channel
    template_name = 'channels/channel_detail.html'
    context_object_name = 'channel'
    permission_required = [ChannelManagementPermissions.CAN_VIEW_CHANNELS]
    
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        channel = self.get_object()
        
        # Get current and upcoming programs
        now = timezone.now()
        context['current_program'] = channel.programs.filter(
            start_time__lte=now,
            end_time__gte=now
        ).first()
        
        context['upcoming_programs'] = channel.programs.filter(
            start_time__gt=now
        ).order_by('start_time')[:5]
        
        # Get recent programs
        context['recent_programs'] = channel.programs.filter(
            end_time__lt=now
        ).order_by('-end_time')[:5]
        
        # Get jingles
        context['jingles'] = channel.jingles.filter(is_active=True).order_by('-priority', 'name')
        
        # Get schedules
        context['schedules'] = channel.schedules.filter(
            start_time__gte=now - timedelta(hours=2),
            start_time__lte=now + timedelta(hours=24)
        ).order_by('start_time')
        
        # Get zone relations
        context['zone_relations'] = channel.zone_relations.select_related('zone', 'codec')
        
        # Recent activity
        context['recent_activity'] = Activity.objects.filter(
            content_type__model='channel',
            object_id=str(channel.id)
        ).select_related('user').order_by('-created_at')[:10]
        
        # Permission context
        context['can_change_channels'] = self.request.user.has_perm(ChannelManagementPermissions.CAN_CHANGE_CHANNELS)
        context['can_delete_channels'] = self.request.user.has_perm(ChannelManagementPermissions.CAN_DELETE_CHANNELS)
        context['can_view_epg'] = self.request.user.has_perm(ChannelManagementPermissions.CAN_VIEW_EPG)
        context['can_view_jingles'] = self.request.user.has_perm(ChannelManagementPermissions.CAN_VIEW_JINGLES)
        
        return context


class ChannelCreateView(ChannelPermissionRequiredMixin, CreateView):
    """Create new channel."""
    model = Channel
    template_name = 'channels/channel_form.html'
    fields = [
        'name', 'display_name', 'channel_number', 'channel_type', 'status',
        'stream_url', 'backup_stream_url', 'codec', 'logo', 'description',
        'website', 'language', 'category', 'target_audience', 'supports_dai',
        'max_ad_duration', 'min_ad_gap'
    ]
    permission_required = [ChannelManagementPermissions.CAN_ADD_CHANNELS]
    
    def get_success_url(self):
        return reverse('channels:channel_detail', kwargs={'pk': self.object.pk})
    
    def form_valid(self, form):
        # Log activity
        log_user_activity(
            user=self.request.user,
            action='create',
            object_type='Channel',
            object_id=str(form.instance.id),
            object_repr=str(form.instance)
        )
        
        messages.success(self.request, f'Channel {form.instance.name} created successfully.')
        return super().form_valid(form)
    
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['zones'] = ChannelZone.objects.filter(is_active=True)
        context['codecs'] = ChannelCodec.objects.all()
        context['channel_types'] = Channel.CHANNEL_TYPES
        context['status_choices'] = Channel.STATUS_CHOICES
        context['is_create'] = True
        return context


class ChannelUpdateView(ChannelPermissionRequiredMixin, UpdateView):
    """Update channel information."""
    model = Channel
    template_name = 'channels/channel_form.html'
    fields = [
        'name', 'display_name', 'channel_number', 'channel_type', 'status',
        'stream_url', 'backup_stream_url', 'codec', 'logo', 'description',
        'website', 'language', 'category', 'target_audience', 'supports_dai',
        'max_ad_duration', 'min_ad_gap'
    ]
    permission_required = [ChannelManagementPermissions.CAN_CHANGE_CHANNELS]
    
    def get_success_url(self):
        return reverse('channels:channel_detail', kwargs={'pk': self.object.pk})
    
    def form_valid(self, form):
        # Log activity
        log_user_activity(
            user=self.request.user,
            action='update',
            object_type='Channel',
            object_id=str(self.object.id),
            object_repr=str(self.object)
        )
        
        messages.success(self.request, f'Channel {self.object.name} updated successfully.')
        return super().form_valid(form)
    
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['zones'] = ChannelZone.objects.filter(is_active=True)
        context['codecs'] = ChannelCodec.objects.all()
        context['channel_types'] = Channel.CHANNEL_TYPES
        context['status_choices'] = Channel.STATUS_CHOICES
        context['is_create'] = False
        return context


class ChannelDeleteView(ChannelPermissionRequiredMixin, DeleteView):
    """Delete channel."""
    model = Channel
    template_name = 'channels/channel_confirm_delete.html'
    success_url = reverse_lazy('channels:channel_list')
    permission_required = [ChannelManagementPermissions.CAN_DELETE_CHANNELS]
    
    def delete(self, request, *args, **kwargs):
        channel = self.get_object()
        
        # Log activity
        log_user_activity(
            user=request.user,
            action='delete',
            object_type='Channel',
            object_id=str(channel.id),
            object_repr=str(channel)
        )
        
        messages.success(request, f'Channel {channel.name} deleted successfully.')
        return super().delete(request, *args, **kwargs)


# ============================================================================
# Channel Zone Management Views
# ============================================================================

class ChannelZoneListView(ChannelPermissionRequiredMixin, ListView):
    """List all channel zones."""
    model = ChannelZone
    template_name = 'channels/zone_list.html'
    context_object_name = 'zones'
    paginate_by = 20
    permission_required = [ChannelManagementPermissions.CAN_VIEW_ZONES]
    
    def get_queryset(self):
        queryset = ChannelZone.objects.annotate(
            channel_count=Count('channels')
        )
        
        search = self.request.GET.get('search')
        if search:
            queryset = queryset.filter(
                Q(name__icontains=search) |
                Q(code__icontains=search) |
                Q(description__icontains=search)
            )
        
        return queryset.order_by('name')
    
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['search'] = self.request.GET.get('search', '')
        context['can_add_zones'] = self.request.user.has_perm(ChannelManagementPermissions.CAN_ADD_ZONES)
        context['can_change_zones'] = self.request.user.has_perm(ChannelManagementPermissions.CAN_CHANGE_ZONES)
        context['can_delete_zones'] = self.request.user.has_perm(ChannelManagementPermissions.CAN_DELETE_ZONES)
        return context


class ChannelZoneDetailView(ChannelPermissionRequiredMixin, DetailView):
    """Display channel zone details."""
    model = ChannelZone
    template_name = 'channels/zone_detail.html'
    context_object_name = 'zone'
    permission_required = [ChannelManagementPermissions.CAN_VIEW_ZONES]
    
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        zone = self.get_object()
        
        # Get channels in this zone
        context['channels'] = Channel.objects.filter(
            zones=zone
        ).order_by('channel_number', 'name')
        
        context['channel_count'] = context['channels'].count()
        context['active_channels'] = context['channels'].filter(status='active').count()
        
        # Permission context
        context['can_change_zones'] = self.request.user.has_perm(ChannelManagementPermissions.CAN_CHANGE_ZONES)
        context['can_delete_zones'] = self.request.user.has_perm(ChannelManagementPermissions.CAN_DELETE_ZONES)
        
        return context


class ChannelZoneCreateView(ChannelPermissionRequiredMixin, CreateView):
    """Create new channel zone."""
    model = ChannelZone
    template_name = 'channels/zone_form.html'
    fields = ['name', 'code', 'description', 'timezone', 'is_active']
    permission_required = [ChannelManagementPermissions.CAN_ADD_ZONES]
    
    def get_success_url(self):
        return reverse('channels:zone_detail', kwargs={'pk': self.object.pk})
    
    def form_valid(self, form):
        messages.success(self.request, f'Zone {form.instance.name} created successfully.')
        return super().form_valid(form)


class ChannelZoneUpdateView(ChannelPermissionRequiredMixin, UpdateView):
    """Update channel zone."""
    model = ChannelZone
    template_name = 'channels/zone_form.html'
    fields = ['name', 'code', 'description', 'timezone', 'is_active']
    permission_required = [ChannelManagementPermissions.CAN_CHANGE_ZONES]
    
    def get_success_url(self):
        return reverse('channels:zone_detail', kwargs={'pk': self.object.pk})
    
    def form_valid(self, form):
        messages.success(self.request, f'Zone {self.object.name} updated successfully.')
        return super().form_valid(form)


class ChannelZoneDeleteView(ChannelPermissionRequiredMixin, DeleteView):
    """Delete channel zone."""
    model = ChannelZone
    template_name = 'channels/zone_confirm_delete.html'
    success_url = reverse_lazy('channels:zone_list')
    permission_required = [ChannelManagementPermissions.CAN_DELETE_ZONES]
    
    def delete(self, request, *args, **kwargs):
        zone = self.get_object()
        messages.success(request, f'Zone {zone.name} deleted successfully.')
        return super().delete(request, *args, **kwargs)


# ============================================================================
# Channel Codec Management Views
# ============================================================================

class ChannelCodecListView(ChannelPermissionRequiredMixin, ListView):
    """List all channel codecs."""
    model = ChannelCodec
    template_name = 'channels/codec_list.html'
    context_object_name = 'codecs'
    paginate_by = 20
    permission_required = [ChannelManagementPermissions.CAN_VIEW_CODECS]
    
    def get_queryset(self):
        queryset = ChannelCodec.objects.annotate(
            channel_count=Count('channel_set')
        )
        
        search = self.request.GET.get('search')
        if search:
            queryset = queryset.filter(
                Q(name__icontains=search) |
                Q(video_codec__icontains=search) |
                Q(audio_codec__icontains=search)
            )
        
        return queryset.order_by('name')
    
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['search'] = self.request.GET.get('search', '')
        context['can_add_codecs'] = self.request.user.has_perm(ChannelManagementPermissions.CAN_ADD_CODECS)
        context['can_change_codecs'] = self.request.user.has_perm(ChannelManagementPermissions.CAN_CHANGE_CODECS)
        context['can_delete_codecs'] = self.request.user.has_perm(ChannelManagementPermissions.CAN_DELETE_CODECS)
        return context


class ChannelCodecDetailView(ChannelPermissionRequiredMixin, DetailView):
    """Display channel codec details."""
    model = ChannelCodec
    template_name = 'channels/codec_detail.html'
    context_object_name = 'codec'
    permission_required = [ChannelManagementPermissions.CAN_VIEW_CODECS]
    
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        codec = self.get_object()
        
        # Get channels using this codec
        context['channels'] = Channel.objects.filter(
            codec=codec
        ).order_by('name')
        
        context['channel_count'] = context['channels'].count()
        
        # Permission context
        context['can_change_codecs'] = self.request.user.has_perm(ChannelManagementPermissions.CAN_CHANGE_CODECS)
        context['can_delete_codecs'] = self.request.user.has_perm(ChannelManagementPermissions.CAN_DELETE_CODECS)
        
        return context


class ChannelCodecCreateView(ChannelPermissionRequiredMixin, CreateView):
    """Create new channel codec."""
    model = ChannelCodec
    template_name = 'channels/codec_form.html'
    fields = ['name', 'video_codec', 'audio_codec', 'resolution', 'bitrate', 'frame_rate', 'ffmpeg_options']
    permission_required = [ChannelManagementPermissions.CAN_ADD_CODECS]
    
    def get_success_url(self):
        return reverse('channels:codec_detail', kwargs={'pk': self.object.pk})
    
    def form_valid(self, form):
        messages.success(self.request, f'Codec {form.instance.name} created successfully.')
        return super().form_valid(form)


class ChannelCodecUpdateView(ChannelPermissionRequiredMixin, UpdateView):
    """Update channel codec."""
    model = ChannelCodec
    template_name = 'channels/codec_form.html'
    fields = ['name', 'video_codec', 'audio_codec', 'resolution', 'bitrate', 'frame_rate', 'ffmpeg_options']
    permission_required = [ChannelManagementPermissions.CAN_CHANGE_CODECS]
    
    def get_success_url(self):
        return reverse('channels:codec_detail', kwargs={'pk': self.object.pk})
    
    def form_valid(self, form):
        messages.success(self.request, f'Codec {self.object.name} updated successfully.')
        return super().form_valid(form)


class ChannelCodecDeleteView(ChannelPermissionRequiredMixin, DeleteView):
    """Delete channel codec."""
    model = ChannelCodec
    template_name = 'channels/codec_confirm_delete.html'
    success_url = reverse_lazy('channels:codec_list')
    permission_required = [ChannelManagementPermissions.CAN_DELETE_CODECS]
    
    def delete(self, request, *args, **kwargs):
        codec = self.get_object()
        messages.success(request, f'Codec {codec.name} deleted successfully.')
        return super().delete(request, *args, **kwargs)


# ============================================================================
# EPG Program Management Views
# ============================================================================

class EPGProgramListView(ChannelPermissionRequiredMixin, ListView):
    """List all EPG programs."""
    model = EPGProgram
    template_name = 'channels/epg_list.html'
    context_object_name = 'programs'
    paginate_by = 50
    permission_required = [ChannelManagementPermissions.CAN_VIEW_EPG]
    
    def get_queryset(self):
        queryset = EPGProgram.objects.select_related('channel')
        
        # Filter by channel
        channel_id = self.request.GET.get('channel')
        if channel_id:
            queryset = queryset.filter(channel_id=channel_id)
        
        # Filter by date
        date = self.request.GET.get('date')
        if date:
            try:
                date_obj = datetime.strptime(date, '%Y-%m-%d').date()
                queryset = queryset.filter(start_time__date=date_obj)
            except ValueError:
                pass
        
        # Filter by program type
        program_type = self.request.GET.get('program_type')
        if program_type:
            queryset = queryset.filter(program_type=program_type)
        
        # Search
        search = self.request.GET.get('search')
        if search:
            queryset = queryset.filter(
                Q(title__icontains=search) |
                Q(description__icontains=search)
            )
        
        return queryset.order_by('-start_time')
    
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['channels'] = Channel.objects.filter(status='active').order_by('name')
        context['program_types'] = EPGProgram.PROGRAM_TYPES
        context['filters'] = {
            'channel': self.request.GET.get('channel', ''),
            'date': self.request.GET.get('date', ''),
            'program_type': self.request.GET.get('program_type', ''),
            'search': self.request.GET.get('search', ''),
        }
        context['can_add_epg'] = self.request.user.has_perm(ChannelManagementPermissions.CAN_ADD_EPG)
        context['can_change_epg'] = self.request.user.has_perm(ChannelManagementPermissions.CAN_CHANGE_EPG)
        context['can_delete_epg'] = self.request.user.has_perm(ChannelManagementPermissions.CAN_DELETE_EPG)
        return context


class EPGProgramDetailView(ChannelPermissionRequiredMixin, DetailView):
    """Display EPG program details."""
    model = EPGProgram
    template_name = 'channels/epg_detail.html'
    context_object_name = 'program'
    permission_required = [ChannelManagementPermissions.CAN_VIEW_EPG]
    
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        program = self.get_object()
        
        # Get related programs (same channel, same day)
        context['related_programs'] = EPGProgram.objects.filter(
            channel=program.channel,
            start_time__date=program.start_time.date()
        ).exclude(id=program.id).order_by('start_time')[:5]
        
        # Permission context
        context['can_change_epg'] = self.request.user.has_perm(ChannelManagementPermissions.CAN_CHANGE_EPG)
        context['can_delete_epg'] = self.request.user.has_perm(ChannelManagementPermissions.CAN_DELETE_EPG)
        
        return context


class EPGProgramCreateView(ChannelPermissionRequiredMixin, CreateView):
    """Create new EPG program."""
    model = EPGProgram
    template_name = 'channels/epg_form.html'
    fields = [
        'channel', 'title', 'description', 'program_type', 'start_time', 
        'end_time', 'duration', 'season_number', 'episode_number',
        'original_air_date', 'content_rating', 'language', 'subtitles_available',
        'has_ad_breaks', 'ad_break_positions'
    ]
    permission_required = [ChannelManagementPermissions.CAN_ADD_EPG]
    
    def get_success_url(self):
        return reverse('channels:epg_detail', kwargs={'pk': self.object.pk})
    
    def form_valid(self, form):
        # Log activity
        log_user_activity(
            user=self.request.user,
            action='create',
            object_type='EPGProgram',
            object_id=str(form.instance.id),
            object_repr=str(form.instance)
        )
        
        messages.success(self.request, f'Program {form.instance.title} created successfully.')
        return super().form_valid(form)
    
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['channels'] = Channel.objects.filter(status='active').order_by('name')
        context['program_types'] = EPGProgram.PROGRAM_TYPES
        context['is_create'] = True
        return context


class EPGProgramUpdateView(ChannelPermissionRequiredMixin, UpdateView):
    """Update EPG program."""
    model = EPGProgram
    template_name = 'channels/epg_form.html'
    fields = [
        'channel', 'title', 'description', 'program_type', 'start_time', 
        'end_time', 'duration', 'season_number', 'episode_number',
        'original_air_date', 'content_rating', 'language', 'subtitles_available',
        'has_ad_breaks', 'ad_break_positions'
    ]
    permission_required = [ChannelManagementPermissions.CAN_CHANGE_EPG]
    
    def get_success_url(self):
        return reverse('channels:epg_detail', kwargs={'pk': self.object.pk})
    
    def form_valid(self, form):
        # Log activity
        log_user_activity(
            user=self.request.user,
            action='update',
            object_type='EPGProgram',
            object_id=str(self.object.id),
            object_repr=str(self.object)
        )
        
        messages.success(self.request, f'Program {self.object.title} updated successfully.')
        return super().form_valid(form)
    
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['channels'] = Channel.objects.filter(status='active').order_by('name')
        context['program_types'] = EPGProgram.PROGRAM_TYPES
        context['is_create'] = False
        return context


class EPGProgramDeleteView(ChannelPermissionRequiredMixin, DeleteView):
    """Delete EPG program."""
    model = EPGProgram
    template_name = 'channels/epg_confirm_delete.html'
    success_url = reverse_lazy('channels:epg_list')
    permission_required = [ChannelManagementPermissions.CAN_DELETE_EPG]
    
    def delete(self, request, *args, **kwargs):
        program = self.get_object()
        
        # Log activity
        log_user_activity(
            user=request.user,
            action='delete',
            object_type='EPGProgram',
            object_id=str(program.id),
            object_repr=str(program)
        )
        
        messages.success(request, f'Program {program.title} deleted successfully.')
        return super().delete(request, *args, **kwargs)


# ============================================================================
# Jingle Management Views
# ============================================================================

class JingleListView(ChannelPermissionRequiredMixin, ListView):
    """List all jingles."""
    model = Jingle
    template_name = 'channels/jingle_list.html'
    context_object_name = 'jingles'
    paginate_by = 20
    permission_required = [ChannelManagementPermissions.CAN_VIEW_JINGLES]
    
    def get_queryset(self):
        queryset = Jingle.objects.select_related('channel')
        
        # Filter by channel
        channel_id = self.request.GET.get('channel')
        if channel_id:
            queryset = queryset.filter(channel_id=channel_id)
        
        # Filter by type
        jingle_type = self.request.GET.get('jingle_type')
        if jingle_type:
            queryset = queryset.filter(jingle_type=jingle_type)
        
        # Filter by active status
        is_active = self.request.GET.get('is_active')
        if is_active:
            queryset = queryset.filter(is_active=is_active == 'true')
        
        # Search
        search = self.request.GET.get('search')
        if search:
            queryset = queryset.filter(
                Q(name__icontains=search)
            )
        
        return queryset.order_by('-priority', '-created_at')
    
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['channels'] = Channel.objects.filter(status='active').order_by('name')
        context['jingle_types'] = Jingle.JINGLE_TYPES
        context['filters'] = {
            'channel': self.request.GET.get('channel', ''),
            'jingle_type': self.request.GET.get('jingle_type', ''),
            'is_active': self.request.GET.get('is_active', ''),
            'search': self.request.GET.get('search', ''),
        }
        context['can_add_jingles'] = self.request.user.has_perm(ChannelManagementPermissions.CAN_ADD_JINGLES)
        context['can_change_jingles'] = self.request.user.has_perm(ChannelManagementPermissions.CAN_CHANGE_JINGLES)
        context['can_delete_jingles'] = self.request.user.has_perm(ChannelManagementPermissions.CAN_DELETE_JINGLES)
        return context


class JingleDetailView(ChannelPermissionRequiredMixin, DetailView):
    """Display jingle details."""
    model = Jingle
    template_name = 'channels/jingle_detail.html'
    context_object_name = 'jingle'
    permission_required = [ChannelManagementPermissions.CAN_VIEW_JINGLES]
    
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        jingle = self.get_object()
        
        # Get related jingles (same channel, same type)
        context['related_jingles'] = Jingle.objects.filter(
            channel=jingle.channel,
            jingle_type=jingle.jingle_type
        ).exclude(id=jingle.id).order_by('-priority')[:5]
        
        # Get recent detections
        context['recent_detections'] = jingle.detections.order_by('-detected_at')[:10]
        
        # Permission context
        context['can_change_jingles'] = self.request.user.has_perm(ChannelManagementPermissions.CAN_CHANGE_JINGLES)
        context['can_delete_jingles'] = self.request.user.has_perm(ChannelManagementPermissions.CAN_DELETE_JINGLES)
        
        return context


class JingleCreateView(ChannelPermissionRequiredMixin, CreateView):
    """Create new jingle."""
    model = Jingle
    template_name = 'channels/jingle_form.html'
    fields = [
        'channel', 'name', 'jingle_type', 'placement_type', 'file', 'duration',
        'priority', 'start_date', 'end_date', 'time_slots', 'is_active'
    ]
    permission_required = [ChannelManagementPermissions.CAN_ADD_JINGLES]
    
    def get_success_url(self):
        return reverse('channels:jingle_detail', kwargs={'pk': self.object.pk})
    
    def form_valid(self, form):
        # Log activity
        log_user_activity(
            user=self.request.user,
            action='create',
            object_type='Jingle',
            object_id=str(form.instance.id),
            object_repr=str(form.instance)
        )
        
        messages.success(self.request, f'Jingle {form.instance.name} created successfully.')
        return super().form_valid(form)
    
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['channels'] = Channel.objects.filter(status='active').order_by('name')
        context['jingle_types'] = Jingle.JINGLE_TYPES
        context['placement_types'] = Jingle.PLACEMENT_TYPES
        context['is_create'] = True
        return context


class JingleUpdateView(ChannelPermissionRequiredMixin, UpdateView):
    """Update jingle."""
    model = Jingle
    template_name = 'channels/jingle_form.html'
    fields = [
        'channel', 'name', 'jingle_type', 'placement_type', 'file', 'duration',
        'priority', 'start_date', 'end_date', 'time_slots', 'is_active'
    ]
    permission_required = [ChannelManagementPermissions.CAN_CHANGE_JINGLES]
    
    def get_success_url(self):
        return reverse('channels:jingle_detail', kwargs={'pk': self.object.pk})
    
    def form_valid(self, form):
        # Log activity
        log_user_activity(
            user=self.request.user,
            action='update',
            object_type='Jingle',
            object_id=str(self.object.id),
            object_repr=str(self.object)
        )
        
        messages.success(self.request, f'Jingle {self.object.name} updated successfully.')
        return super().form_valid(form)
    
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['channels'] = Channel.objects.filter(status='active').order_by('name')
        context['jingle_types'] = Jingle.JINGLE_TYPES
        context['placement_types'] = Jingle.PLACEMENT_TYPES
        context['is_create'] = False
        return context


class JingleDeleteView(ChannelPermissionRequiredMixin, DeleteView):
    """Delete jingle."""
    model = Jingle
    template_name = 'channels/jingle_confirm_delete.html'
    success_url = reverse_lazy('channels:jingle_list')
    permission_required = [ChannelManagementPermissions.CAN_DELETE_JINGLES]
    
    def delete(self, request, *args, **kwargs):
        jingle = self.get_object()
        
        # Log activity
        log_user_activity(
            user=request.user,
            action='delete',
            object_type='Jingle',
            object_id=str(jingle.id),
            object_repr=str(jingle)
        )
        
        messages.success(request, f'Jingle {jingle.name} deleted successfully.')
        return super().delete(request, *args, **kwargs)


# ============================================================================
# API Views for AJAX Operations
# ============================================================================

class ChannelHealthCheckAPIView(ChannelPermissionRequiredMixin, View):
    """API view for channel health check."""
    permission_required = [ChannelManagementPermissions.CAN_VIEW_CHANNELS]
    
    def post(self, request, pk):
        try:
            channel = get_object_or_404(Channel, pk=pk)
            
            # Simulate health check
            import requests
            import time
            
            start_time = time.time()
            
            if channel.stream_url:
                try:
                    response = requests.head(channel.stream_url, timeout=10)
                    is_online = response.status_code == 200
                except:
                    is_online = False
            else:
                is_online = True
            
            response_time = int((time.time() - start_time) * 1000)
            
            channel.update_health_status(is_online)
            
            # Log activity
            log_user_activity(
                user=request.user,
                action='health_check',
                object_type='Channel',
                object_id=str(channel.id),
                object_repr=f'Health check: {channel.name}'
            )
            
            return JsonResponse({
                'success': True,
                'is_online': is_online,
                'response_time': response_time,
                'last_check': channel.last_health_check.isoformat() if channel.last_health_check else None
            })
            
        except Exception as e:
            return JsonResponse({
                'success': False,
                'error': str(e)
            })


class ChannelStatsAPIView(ChannelPermissionRequiredMixin, View):
    """API view for channel statistics."""
    permission_required = [ChannelManagementPermissions.CAN_VIEW_CHANNELS]
    
    def get(self, request, pk):
        try:
            channel = get_object_or_404(Channel, pk=pk)
            
            # Get date range
            days = int(request.GET.get('days', 7))
            end_date = timezone.now().date()
            start_date = end_date - timedelta(days=days)
            
            # Get program statistics
            programs = channel.programs.filter(
                start_time__date__gte=start_date,
                start_time__date__lte=end_date
            )
            
            # Daily program counts
            daily_stats = []
            current_date = start_date
            
            while current_date <= end_date:
                day_programs = programs.filter(start_time__date=current_date)
                
                daily_stats.append({
                    'date': current_date.isoformat(),
                    'program_count': day_programs.count(),
                    'total_duration': sum(p.duration for p in day_programs),
                })
                
                current_date += timedelta(days=1)
            
            # Program type breakdown
            program_types = {}
            for program_type, label in EPGProgram.PROGRAM_TYPES:
                count = programs.filter(program_type=program_type).count()
                if count > 0:
                    program_types[program_type] = {
                        'label': label,
                        'count': count
                    }
            
            return JsonResponse({
                'daily_stats': daily_stats,
                'program_types': program_types,
                'total_programs': programs.count(),
                'total_jingles': channel.jingles.filter(is_active=True).count(),
                'is_online': channel.is_online,
                'last_health_check': channel.last_health_check.isoformat() if channel.last_health_check else None,
            })
            
        except Exception as e:
            return JsonResponse({
                'success': False,
                'error': str(e)
            })


# ============================================================================
# Backward Compatibility Functions
# ============================================================================

@login_required
def dashboard(request):
    """Function-based view for backward compatibility."""
    view = ChannelDashboardView.as_view()
    return view(request)


@login_required
def channel_list(request):
    """Function-based view for backward compatibility."""
    view = ChannelListView.as_view()
    return view(request)


@login_required
def channel_detail(request, pk):
    """Function-based view for backward compatibility."""
    view = ChannelDetailView.as_view()
    return view(request, pk=pk)


@login_required
def channel_create(request):
    """Function-based view for backward compatibility."""
    view = ChannelCreateView.as_view()
    return view(request)


@login_required
def channel_edit(request, pk):
    """Function-based view for backward compatibility."""
    view = ChannelUpdateView.as_view()
    return view(request, pk=pk)


@login_required
def channel_health_check(request, pk):
    """Function-based view for backward compatibility."""
    view = ChannelHealthCheckAPIView.as_view()
    return view(request, pk=pk)


@login_required
def channel_stats_api(request, pk):
    """Function-based view for backward compatibility."""
    view = ChannelStatsAPIView.as_view()
    return view(request, pk=pk)
