"""
REST API Serializers for Jingles Application

This module contains Django REST Framework serializers for jingle detection,
ad break management, and related functionality.
"""

from rest_framework import serializers
from django.contrib.auth.models import User
from apps.jingles.models import JingleTemplate, JingleDetection, AdBreak, DetectionStatistics


class JingleTemplateSerializer(serializers.ModelSerializer):
    """
    Serializer for JingleTemplate model.
    
    Handles serialization of jingle template data including
    image information and detection statistics.
    """
    
    created_by = serializers.StringRelatedField(read_only=True)
    image_exists = serializers.SerializerMethodField()
    detection_count = serializers.SerializerMethodField()
    accuracy_rate = serializers.SerializerMethodField()
    
    class Meta:
        model = JingleTemplate
        fields = [
            'id', 'name', 'slug', 'description', 'image_path',
            'similarity_threshold', 'is_active', 'category',
            'created_by', 'image_exists', 'detection_count',
            'accuracy_rate', 'created_at', 'updated_at'
        ]
        read_only_fields = ['id', 'created_by', 'created_at', 'updated_at']

    def get_image_exists(self, obj):
        """Check if the template image file exists."""
        return obj.image_exists()

    def get_detection_count(self, obj):
        """Get total number of detections for this template."""
        return obj.detections.count()

    def get_accuracy_rate(self, obj):
        """Get accuracy rate for this template."""
        total = obj.detections.count()
        if total == 0:
            return 0
        confirmed = obj.detections.filter(is_confirmed=True).count()
        return round((confirmed / total) * 100, 2)


class JingleDetectionSerializer(serializers.ModelSerializer):
    """
    Serializer for JingleDetection model.
    
    Provides detailed detection information including session
    and template data for analysis and monitoring.
    """
    
    template_name = serializers.StringRelatedField(source='template.name', read_only=True)
    channel_name = serializers.StringRelatedField(source='session.channel.name', read_only=True)
    segment_filename = serializers.StringRelatedField(source='segment.filename', read_only=True)
    frame_exists = serializers.SerializerMethodField()
    
    class Meta:
        model = JingleDetection
        fields = [
            'id', 'session', 'segment', 'template', 'template_name',
            'channel_name', 'segment_filename', 'confidence_score',
            'frame_path', 'frame_exists', 'detection_time',
            'frame_timestamp', 'is_confirmed', 'metadata',
            'created_at', 'updated_at'
        ]
        read_only_fields = [
            'id', 'detection_time', 'created_at', 'updated_at'
        ]

    def get_frame_exists(self, obj):
        """Check if the extracted frame file exists."""
        return obj.frame_exists()


class AdBreakSerializer(serializers.ModelSerializer):
    """
    Serializer for AdBreak model.
    
    Handles ad break data including timing information,
    detection references, and external API status.
    """
    
    channel_name = serializers.StringRelatedField(source='session.channel.name', read_only=True)
    start_template_name = serializers.StringRelatedField(source='start_detection.template.name', read_only=True)
    end_template_name = serializers.StringRelatedField(source='end_detection.template.name', read_only=True)
    duration_formatted = serializers.SerializerMethodField()
    is_complete = serializers.SerializerMethodField()
    
    class Meta:
        model = AdBreak
        fields = [
            'id', 'session', 'channel_name', 'region', 'status',
            'start_detection', 'end_detection', 'start_template_name',
            'end_template_name', 'start_time', 'end_time',
            'duration_seconds', 'duration_formatted', 'is_complete',
            'is_sent_to_api', 'api_response', 'notes',
            'created_at', 'updated_at'
        ]
        read_only_fields = [
            'id', 'duration_seconds', 'created_at', 'updated_at'
        ]

    def get_duration_formatted(self, obj):
        """Get human-readable duration format."""
        if obj.duration_seconds:
            minutes = obj.duration_seconds // 60
            seconds = obj.duration_seconds % 60
            if minutes > 0:
                return f"{minutes}m {seconds}s"
            else:
                return f"{seconds}s"
        return None

    def get_is_complete(self, obj):
        """Check if ad break is complete."""
        return obj.is_complete()


class DetectionStatisticsSerializer(serializers.ModelSerializer):
    """
    Serializer for DetectionStatistics model.
    
    Provides performance metrics and analysis data
    for jingle detection accuracy and effectiveness.
    """
    
    template_name = serializers.StringRelatedField(source='template.name', read_only=True)
    channel_name = serializers.StringRelatedField(source='session.channel.name', read_only=True)
    accuracy_rate = serializers.SerializerMethodField()
    false_positive_rate = serializers.SerializerMethodField()
    
    class Meta:
        model = DetectionStatistics
        fields = [
            'id', 'session', 'template', 'template_name', 'channel_name',
            'total_detections', 'confirmed_detections', 'false_positives',
            'accuracy_rate', 'false_positive_rate', 'avg_confidence',
            'min_confidence', 'max_confidence', 'detection_rate',
            'last_detection', 'created_at', 'updated_at'
        ]
        read_only_fields = [
            'id', 'total_detections', 'confirmed_detections',
            'false_positives', 'avg_confidence', 'min_confidence',
            'max_confidence', 'detection_rate', 'last_detection',
            'created_at', 'updated_at'
        ]

    def get_accuracy_rate(self, obj):
        """Get accuracy rate percentage."""
        return obj.accuracy_rate()

    def get_false_positive_rate(self, obj):
        """Get false positive rate percentage."""
        return obj.false_positive_rate()


class AdBreakDataSerializer(serializers.Serializer):
    """
    Serializer for ad break data export to external APIs.
    
    Formats ad break information for external system integration
    according to API specifications.
    """
    
    start = serializers.DateTimeField()
    end = serializers.DateTimeField(allow_null=True)
    duration = serializers.IntegerField(allow_null=True)
    channel = serializers.CharField()
    region = serializers.CharField()
    ad_break_id = serializers.UUIDField()


class DetectionSummarySerializer(serializers.Serializer):
    """
    Serializer for detection summary statistics.
    
    Provides aggregated detection data for reporting
    and dashboard display purposes.
    """
    
    total_detections = serializers.IntegerField()
    detections_today = serializers.IntegerField()
    confirmed_detections = serializers.IntegerField()
    accuracy_rate = serializers.FloatField()
    top_templates = serializers.ListField()
    recent_activity = serializers.ListField()
