# Generated by Django 4.2.0

from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
import django.utils.timezone
import creatives.models


class Migration(migrations.Migration):
    """
    Initial migration for creatives app.
    
    Creates the database schema for creative asset management including:
    - Creative: Main creative asset model
    - CreativeVersion: Version control for creatives
    - CreativeFormat: Supported creative formats
    - CreativeTemplate: Template management
    - CreativeAsset: Additional asset files
    - CreativeApproval: Approval workflow
    - CreativePerformance: Performance tracking
    - CreativeTag: Tagging system
    - CreativeCompliance: Compliance checking
    - CreativeVariant: A/B testing variants
    
    Features:
    - File upload and storage
    - Version control and history
    - Approval workflow management
    - Performance metrics tracking
    - Compliance and validation
    - Template-based creation
    - A/B testing support
    - Tagging and categorization
    """

    initial = True

    dependencies = [
        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
        ('campaigns', '0001_initial'),  # Assuming campaigns app exists
    ]

    operations = [
        # Creative Format Model
        migrations.CreateModel(
            name='CreativeFormat',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('name', models.CharField(max_length=100, unique=True, verbose_name='Format Name')),
                ('file_extension', models.CharField(max_length=10, verbose_name='File Extension')),
                ('mime_type', models.CharField(max_length=100, verbose_name='MIME Type')),
                ('max_file_size', models.PositiveIntegerField(help_text='Maximum file size in bytes', verbose_name='Max File Size')),
                ('supported_dimensions', models.JSONField(blank=True, default=list, help_text='List of supported dimensions', verbose_name='Supported Dimensions')),
                ('is_active', models.BooleanField(default=True, verbose_name='Is Active')),
                ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Created At')),
                ('updated_at', models.DateTimeField(auto_now=True, verbose_name='Updated At')),
            ],
            options={
                'verbose_name': 'Creative Format',
                'verbose_name_plural': 'Creative Formats',
                'ordering': ['name'],
            },
        ),
        
        # Creative Tag Model
        migrations.CreateModel(
            name='CreativeTag',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('name', models.CharField(max_length=50, unique=True, verbose_name='Tag Name')),
                ('slug', models.SlugField(max_length=50, unique=True, verbose_name='Slug')),
                ('color', models.CharField(blank=True, max_length=7, verbose_name='Color')),
                ('description', models.TextField(blank=True, verbose_name='Description')),
                ('is_active', models.BooleanField(default=True, verbose_name='Is Active')),
                ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Created At')),
                ('created_by', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='created_tags', to=settings.AUTH_USER_MODEL, verbose_name='Created By')),
            ],
            options={
                'verbose_name': 'Creative Tag',
                'verbose_name_plural': 'Creative Tags',
                'ordering': ['name'],
            },
        ),
        
        # Creative Template Model
        migrations.CreateModel(
            name='CreativeTemplate',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('name', models.CharField(max_length=200, verbose_name='Template Name')),
                ('slug', models.SlugField(max_length=200, unique=True, verbose_name='Slug')),
                ('description', models.TextField(blank=True, verbose_name='Description')),
                ('template_type', models.CharField(choices=[('banner', 'Banner'), ('video', 'Video'), ('native', 'Native'), ('interstitial', 'Interstitial'), ('rewarded', 'Rewarded')], max_length=20, verbose_name='Template Type')),
                ('width', models.PositiveIntegerField(blank=True, null=True, verbose_name='Width')),
                ('height', models.PositiveIntegerField(blank=True, null=True, verbose_name='Height')),
                ('template_file', models.FileField(blank=True, null=True, upload_to=creatives.models.template_upload_path, verbose_name='Template File')),
                ('preview_image', models.ImageField(blank=True, null=True, upload_to=creatives.models.template_preview_path, verbose_name='Preview Image')),
                ('variables', models.JSONField(blank=True, default=dict, help_text='Template variables and their types', verbose_name='Variables')),
                ('css_styles', models.TextField(blank=True, verbose_name='CSS Styles')),
                ('javascript_code', models.TextField(blank=True, verbose_name='JavaScript Code')),
                ('is_active', models.BooleanField(default=True, verbose_name='Is Active')),
                ('is_public', models.BooleanField(default=False, verbose_name='Is Public')),
                ('usage_count', models.PositiveIntegerField(default=0, verbose_name='Usage Count')),
                ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Created At')),
                ('updated_at', models.DateTimeField(auto_now=True, verbose_name='Updated At')),
                ('created_by', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='created_templates', to=settings.AUTH_USER_MODEL, verbose_name='Created By')),
            ],
            options={
                'verbose_name': 'Creative Template',
                'verbose_name_plural': 'Creative Templates',
                'ordering': ['-created_at'],
            },
        ),
        
        # Creative Model
        migrations.CreateModel(
            name='Creative',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('name', models.CharField(max_length=200, verbose_name='Creative Name')),
                ('slug', models.SlugField(max_length=200, unique=True, verbose_name='Slug')),
                ('description', models.TextField(blank=True, verbose_name='Description')),
                ('creative_type', models.CharField(choices=[('image', 'Image'), ('video', 'Video'), ('audio', 'Audio'), ('html', 'HTML'), ('banner', 'Banner')], max_length=20, verbose_name='Creative Type')),
                ('creative_status', models.CharField(choices=[('draft', 'Draft'), ('processing', 'Processing'), ('pending_approval', 'Pending Approval'), ('approved', 'Approved'), ('rejected', 'Rejected'), ('live', 'Live'), ('paused', 'Paused'), ('archived', 'Archived')], default='draft', max_length=20, verbose_name='Status')),
                ('primary_file', models.FileField(blank=True, null=True, upload_to=creatives.models.creative_upload_path, verbose_name='Primary File')),
                ('thumbnail', models.ImageField(blank=True, null=True, upload_to=creatives.models.thumbnail_upload_path, verbose_name='Thumbnail')),
                ('file_size', models.PositiveIntegerField(blank=True, null=True, verbose_name='File Size (bytes)')),
                ('width', models.PositiveIntegerField(blank=True, null=True, verbose_name='Width')),
                ('height', models.PositiveIntegerField(blank=True, null=True, verbose_name='Height')),
                ('duration', models.DurationField(blank=True, null=True, verbose_name='Duration')),
                ('metadata', models.JSONField(blank=True, default=dict, verbose_name='Metadata')),
                ('priority', models.IntegerField(choices=[(1, 'Very High'), (2, 'High'), (3, 'Medium'), (4, 'Low'), (5, 'Very Low')], default=3, verbose_name='Priority')),
                ('is_compliant', models.BooleanField(default=False, verbose_name='Is Compliant')),
                ('compliance_score', models.DecimalField(blank=True, decimal_places=2, max_digits=5, null=True, verbose_name='Compliance Score')),
                ('impressions', models.PositiveIntegerField(default=0, verbose_name='Impressions')),
                ('clicks', models.PositiveIntegerField(default=0, verbose_name='Clicks')),
                ('conversions', models.PositiveIntegerField(default=0, verbose_name='Conversions')),
                ('cost', models.DecimalField(decimal_places=2, default=0, max_digits=10, verbose_name='Cost')),
                ('notes', models.TextField(blank=True, verbose_name='Notes')),
                ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Created At')),
                ('updated_at', models.DateTimeField(auto_now=True, verbose_name='Updated At')),
                ('campaign', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='creatives', to='campaigns.campaign', verbose_name='Campaign')),
                ('created_by', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='created_creatives', to=settings.AUTH_USER_MODEL, verbose_name='Created By')),
                ('format', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='creatives', to='creatives.creativeformat', verbose_name='Format')),
                ('tags', models.ManyToManyField(blank=True, related_name='creatives', to='creatives.creativetag', verbose_name='Tags')),
                ('template', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='creatives', to='creatives.creativetemplate', verbose_name='Template')),
                ('updated_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='updated_creatives', to=settings.AUTH_USER_MODEL, verbose_name='Updated By')),
            ],
            options={
                'verbose_name': 'Creative',
                'verbose_name_plural': 'Creatives',
                'ordering': ['-created_at'],
                'indexes': [
                    models.Index(fields=['creative_status'], name='creatives_creative_status_idx'),
                    models.Index(fields=['creative_type'], name='creatives_creative_type_idx'),
                    models.Index(fields=['created_at'], name='creatives_created_at_idx'),
                    models.Index(fields=['campaign'], name='creatives_campaign_idx'),
                    models.Index(fields=['is_compliant'], name='creatives_compliant_idx'),
                ],
            },
        ),
        
        # Creative Version Model
        migrations.CreateModel(
            name='CreativeVersion',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('version_number', models.PositiveIntegerField(verbose_name='Version Number')),
                ('file', models.FileField(upload_to=creatives.models.version_upload_path, verbose_name='File')),
                ('file_size', models.PositiveIntegerField(blank=True, null=True, verbose_name='File Size (bytes)')),
                ('changes', models.TextField(blank=True, verbose_name='Changes')),
                ('is_current', models.BooleanField(default=False, verbose_name='Is Current Version')),
                ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Created At')),
                ('created_by', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='created_versions', to=settings.AUTH_USER_MODEL, verbose_name='Created By')),
                ('creative', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='versions', to='creatives.creative', verbose_name='Creative')),
            ],
            options={
                'verbose_name': 'Creative Version',
                'verbose_name_plural': 'Creative Versions',
                'ordering': ['-version_number'],
                'unique_together': {('creative', 'version_number')},
            },
        ),
        
        # Creative Variant Model
        migrations.CreateModel(
            name='CreativeVariant',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('variant_name', models.CharField(max_length=100, verbose_name='Variant Name')),
                ('variant_type', models.CharField(choices=[('a_b_test', 'A/B Test'), ('multivariate', 'Multivariate'), ('dynamic', 'Dynamic')], default='a_b_test', max_length=20, verbose_name='Variant Type')),
                ('traffic_allocation', models.DecimalField(decimal_places=2, default=50.0, max_digits=5, verbose_name='Traffic Allocation (%)')),
                ('is_control', models.BooleanField(default=False, verbose_name='Is Control')),
                ('is_active', models.BooleanField(default=True, verbose_name='Is Active')),
                ('start_date', models.DateTimeField(blank=True, null=True, verbose_name='Start Date')),
                ('end_date', models.DateTimeField(blank=True, null=True, verbose_name='End Date')),
                ('impressions', models.PositiveIntegerField(default=0, verbose_name='Impressions')),
                ('clicks', models.PositiveIntegerField(default=0, verbose_name='Clicks')),
                ('conversions', models.PositiveIntegerField(default=0, verbose_name='Conversions')),
                ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Created At')),
                ('updated_at', models.DateTimeField(auto_now=True, verbose_name='Updated At')),
                ('creative', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='variants', to='creatives.creative', verbose_name='Creative')),
                ('created_by', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='created_variants', to=settings.AUTH_USER_MODEL, verbose_name='Created By')),
            ],
            options={
                'verbose_name': 'Creative Variant',
                'verbose_name_plural': 'Creative Variants',
                'ordering': ['-created_at'],
                'unique_together': {('creative', 'variant_name')},
            },
        ),
        
        # Creative Performance Model
        migrations.CreateModel(
            name='CreativePerformance',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('date', models.DateField(verbose_name='Date')),
                ('impressions', models.PositiveIntegerField(default=0, verbose_name='Impressions')),
                ('clicks', models.PositiveIntegerField(default=0, verbose_name='Clicks')),
                ('conversions', models.PositiveIntegerField(default=0, verbose_name='Conversions')),
                ('cost', models.DecimalField(decimal_places=2, default=0, max_digits=10, verbose_name='Cost')),
                ('revenue', models.DecimalField(decimal_places=2, default=0, max_digits=10, verbose_name='Revenue')),
                ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Created At')),
                ('updated_at', models.DateTimeField(auto_now=True, verbose_name='Updated At')),
                ('creative', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='performance_data', to='creatives.creative', verbose_name='Creative')),
            ],
            options={
                'verbose_name': 'Creative Performance',
                'verbose_name_plural': 'Creative Performance',
                'ordering': ['-date'],
                'unique_together': {('creative', 'date')},
                'indexes': [
                    models.Index(fields=['date'], name='creatives_performance_date_idx'),
                    models.Index(fields=['creative', 'date'], name='creatives_performance_creative_date_idx'),
                ],
            },
        ),
        
        # Creative Compliance Model
        migrations.CreateModel(
            name='CreativeCompliance',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('compliance_status', models.CharField(choices=[('pending', 'Pending'), ('compliant', 'Compliant'), ('non_compliant', 'Non-Compliant'), ('review_required', 'Review Required')], default='pending', max_length=20, verbose_name='Compliance Status')),
                ('compliance_score', models.DecimalField(blank=True, decimal_places=2, max_digits=5, null=True, verbose_name='Compliance Score')),
                ('check_type', models.CharField(choices=[('automated', 'Automated'), ('manual', 'Manual'), ('hybrid', 'Hybrid')], default='automated', max_length=20, verbose_name='Check Type')),
                ('issues_found', models.JSONField(blank=True, default=list, verbose_name='Issues Found')),
                ('recommendations', models.JSONField(blank=True, default=list, verbose_name='Recommendations')),
                ('checked_at', models.DateTimeField(auto_now_add=True, verbose_name='Checked At')),
                ('expires_at', models.DateTimeField(blank=True, null=True, verbose_name='Expires At')),
                ('notes', models.TextField(blank=True, verbose_name='Notes')),
                ('checked_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='compliance_checks', to=settings.AUTH_USER_MODEL, verbose_name='Checked By')),
                ('creative', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='compliance_checks', to='creatives.creative', verbose_name='Creative')),
            ],
            options={
                'verbose_name': 'Creative Compliance',
                'verbose_name_plural': 'Creative Compliance',
                'ordering': ['-checked_at'],
            },
        ),
        
        # Creative Asset Model
        migrations.CreateModel(
            name='CreativeAsset',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('name', models.CharField(max_length=200, verbose_name='Asset Name')),
                ('asset_type', models.CharField(choices=[('image', 'Image'), ('video', 'Video'), ('audio', 'Audio'), ('document', 'Document'), ('font', 'Font'), ('other', 'Other')], max_length=20, verbose_name='Asset Type')),
                ('file', models.FileField(upload_to=creatives.models.asset_upload_path, verbose_name='File')),
                ('file_size', models.PositiveIntegerField(blank=True, null=True, verbose_name='File Size (bytes)')),
                ('mime_type', models.CharField(blank=True, max_length=100, verbose_name='MIME Type')),
                ('description', models.TextField(blank=True, verbose_name='Description')),
                ('is_primary', models.BooleanField(default=False, verbose_name='Is Primary Asset')),
                ('order', models.PositiveIntegerField(default=0, verbose_name='Order')),
                ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Created At')),
                ('updated_at', models.DateTimeField(auto_now=True, verbose_name='Updated At')),
                ('created_by', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='created_assets', to=settings.AUTH_USER_MODEL, verbose_name='Created By')),
                ('creative', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='assets', to='creatives.creative', verbose_name='Creative')),
            ],
            options={
                'verbose_name': 'Creative Asset',
                'verbose_name_plural': 'Creative Assets',
                'ordering': ['order', '-created_at'],
            },
        ),
        
        # Creative Approval Model
        migrations.CreateModel(
            name='CreativeApproval',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('approval_status', models.CharField(choices=[('pending', 'Pending'), ('approved', 'Approved'), ('rejected', 'Rejected'), ('changes_requested', 'Changes Requested')], default='pending', max_length=20, verbose_name='Approval Status')),
                ('priority', models.IntegerField(choices=[(1, 'Very High'), (2, 'High'), (3, 'Medium'), (4, 'Low'), (5, 'Very Low')], default=3, verbose_name='Priority')),
                ('comments', models.TextField(blank=True, verbose_name='Comments')),
                ('requested_changes', models.JSONField(blank=True, default=list, verbose_name='Requested Changes')),
                ('approved_at', models.DateTimeField(blank=True, null=True, verbose_name='Approved At')),
                ('expires_at', models.DateTimeField(blank=True, null=True, verbose_name='Expires At')),
                ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Created At')),
                ('updated_at', models.DateTimeField(auto_now=True, verbose_name='Updated At')),
                ('creative', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='approvals', to='creatives.creative', verbose_name='Creative')),
                ('reviewer', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='reviewed_creatives', to=settings.AUTH_USER_MODEL, verbose_name='Reviewer')),
                ('submitted_by', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='submitted_approvals', to=settings.AUTH_USER_MODEL, verbose_name='Submitted By')),
            ],
            options={
                'verbose_name': 'Creative Approval',
                'verbose_name_plural': 'Creative Approvals',
                'ordering': ['-created_at'],
                'indexes': [
                    models.Index(fields=['approval_status'], name='creatives_approval_status_idx'),
                    models.Index(fields=['created_at'], name='creatives_approval_created_idx'),
                ],
            },
        ),
        
        # Add constraints
        migrations.AddConstraint(
            model_name='creative',
            constraint=models.CheckConstraint(check=models.Q(('priority__gte', 1), ('priority__lte', 5)), name='creative_priority_range'),
        ),
        
        migrations.AddConstraint(
            model_name='creative',
            constraint=models.CheckConstraint(check=models.Q(('file_size__gte', 0)), name='creative_file_size_positive'),
        ),
        
        migrations.AddConstraint(
            model_name='creative',
            constraint=models.CheckConstraint(check=models.Q(('width__gte', 0)), name='creative_width_positive'),
        ),
        
        migrations.AddConstraint(
            model_name='creative',
            constraint=models.CheckConstraint(check=models.Q(('height__gte', 0)), name='creative_height_positive'),
        ),
        
        migrations.AddConstraint(
            model_name='creativevariant',
            constraint=models.CheckConstraint(check=models.Q(('traffic_allocation__gte', 0), ('traffic_allocation__lte', 100)), name='variant_traffic_allocation_range'),
        ),
        
        migrations.AddConstraint(
            model_name='creativeperformance',
            constraint=models.CheckConstraint(check=models.Q(('impressions__gte', 0)), name='performance_impressions_positive'),
        ),
        
        migrations.AddConstraint(
            model_name='creativeperformance',
            constraint=models.CheckConstraint(check=models.Q(('clicks__gte', 0)), name='performance_clicks_positive'),
        ),
        
        migrations.AddConstraint(
            model_name='creativeperformance',
            constraint=models.CheckConstraint(check=models.Q(('conversions__gte', 0)), name='performance_conversions_positive'),
        ),
        
        migrations.AddConstraint(
            model_name='creativeperformance',
            constraint=models.CheckConstraint(check=models.Q(('cost__gte', 0)), name='performance_cost_positive'),
        ),
        
        migrations.AddConstraint(
            model_name='creativeperformance',
            constraint=models.CheckConstraint(check=models.Q(('revenue__gte', 0)), name='performance_revenue_positive'),
        ),
        
        migrations.AddConstraint(
            model_name='creativecompliance',
            constraint=models.CheckConstraint(check=models.Q(('compliance_score__gte', 0), ('compliance_score__lte', 100)), name='compliance_score_range'),
        ),
        
        migrations.AddConstraint(
            model_name='creativeasset',
            constraint=models.CheckConstraint(check=models.Q(('file_size__gte', 0)), name='asset_file_size_positive'),
        ),
        
        migrations.AddConstraint(
            model_name='creativeasset',
            constraint=models.CheckConstraint(check=models.Q(('order__gte', 0)), name='asset_order_positive'),
        ),
        
        migrations.AddConstraint(
            model_name='creativeapproval',
            constraint=models.CheckConstraint(check=models.Q(('priority__gte', 1), ('priority__lte', 5)), name='approval_priority_range'),
        ),
        
        migrations.AddConstraint(
            model_name='creativeformat',
            constraint=models.CheckConstraint(check=models.Q(('max_file_size__gte', 0)), name='format_max_file_size_positive'),
        ),
        
        migrations.AddConstraint(
            model_name='creativetemplate',
            constraint=models.CheckConstraint(check=models.Q(('width__gte', 0)), name='template_width_positive'),
        ),
        
        migrations.AddConstraint(
            model_name='creativetemplate',
            constraint=models.CheckConstraint(check=models.Q(('height__gte', 0)), name='template_height_positive'),
        ),
        
        migrations.AddConstraint(
            model_name='creativetemplate',
            constraint=models.CheckConstraint(check=models.Q(('usage_count__gte', 0)), name='template_usage_count_positive'),
        ),
    ]