# Generated by Django 4.2.15 on 2025-07-14 08:39

from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
import uuid


class Migration(migrations.Migration):

    dependencies = [
        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
        ('channels', '0001_initial'),
    ]

    operations = [
        migrations.AlterUniqueTogether(
            name='channel',
            unique_together=set(),
        ),
        migrations.AddField(
            model_name='channelcodec',
            name='ffmpeg_options',
            field=models.JSONField(blank=True, default=dict, help_text='Additional FFmpeg options as JSON'),
        ),
        migrations.AddField(
            model_name='jingle',
            name='audio_fingerprint',
            field=models.TextField(blank=True, help_text='Audio fingerprint data for detection in streams'),
        ),
        migrations.AddField(
            model_name='jingle',
            name='placement_type',
            field=models.CharField(choices=[('start', 'Start of Show'), ('end', 'End of Show'), ('commercial_start', 'Start of Commercial Break'), ('commercial_end', 'End of Commercial Break'), ('program_transition', 'Program Transition'), ('hourly', 'Hourly'), ('half_hourly', 'Half Hourly'), ('random', 'Random Placement')], default='random', help_text='When this jingle should be played', max_length=20),
        ),
        migrations.AddField(
            model_name='jingle',
            name='video_fingerprint',
            field=models.TextField(blank=True, help_text='Video fingerprint data for detection in streams'),
        ),
        migrations.AlterField(
            model_name='channel',
            name='codec',
            field=models.ForeignKey(blank=True, help_text='Default codec configuration for video and audio', null=True, on_delete=django.db.models.deletion.SET_NULL, to='channels.channelcodec', verbose_name='Default Video/Audio Codec'),
        ),
        migrations.AlterField(
            model_name='channel',
            name='stream_url',
            field=models.URLField(blank=True, help_text='Default URL for live streaming of the channel', verbose_name='Default Stream URL'),
        ),
        migrations.CreateModel(
            name='ChannelZoneRelation',
            fields=[
                ('created_at', models.DateTimeField(auto_now_add=True, help_text='Date and time when the record was created', verbose_name='Created At')),
                ('updated_at', models.DateTimeField(auto_now=True, help_text='Date and time when the record was last updated', verbose_name='Updated At')),
                ('id', models.UUIDField(default=uuid.uuid4, editable=False, help_text='Unique identifier for this record', primary_key=True, serialize=False)),
                ('is_deleted', models.BooleanField(default=False, help_text='Whether this record has been soft deleted', verbose_name='Is Deleted')),
                ('deleted_at', models.DateTimeField(blank=True, help_text='Date and time when the record was deleted', null=True, verbose_name='Deleted At')),
                ('stream_url', models.URLField(blank=True, help_text='Stream URL specific to this zone', verbose_name='Zone-specific stream URL')),
                ('ftp_host', models.CharField(blank=True, help_text='FTP server hostname or IP address', max_length=255, verbose_name='FTP Host')),
                ('ftp_username', models.CharField(blank=True, max_length=100, verbose_name='FTP Username')),
                ('ftp_password', models.CharField(blank=True, max_length=255, verbose_name='FTP Password')),
                ('ftp_port', models.PositiveIntegerField(default=21, verbose_name='FTP Port')),
                ('ftp_root_directory', models.CharField(blank=True, default='/', help_text='Root directory path on FTP server', max_length=500, verbose_name='FTP Root Directory')),
                ('ftp_use_passive', models.BooleanField(default=True, verbose_name='Use FTP Passive Mode')),
                ('vpn_type', models.CharField(choices=[('none', 'No VPN'), ('ipsec', 'IPSec Tunnel'), ('openvpn', 'OpenVPN'), ('wireguard', 'WireGuard')], default='none', max_length=20, verbose_name='VPN Type')),
                ('vpn_server_address', models.CharField(blank=True, help_text='VPN server IP address or hostname', max_length=255, verbose_name='VPN Server Address')),
                ('vpn_username', models.CharField(blank=True, max_length=100, verbose_name='VPN Username')),
                ('vpn_password', models.CharField(blank=True, max_length=255, verbose_name='VPN Password')),
                ('ipsec_preshared_key', models.TextField(blank=True, verbose_name='IPSec Pre-shared Key')),
                ('ipsec_local_subnet', models.CharField(blank=True, help_text='e.g., 192.168.1.0/24', max_length=18, verbose_name='IPSec Local Subnet')),
                ('ipsec_remote_subnet', models.CharField(blank=True, help_text='e.g., 10.0.0.0/24', max_length=18, verbose_name='IPSec Remote Subnet')),
                ('openvpn_config_file', models.FileField(blank=True, null=True, upload_to='vpn_configs/', verbose_name='OpenVPN Config File')),
                ('openvpn_ca_cert', models.TextField(blank=True, verbose_name='OpenVPN CA Certificate')),
                ('openvpn_client_cert', models.TextField(blank=True, verbose_name='OpenVPN Client Certificate')),
                ('openvpn_client_key', models.TextField(blank=True, verbose_name='OpenVPN Client Private Key')),
                ('wireguard_private_key', models.TextField(blank=True, verbose_name='WireGuard Private Key')),
                ('wireguard_public_key', models.TextField(blank=True, verbose_name='WireGuard Public Key')),
                ('wireguard_endpoint', models.CharField(blank=True, help_text='e.g., vpn.example.com:51820', max_length=255, verbose_name='WireGuard Endpoint')),
                ('wireguard_allowed_ips', models.TextField(blank=True, help_text='Comma-separated list of allowed IP ranges', verbose_name='WireGuard Allowed IPs')),
                ('is_active', models.BooleanField(default=True, verbose_name='Active in Zone')),
                ('priority', models.PositiveIntegerField(default=1, help_text='Higher number = higher priority', verbose_name='Priority')),
                ('channel', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='zone_relations', to='channels.channel')),
                ('codec', models.ForeignKey(blank=True, help_text='Codec configuration for this zone', null=True, on_delete=django.db.models.deletion.SET_NULL, to='channels.channelcodec', verbose_name='Zone-specific codec')),
                ('created_by', models.ForeignKey(blank=True, help_text='User who created this record', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='%(class)s_created_records', to=settings.AUTH_USER_MODEL)),
                ('deleted_by', models.ForeignKey(blank=True, help_text='User who deleted this record', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='%(class)s_deleted_records', to=settings.AUTH_USER_MODEL)),
                ('updated_by', models.ForeignKey(blank=True, help_text='User who last updated this record', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='%(class)s_updated_records', to=settings.AUTH_USER_MODEL)),
                ('zone', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='channel_relations', to='channels.channelzone')),
            ],
            options={
                'db_table': 'channel_zone_relations',
                'ordering': ['channel', 'zone', '-priority'],
                'unique_together': {('channel', 'zone')},
            },
        ),
        migrations.RemoveField(
            model_name='channel',
            name='zone',
        ),
        migrations.AddField(
            model_name='channel',
            name='zones',
            field=models.ManyToManyField(blank=True, help_text='Geographic zones where this channel is available', related_name='channels', through='channels.ChannelZoneRelation', to='channels.channelzone', verbose_name='Channel Zones'),
        ),
        migrations.CreateModel(
            name='JingleDetection',
            fields=[
                ('created_at', models.DateTimeField(auto_now_add=True, help_text='Date and time when the record was created', verbose_name='Created At')),
                ('updated_at', models.DateTimeField(auto_now=True, help_text='Date and time when the record was last updated', verbose_name='Updated At')),
                ('id', models.UUIDField(default=uuid.uuid4, editable=False, help_text='Unique identifier for this record', primary_key=True, serialize=False)),
                ('is_deleted', models.BooleanField(default=False, help_text='Whether this record has been soft deleted', verbose_name='Is Deleted')),
                ('deleted_at', models.DateTimeField(blank=True, help_text='Date and time when the record was deleted', null=True, verbose_name='Deleted At')),
                ('detected_at', models.DateTimeField(auto_now_add=True)),
                ('start_timestamp', models.DateTimeField(help_text='When the jingle started playing in the stream')),
                ('end_timestamp', models.DateTimeField(help_text='When the jingle ended playing in the stream')),
                ('confidence_score', models.DecimalField(decimal_places=4, help_text='Confidence score from 0.0 to 1.0', max_digits=5)),
                ('detection_method', models.CharField(default='audio_fingerprint', help_text='Method used for detection (audio_fingerprint, video_fingerprint, etc.)', max_length=50)),
                ('stream_position', models.PositiveIntegerField(help_text='Position in stream where jingle was detected (seconds)')),
                ('status', models.CharField(choices=[('detected', 'Detected'), ('confirmed', 'Confirmed'), ('false_positive', 'False Positive')], default='detected', max_length=20)),
                ('metadata', models.JSONField(blank=True, default=dict, help_text='Additional detection metadata')),
                ('channel', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='jingle_detections', to='channels.channel')),
                ('created_by', models.ForeignKey(blank=True, help_text='User who created this record', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='%(class)s_created_records', to=settings.AUTH_USER_MODEL)),
                ('deleted_by', models.ForeignKey(blank=True, help_text='User who deleted this record', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='%(class)s_deleted_records', to=settings.AUTH_USER_MODEL)),
                ('jingle', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='detections', to='channels.jingle')),
                ('updated_by', models.ForeignKey(blank=True, help_text='User who last updated this record', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='%(class)s_updated_records', to=settings.AUTH_USER_MODEL)),
            ],
            options={
                'db_table': 'jingle_detections',
                'ordering': ['-detected_at'],
                'indexes': [models.Index(fields=['channel', 'detected_at'], name='jingle_dete_channel_18fbef_idx'), models.Index(fields=['jingle', 'detected_at'], name='jingle_dete_jingle__5ec887_idx'), models.Index(fields=['start_timestamp', 'end_timestamp'], name='jingle_dete_start_t_8492c4_idx')],
            },
        ),
    ]
