# Generated by Django 4.2.0

from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
import django.core.validators
import apps.channels.models


class Migration(migrations.Migration):
    """Initial migration for channels app.
    
    Creates database schema for:
    - Channel: TV channel configuration
    - ChannelZone: Regional channel settings
    - ChannelCodec: Video/audio codec specifications
    - Jingle: Audio jingle files
    - DayTime: Time-based programming slots
    
    Features:
    - Complete model definitions with all fields
    - Foreign key relationships
    - Unique constraints
    - Database indexes for performance
    - File upload paths
    - Validation constraints
    """

    initial = True

    dependencies = [
        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
    ]

    operations = [
        # Create Channel model
        migrations.CreateModel(
            name='Channel',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Created At')),
                ('updated_at', models.DateTimeField(auto_now=True, verbose_name='Updated At')),
                ('status', models.CharField(choices=[('active', 'Active'), ('inactive', 'Inactive')], default='active', max_length=20, verbose_name='Status')),
                ('name', models.CharField(help_text='Channel display name', max_length=100, verbose_name='Channel Name')),
                ('channel_code', models.CharField(help_text='Unique channel identifier code', max_length=50, unique=True, verbose_name='Channel Code')),
                ('description', models.TextField(blank=True, help_text='Channel description', verbose_name='Description')),
                ('logo', models.ImageField(blank=True, help_text='Channel logo image', null=True, upload_to=apps.channels.models.channel_logo_path, verbose_name='Logo')),
                ('provider', models.CharField(choices=[('sfr', 'SFR'), ('bouygues', 'Bouygues Telecom'), ('orange', 'Orange'), ('free', 'Free'), ('canal', 'Canal+'), ('other', 'Other')], help_text='Channel provider/operator', max_length=20, verbose_name='Provider')),
                ('ftp_channel_name', models.CharField(blank=True, help_text='FTP channel directory name', max_length=100, verbose_name='FTP Channel Name')),
                ('is_hd', models.BooleanField(default=False, help_text='Supports HD quality', verbose_name='HD Support')),
                ('is_4k', models.BooleanField(default=False, help_text='Supports 4K quality', verbose_name='4K Support')),
                ('default_codec', models.CharField(blank=True, choices=[('h264', 'H.264/AVC'), ('h265', 'H.265/HEVC'), ('av1', 'AV1'), ('vp9', 'VP9'), ('mpeg2', 'MPEG-2')], help_text='Default video codec', max_length=20, verbose_name='Default Video Codec')),
                ('audio_codec', models.CharField(blank=True, choices=[('aac', 'AAC'), ('mp3', 'MP3'), ('ac3', 'AC-3'), ('eac3', 'E-AC-3'), ('dts', 'DTS')], help_text='Default audio codec', max_length=20, verbose_name='Audio Codec')),
                ('bitrate', models.PositiveIntegerField(blank=True, help_text='Video bitrate in kbps', null=True, verbose_name='Bitrate (kbps)')),
                ('resolution', models.CharField(blank=True, help_text='Video resolution (e.g., 1920x1080)', max_length=20, verbose_name='Resolution')),
                ('frame_rate', models.DecimalField(blank=True, decimal_places=2, help_text='Frame rate in fps', max_digits=5, null=True, verbose_name='Frame Rate (fps)')),
                ('aspect_ratio', models.CharField(blank=True, help_text='Aspect ratio (e.g., 16:9)', max_length=10, verbose_name='Aspect Ratio')),
                ('language', models.CharField(blank=True, help_text='Primary language code', max_length=10, verbose_name='Language')),
                ('region', models.CharField(blank=True, help_text='Geographic region', max_length=50, verbose_name='Region')),
                ('time_zone', models.CharField(blank=True, help_text='Channel timezone', max_length=50, verbose_name='Time Zone')),
                ('epg_source', models.CharField(blank=True, choices=[('internal', 'Internal'), ('external', 'External'), ('xmltv', 'XMLTV'), ('json', 'JSON API')], help_text='EPG data source', max_length=20, verbose_name='EPG Source')),
                ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='created_channels', to=settings.AUTH_USER_MODEL, verbose_name='Created By')),
                ('updated_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='updated_channels', to=settings.AUTH_USER_MODEL, verbose_name='Updated By')),
            ],
            options={
                'verbose_name': 'Channel',
                'verbose_name_plural': 'Channels',
                'db_table': 'channels_channel',
                'ordering': ['name'],
            },
        ),
        
        # Create ChannelZone model
        migrations.CreateModel(
            name='ChannelZone',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Created At')),
                ('updated_at', models.DateTimeField(auto_now=True, verbose_name='Updated At')),
                ('status', models.CharField(choices=[('active', 'Active'), ('inactive', 'Inactive')], default='active', max_length=20, verbose_name='Status')),
                ('zone_name', models.CharField(help_text='Zone identifier name', max_length=100, verbose_name='Zone Name')),
                ('region_name', models.CharField(help_text='Geographic region name', max_length=100, verbose_name='Region Name')),
                ('description', models.TextField(blank=True, help_text='Zone description', verbose_name='Description')),
                ('ftp_path', models.CharField(blank=True, help_text='FTP path for this zone', max_length=255, verbose_name='FTP Path')),
                ('is_primary', models.BooleanField(default=False, help_text='Primary zone for the channel', verbose_name='Primary Zone')),
                ('broadcast_start_time', models.TimeField(blank=True, help_text='Daily broadcast start time', null=True, verbose_name='Broadcast Start')),
                ('broadcast_end_time', models.TimeField(blank=True, help_text='Daily broadcast end time', null=True, verbose_name='Broadcast End')),
                ('time_offset', models.IntegerField(default=0, help_text='Time offset in minutes from UTC', verbose_name='Time Offset (minutes)')),
                ('channel', models.ForeignKey(help_text='Associated channel', on_delete=django.db.models.deletion.CASCADE, related_name='zones', to='channels.channel', verbose_name='Channel')),
                ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='created_channel_zones', to=settings.AUTH_USER_MODEL, verbose_name='Created By')),
                ('updated_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='updated_channel_zones', to=settings.AUTH_USER_MODEL, verbose_name='Updated By')),
            ],
            options={
                'verbose_name': 'Channel Zone',
                'verbose_name_plural': 'Channel Zones',
                'db_table': 'channels_zone',
                'ordering': ['channel__name', 'zone_name'],
            },
        ),
        
        # Create ChannelCodec model
        migrations.CreateModel(
            name='ChannelCodec',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Created At')),
                ('updated_at', models.DateTimeField(auto_now=True, verbose_name='Updated At')),
                ('status', models.CharField(choices=[('active', 'Active'), ('inactive', 'Inactive')], default='active', max_length=20, verbose_name='Status')),
                ('quality_level', models.CharField(choices=[('sd', 'Standard Definition'), ('hd', 'High Definition'), ('fhd', 'Full HD'), ('4k', '4K Ultra HD'), ('8k', '8K Ultra HD')], help_text='Video quality level', max_length=10, verbose_name='Quality Level')),
                ('video_codec', models.CharField(choices=[('h264', 'H.264/AVC'), ('h265', 'H.265/HEVC'), ('av1', 'AV1'), ('vp9', 'VP9'), ('mpeg2', 'MPEG-2')], help_text='Video codec used', max_length=20, verbose_name='Video Codec')),
                ('audio_codec', models.CharField(choices=[('aac', 'AAC'), ('mp3', 'MP3'), ('ac3', 'AC-3'), ('eac3', 'E-AC-3'), ('dts', 'DTS')], help_text='Audio codec used', max_length=20, verbose_name='Audio Codec')),
                ('bitrate', models.PositiveIntegerField(help_text='Video bitrate in kbps', verbose_name='Video Bitrate (kbps)')),
                ('audio_bitrate', models.PositiveIntegerField(default=128, help_text='Audio bitrate in kbps', verbose_name='Audio Bitrate (kbps)')),
                ('resolution', models.CharField(help_text='Video resolution (e.g., 1920x1080)', max_length=20, verbose_name='Resolution')),
                ('frame_rate', models.DecimalField(decimal_places=2, default=25.0, help_text='Frame rate in fps', max_digits=5, verbose_name='Frame Rate (fps)')),
                ('audio_sample_rate', models.PositiveIntegerField(default=48000, help_text='Audio sample rate in Hz', verbose_name='Audio Sample Rate (Hz)')),
                ('is_default', models.BooleanField(default=False, help_text='Default codec for this channel', verbose_name='Default Codec')),
                ('channel', models.ForeignKey(help_text='Associated channel', on_delete=django.db.models.deletion.CASCADE, related_name='codecs', to='channels.channel', verbose_name='Channel')),
                ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='created_channel_codecs', to=settings.AUTH_USER_MODEL, verbose_name='Created By')),
                ('updated_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='updated_channel_codecs', to=settings.AUTH_USER_MODEL, verbose_name='Updated By')),
            ],
            options={
                'verbose_name': 'Channel Codec',
                'verbose_name_plural': 'Channel Codecs',
                'db_table': 'channels_codec',
                'ordering': ['channel__name', 'quality_level'],
            },
        ),
        
        # Create Jingle model
        migrations.CreateModel(
            name='Jingle',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Created At')),
                ('updated_at', models.DateTimeField(auto_now=True, verbose_name='Updated At')),
                ('status', models.CharField(choices=[('active', 'Active'), ('inactive', 'Inactive')], default='active', max_length=20, verbose_name='Status')),
                ('name', models.CharField(help_text='Jingle name/title', max_length=100, verbose_name='Jingle Name')),
                ('description', models.TextField(blank=True, help_text='Jingle description', verbose_name='Description')),
                ('audio_file', models.FileField(help_text='Audio file (MP3, WAV, AAC, etc.)', upload_to=apps.channels.models.jingle_upload_path, validators=[apps.channels.models.validate_audio_file], verbose_name='Audio File')),
                ('duration', models.FloatField(blank=True, help_text='Duration in seconds', null=True, validators=[django.core.validators.MinValueValidator(0.1)], verbose_name='Duration (seconds)')),
                ('file_size', models.PositiveIntegerField(blank=True, help_text='File size in bytes', null=True, verbose_name='File Size (bytes)')),
                ('audio_format', models.CharField(blank=True, help_text='Audio file format', max_length=10, verbose_name='Audio Format')),
                ('sample_rate', models.PositiveIntegerField(blank=True, help_text='Audio sample rate in Hz', null=True, verbose_name='Sample Rate (Hz)')),
                ('bitrate', models.PositiveIntegerField(blank=True, help_text='Audio bitrate in kbps', null=True, verbose_name='Bitrate (kbps)')),
                ('is_intro', models.BooleanField(default=False, help_text='Use as intro jingle', verbose_name='Intro Jingle')),
                ('is_outro', models.BooleanField(default=False, help_text='Use as outro jingle', verbose_name='Outro Jingle')),
                ('is_transition', models.BooleanField(default=False, help_text='Use as transition jingle', verbose_name='Transition Jingle')),
                ('play_order', models.PositiveIntegerField(default=1, help_text='Play order for multiple jingles', verbose_name='Play Order')),
                ('channel', models.ForeignKey(help_text='Associated channel', on_delete=django.db.models.deletion.CASCADE, related_name='jingles', to='channels.channel', verbose_name='Channel')),
                ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='created_jingles', to=settings.AUTH_USER_MODEL, verbose_name='Created By')),
                ('updated_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='updated_jingles', to=settings.AUTH_USER_MODEL, verbose_name='Updated By')),
            ],
            options={
                'verbose_name': 'Jingle',
                'verbose_name_plural': 'Jingles',
                'db_table': 'channels_jingle',
                'ordering': ['channel__name', 'play_order', 'name'],
            },
        ),
        
        # Create DayTime model
        migrations.CreateModel(
            name='DayTime',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Created At')),
                ('updated_at', models.DateTimeField(auto_now=True, verbose_name='Updated At')),
                ('status', models.CharField(choices=[('active', 'Active'), ('inactive', 'Inactive')], default='active', max_length=20, verbose_name='Status')),
                ('name', models.CharField(help_text='Time slot name', max_length=100, verbose_name='Time Slot Name')),
                ('description', models.TextField(blank=True, help_text='Time slot description', verbose_name='Description')),
                ('day_of_week', models.PositiveIntegerField(choices=[(0, 'Sunday'), (1, 'Monday'), (2, 'Tuesday'), (3, 'Wednesday'), (4, 'Thursday'), (5, 'Friday'), (6, 'Saturday')], help_text='Day of the week (0=Sunday)', verbose_name='Day of Week')),
                ('start_time', models.TimeField(help_text='Start time of the slot', verbose_name='Start Time')),
                ('end_time', models.TimeField(help_text='End time of the slot', verbose_name='End Time')),
                ('is_prime_time', models.BooleanField(default=False, help_text='Prime time slot', verbose_name='Prime Time')),
                ('is_weekend', models.BooleanField(default=False, help_text='Weekend time slot', verbose_name='Weekend')),
                ('priority', models.PositiveIntegerField(default=1, help_text='Priority level (1-5)', validators=[django.core.validators.MinValueValidator(1), django.core.validators.MaxValueValidator(5)], verbose_name='Priority')),
                ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='created_day_times', to=settings.AUTH_USER_MODEL, verbose_name='Created By')),
                ('updated_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='updated_day_times', to=settings.AUTH_USER_MODEL, verbose_name='Updated By')),
            ],
            options={
                'verbose_name': 'Day Time Slot',
                'verbose_name_plural': 'Day Time Slots',
                'db_table': 'channels_daytime',
                'ordering': ['day_of_week', 'start_time'],
            },
        ),
        
        # Add unique constraints
        migrations.AddConstraint(
            model_name='channelzone',
            constraint=models.UniqueConstraint(fields=['channel', 'zone_name'], name='unique_channel_zone'),
        ),
        
        migrations.AddConstraint(
            model_name='channelcodec',
            constraint=models.UniqueConstraint(fields=['channel', 'quality_level'], name='unique_channel_codec_quality'),
        ),
        
        migrations.AddConstraint(
            model_name='jingle',
            constraint=models.UniqueConstraint(fields=['channel', 'name'], name='unique_channel_jingle_name'),
        ),
        
        migrations.AddConstraint(
            model_name='daytime',
            constraint=models.UniqueConstraint(fields=['day_of_week', 'start_time', 'end_time'], name='unique_day_time_slot'),
        ),
        
        # Add database indexes for performance
        migrations.AddIndex(
            model_name='channel',
            index=models.Index(fields=['provider', 'status'], name='channels_channel_provider_status_idx'),
        ),
        
        migrations.AddIndex(
            model_name='channel',
            index=models.Index(fields=['is_hd', 'is_4k'], name='channels_channel_quality_idx'),
        ),
        
        migrations.AddIndex(
            model_name='channel',
            index=models.Index(fields=['created_at'], name='channels_channel_created_idx'),
        ),
        
        migrations.AddIndex(
            model_name='channelzone',
            index=models.Index(fields=['channel', 'is_primary'], name='channels_zone_channel_primary_idx'),
        ),
        
        migrations.AddIndex(
            model_name='channelzone',
            index=models.Index(fields=['region_name', 'status'], name='channels_zone_region_status_idx'),
        ),
        
        migrations.AddIndex(
            model_name='channelcodec',
            index=models.Index(fields=['channel', 'is_default'], name='channels_codec_channel_default_idx'),
        ),
        
        migrations.AddIndex(
            model_name='channelcodec',
            index=models.Index(fields=['quality_level', 'video_codec'], name='channels_codec_quality_video_idx'),
        ),
        
        migrations.AddIndex(
            model_name='jingle',
            index=models.Index(fields=['channel', 'status'], name='channels_jingle_channel_status_idx'),
        ),
        
        migrations.AddIndex(
            model_name='jingle',
            index=models.Index(fields=['is_intro', 'is_outro', 'is_transition'], name='channels_jingle_type_idx'),
        ),
        
        migrations.AddIndex(
            model_name='jingle',
            index=models.Index(fields=['play_order'], name='channels_jingle_order_idx'),
        ),
        
        migrations.AddIndex(
            model_name='daytime',
            index=models.Index(fields=['day_of_week', 'is_prime_time'], name='channels_daytime_day_prime_idx'),
        ),
        
        migrations.AddIndex(
            model_name='daytime',
            index=models.Index(fields=['start_time', 'end_time'], name='channels_daytime_time_range_idx'),
        ),
    ]