# Generated by Django 4.2.7 on 2025-07-08 12:25

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


class Migration(migrations.Migration):

    initial = True

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

    operations = [
        migrations.CreateModel(
            name='Playlist',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('created_at', models.DateTimeField(auto_now_add=True)),
                ('updated_at', models.DateTimeField(auto_now=True)),
                ('is_deleted', models.BooleanField(default=False)),
                ('deleted_at', models.DateTimeField(blank=True, null=True)),
                ('name', models.CharField(max_length=200)),
                ('description', models.TextField(blank=True)),
                ('start_time', models.DateTimeField()),
                ('end_time', models.DateTimeField()),
                ('status', models.CharField(choices=[('draft', 'Draft'), ('scheduled', 'Scheduled'), ('active', 'Active'), ('completed', 'Completed'), ('cancelled', 'Cancelled')], default='draft', max_length=20)),
                ('priority', models.PositiveIntegerField(choices=[(1, 'Low'), (2, 'Normal'), (3, 'High'), (4, 'Critical')], default=2)),
                ('auto_fill_gaps', models.BooleanField(default=True, help_text='Automatically fill gaps with filler content')),
                ('allow_overrun', models.BooleanField(default=False, help_text='Allow playlist to run over scheduled end time')),
                ('loop_content', models.BooleanField(default=False, help_text='Loop content if playlist is shorter than scheduled time')),
                ('approved_at', models.DateTimeField(blank=True, null=True)),
                ('total_duration', models.PositiveIntegerField(default=0, help_text='Total duration in seconds')),
                ('content_duration', models.PositiveIntegerField(default=0, help_text='Content duration in seconds')),
                ('ad_duration', models.PositiveIntegerField(default=0, help_text='Ad duration in seconds')),
                ('approved_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='approved_playlists', to=settings.AUTH_USER_MODEL)),
                ('channel', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='playlists', to='channels.channel')),
                ('created_by', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL)),
            ],
            options={
                'ordering': ['-start_time'],
            },
        ),
        migrations.CreateModel(
            name='PlaylistTemplate',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('created_at', models.DateTimeField(auto_now_add=True)),
                ('updated_at', models.DateTimeField(auto_now=True)),
                ('is_deleted', models.BooleanField(default=False)),
                ('deleted_at', models.DateTimeField(blank=True, null=True)),
                ('name', models.CharField(max_length=200)),
                ('description', models.TextField(blank=True)),
                ('template_type', models.CharField(choices=[('daily', 'Daily Schedule'), ('weekly', 'Weekly Schedule'), ('special', 'Special Event'), ('holiday', 'Holiday Schedule'), ('custom', 'Custom Template')], default='daily', max_length=20)),
                ('duration_minutes', models.PositiveIntegerField(help_text='Template duration in minutes')),
                ('ad_break_interval', models.PositiveIntegerField(default=15, help_text='Minutes between ad breaks')),
                ('max_ad_duration', models.PositiveIntegerField(default=180, help_text='Maximum ad duration per break in seconds')),
                ('content_ratio', models.PositiveIntegerField(default=80, help_text='Percentage of content vs ads', validators=[django.core.validators.MinValueValidator(1), django.core.validators.MaxValueValidator(100)])),
                ('is_active', models.BooleanField(default=True)),
                ('created_by', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL)),
            ],
            options={
                'ordering': ['name'],
            },
        ),
        migrations.CreateModel(
            name='PlaylistItem',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('created_at', models.DateTimeField(auto_now_add=True)),
                ('updated_at', models.DateTimeField(auto_now=True)),
                ('is_deleted', models.BooleanField(default=False)),
                ('deleted_at', models.DateTimeField(blank=True, null=True)),
                ('item_type', models.CharField(choices=[('content', 'Content'), ('ad', 'Advertisement'), ('jingle', 'Jingle'), ('filler', 'Filler'), ('break', 'Break')], max_length=20)),
                ('name', models.CharField(max_length=200)),
                ('description', models.TextField(blank=True)),
                ('file_path', models.CharField(blank=True, max_length=500)),
                ('duration', models.PositiveIntegerField(help_text='Duration in seconds')),
                ('start_offset', models.PositiveIntegerField(default=0, help_text='Start time offset from playlist start in seconds')),
                ('order', models.PositiveIntegerField(default=0)),
                ('volume_level', models.FloatField(default=1.0, help_text='Volume level (0.0 to 2.0)', validators=[django.core.validators.MinValueValidator(0.0), django.core.validators.MaxValueValidator(2.0)])),
                ('fade_in', models.PositiveIntegerField(default=0, help_text='Fade in duration in milliseconds')),
                ('fade_out', models.PositiveIntegerField(default=0, help_text='Fade out duration in milliseconds')),
                ('is_mandatory', models.BooleanField(default=False, help_text='Cannot be skipped or replaced')),
                ('can_overlap', models.BooleanField(default=False, help_text='Can overlap with other items')),
                ('campaign', models.ForeignKey(blank=True, help_text='For ad items', null=True, on_delete=django.db.models.deletion.CASCADE, to='campaigns.campaign')),
                ('creative', models.ForeignKey(blank=True, help_text='For ad items', null=True, on_delete=django.db.models.deletion.CASCADE, to='campaigns.creative')),
                ('playlist', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='items', to='playlists.playlist')),
            ],
            options={
                'ordering': ['order', 'start_offset'],
            },
        ),
        migrations.CreateModel(
            name='PlaylistExecution',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('created_at', models.DateTimeField(auto_now_add=True)),
                ('updated_at', models.DateTimeField(auto_now=True)),
                ('is_deleted', models.BooleanField(default=False)),
                ('deleted_at', models.DateTimeField(blank=True, null=True)),
                ('status', models.CharField(choices=[('pending', 'Pending'), ('playing', 'Playing'), ('paused', 'Paused'), ('completed', 'Completed'), ('failed', 'Failed'), ('skipped', 'Skipped')], default='pending', max_length=20)),
                ('started_at', models.DateTimeField(blank=True, null=True)),
                ('completed_at', models.DateTimeField(blank=True, null=True)),
                ('actual_duration', models.PositiveIntegerField(default=0, help_text='Actual playback duration in seconds')),
                ('position', models.PositiveIntegerField(default=0, help_text='Current playback position in seconds')),
                ('error_message', models.TextField(blank=True)),
                ('retry_count', models.PositiveIntegerField(default=0)),
                ('playlist', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='executions', to='playlists.playlist')),
                ('playlist_item', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='executions', to='playlists.playlistitem')),
            ],
            options={
                'ordering': ['-started_at'],
            },
        ),
        migrations.CreateModel(
            name='PlaylistConflict',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('created_at', models.DateTimeField(auto_now_add=True)),
                ('updated_at', models.DateTimeField(auto_now=True)),
                ('is_deleted', models.BooleanField(default=False)),
                ('deleted_at', models.DateTimeField(blank=True, null=True)),
                ('conflict_type', models.CharField(choices=[('overlap', 'Time Overlap'), ('resource', 'Resource Conflict'), ('priority', 'Priority Conflict'), ('content', 'Content Conflict')], max_length=20)),
                ('severity', models.CharField(choices=[('low', 'Low'), ('medium', 'Medium'), ('high', 'High'), ('critical', 'Critical')], default='medium', max_length=20)),
                ('description', models.TextField()),
                ('is_resolved', models.BooleanField(default=False)),
                ('resolved_at', models.DateTimeField(blank=True, null=True)),
                ('resolution_notes', models.TextField(blank=True)),
                ('playlist_a', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='conflicts_as_a', to='playlists.playlist')),
                ('playlist_b', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='conflicts_as_b', to='playlists.playlist')),
                ('resolved_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL)),
            ],
            options={
                'ordering': ['-created_at'],
            },
        ),
        migrations.AddField(
            model_name='playlist',
            name='template',
            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='playlists', to='playlists.playlisttemplate'),
        ),
        migrations.AddIndex(
            model_name='playlistitem',
            index=models.Index(fields=['playlist', 'order'], name='playlists_p_playlis_11e03f_idx'),
        ),
        migrations.AddIndex(
            model_name='playlistitem',
            index=models.Index(fields=['item_type', 'start_offset'], name='playlists_p_item_ty_62ec9f_idx'),
        ),
        migrations.AddIndex(
            model_name='playlistexecution',
            index=models.Index(fields=['playlist', 'status'], name='playlists_p_playlis_bba752_idx'),
        ),
        migrations.AddIndex(
            model_name='playlistexecution',
            index=models.Index(fields=['started_at'], name='playlists_p_started_8f5635_idx'),
        ),
        migrations.AddIndex(
            model_name='playlistconflict',
            index=models.Index(fields=['playlist_a', 'is_resolved'], name='playlists_p_playlis_1de257_idx'),
        ),
        migrations.AddIndex(
            model_name='playlistconflict',
            index=models.Index(fields=['conflict_type', 'severity'], name='playlists_p_conflic_85f857_idx'),
        ),
        migrations.AddIndex(
            model_name='playlist',
            index=models.Index(fields=['channel', 'start_time'], name='playlists_p_channel_bc1d29_idx'),
        ),
        migrations.AddIndex(
            model_name='playlist',
            index=models.Index(fields=['status', 'start_time'], name='playlists_p_status_ed34ee_idx'),
        ),
    ]
