# -*- coding: utf-8 -*-
# Generated by Django 4.2.0

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


class Migration(migrations.Migration):
    """
    Initial migration for the Advertisers application.
    
    This migration creates all the necessary tables for managing
    advertisers, agencies, brands, contacts, and billing information.
    """
    
    initial = True
    
    dependencies = [
        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
    ]
    
    operations = [
        # Create BrandCategory table
        migrations.CreateModel(
            name='BrandCategory',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('name', models.CharField(help_text='Category name (e.g., Technology, Fashion)', max_length=100, verbose_name='Name')),
                ('description', models.TextField(blank=True, help_text='Detailed description of the category', verbose_name='Description')),
                ('order', models.PositiveIntegerField(default=0, help_text='Display order (lower numbers appear first)', verbose_name='Display Order')),
                ('is_active', models.BooleanField(default=True, help_text='Whether this category is active', verbose_name='Active')),
                ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Created At')),
                ('updated_at', models.DateTimeField(auto_now=True, verbose_name='Updated At')),
                ('parent', models.ForeignKey(blank=True, help_text='Parent category for hierarchical organization', null=True, on_delete=django.db.models.deletion.CASCADE, related_name='children', to='advertisers.brandcategory', verbose_name='Parent Category')),
            ],
            options={
                'verbose_name': 'Brand Category',
                'verbose_name_plural': 'Brand Categories',
                'db_table': 'advertisers_brand_category',
                'ordering': ['order', 'name'],
                'indexes': [
                    models.Index(fields=['name'], name='advertisers_brand_category_name_idx'),
                    models.Index(fields=['parent'], name='advertisers_brand_category_parent_idx'),
                    models.Index(fields=['is_active'], name='advertisers_brand_category_active_idx'),
                    models.Index(fields=['order'], name='advertisers_brand_category_order_idx'),
                ],
            },
        ),
        
        # Create Agency table
        migrations.CreateModel(
            name='Agency',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('name', models.CharField(help_text='Agency name', max_length=200, verbose_name='Agency Name')),
                ('code', models.CharField(help_text='Unique agency code (e.g., AGY001)', max_length=20, unique=True, verbose_name='Agency Code')),
                ('description', models.TextField(blank=True, help_text='Agency description and services', verbose_name='Description')),
                ('email', models.EmailField(help_text='Primary contact email', max_length=254, verbose_name='Email')),
                ('phone', models.CharField(blank=True, help_text='Primary contact phone number', max_length=20, verbose_name='Phone')),
                ('website', models.URLField(blank=True, help_text='Agency website URL', verbose_name='Website')),
                ('address', models.TextField(blank=True, help_text='Physical address', verbose_name='Address')),
                ('city', models.CharField(blank=True, help_text='City', max_length=100, verbose_name='City')),
                ('state', models.CharField(blank=True, help_text='State/Province', max_length=100, verbose_name='State/Province')),
                ('country', models.CharField(blank=True, help_text='Country', max_length=100, verbose_name='Country')),
                ('postal_code', models.CharField(blank=True, help_text='Postal/ZIP code', max_length=20, verbose_name='Postal Code')),
                ('commission_rate', models.DecimalField(blank=True, decimal_places=2, help_text='Commission rate percentage (0-100)', max_digits=5, null=True, verbose_name='Commission Rate (%)')),
                ('is_active', models.BooleanField(default=True, help_text='Whether this agency is active', verbose_name='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': 'Agency',
                'verbose_name_plural': 'Agencies',
                'db_table': 'advertisers_agency',
                'ordering': ['name'],
                'indexes': [
                    models.Index(fields=['name'], name='advertisers_agency_name_idx'),
                    models.Index(fields=['code'], name='advertisers_agency_code_idx'),
                    models.Index(fields=['email'], name='advertisers_agency_email_idx'),
                    models.Index(fields=['is_active'], name='advertisers_agency_active_idx'),
                    models.Index(fields=['city'], name='advertisers_agency_city_idx'),
                    models.Index(fields=['country'], name='advertisers_agency_country_idx'),
                ],
            },
        ),
        
        # Create Advertiser table
        migrations.CreateModel(
            name='Advertiser',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('name', models.CharField(help_text='Advertiser name', max_length=200, verbose_name='Advertiser Name')),
                ('code', models.CharField(help_text='Unique advertiser code (e.g., ADV001)', max_length=20, unique=True, verbose_name='Advertiser Code')),
                ('advertiser_type', models.CharField(choices=[('individual', 'Individual'), ('company', 'Company'), ('agency_managed', 'Agency Managed')], default='individual', help_text='Type of advertiser', max_length=20, verbose_name='Advertiser Type')),
                ('description', models.TextField(blank=True, help_text='Advertiser description', verbose_name='Description')),
                ('email', models.EmailField(help_text='Primary contact email', max_length=254, verbose_name='Email')),
                ('phone', models.CharField(blank=True, help_text='Primary contact phone number', max_length=20, verbose_name='Phone')),
                ('website', models.URLField(blank=True, help_text='Advertiser website URL', verbose_name='Website')),
                ('industry', models.CharField(blank=True, help_text='Industry sector (e.g., Technology, Healthcare)', max_length=100, verbose_name='Industry')),
                ('address', models.TextField(blank=True, help_text='Physical address', verbose_name='Address')),
                ('city', models.CharField(blank=True, help_text='City', max_length=100, verbose_name='City')),
                ('state', models.CharField(blank=True, help_text='State/Province', max_length=100, verbose_name='State/Province')),
                ('country', models.CharField(blank=True, help_text='Country', max_length=100, verbose_name='Country')),
                ('postal_code', models.CharField(blank=True, help_text='Postal/ZIP code', max_length=20, verbose_name='Postal Code')),
                ('credit_limit', models.DecimalField(blank=True, decimal_places=2, help_text='Credit limit for campaigns', max_digits=12, null=True, verbose_name='Credit Limit')),
                ('is_active', models.BooleanField(default=True, help_text='Whether this advertiser is active', verbose_name='Active')),
                ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Created At')),
                ('updated_at', models.DateTimeField(auto_now=True, verbose_name='Updated At')),
                ('agency', models.ForeignKey(blank=True, help_text='Managing agency (for agency-managed advertisers)', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='advertisers', to='advertisers.agency', verbose_name='Agency')),
            ],
            options={
                'verbose_name': 'Advertiser',
                'verbose_name_plural': 'Advertisers',
                'db_table': 'advertisers_advertiser',
                'ordering': ['name'],
                'indexes': [
                    models.Index(fields=['name'], name='advertisers_advertiser_name_idx'),
                    models.Index(fields=['code'], name='advertisers_advertiser_code_idx'),
                    models.Index(fields=['email'], name='advertisers_advertiser_email_idx'),
                    models.Index(fields=['advertiser_type'], name='advertisers_advertiser_type_idx'),
                    models.Index(fields=['industry'], name='advertisers_advertiser_industry_idx'),
                    models.Index(fields=['is_active'], name='advertisers_advertiser_active_idx'),
                    models.Index(fields=['agency'], name='advertisers_advertiser_agency_idx'),
                    models.Index(fields=['city'], name='advertisers_advertiser_city_idx'),
                    models.Index(fields=['country'], name='advertisers_advertiser_country_idx'),
                ],
            },
        ),
        
        # Create Brand table
        migrations.CreateModel(
            name='Brand',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('name', models.CharField(help_text='Brand name', max_length=200, verbose_name='Brand Name')),
                ('code', models.CharField(help_text='Unique brand code (e.g., BRD001)', max_length=20, unique=True, verbose_name='Brand Code')),
                ('description', models.TextField(blank=True, help_text='Brand description', verbose_name='Description')),
                ('website', models.URLField(blank=True, help_text='Brand website URL', verbose_name='Website')),
                ('logo', models.ImageField(blank=True, help_text='Brand logo image', null=True, upload_to='brands/logos/', verbose_name='Logo')),
                ('primary_color', models.CharField(blank=True, help_text='Primary brand color (hex code)', max_length=7, verbose_name='Primary Color')),
                ('secondary_color', models.CharField(blank=True, help_text='Secondary brand color (hex code)', max_length=7, verbose_name='Secondary Color')),
                ('is_active', models.BooleanField(default=True, help_text='Whether this brand is active', verbose_name='Active')),
                ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Created At')),
                ('updated_at', models.DateTimeField(auto_now=True, verbose_name='Updated At')),
                ('advertiser', models.ForeignKey(help_text='Brand owner', on_delete=django.db.models.deletion.CASCADE, related_name='brands', to='advertisers.advertiser', verbose_name='Advertiser')),
                ('category', models.ForeignKey(blank=True, help_text='Brand category', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='brands', to='advertisers.brandcategory', verbose_name='Category')),
            ],
            options={
                'verbose_name': 'Brand',
                'verbose_name_plural': 'Brands',
                'db_table': 'advertisers_brand',
                'ordering': ['name'],
                'indexes': [
                    models.Index(fields=['name'], name='advertisers_brand_name_idx'),
                    models.Index(fields=['code'], name='advertisers_brand_code_idx'),
                    models.Index(fields=['advertiser'], name='advertisers_brand_advertiser_idx'),
                    models.Index(fields=['category'], name='advertisers_brand_category_idx'),
                    models.Index(fields=['is_active'], name='advertisers_brand_active_idx'),
                ],
            },
        ),
        
        # Create AdvertiserContact table
        migrations.CreateModel(
            name='AdvertiserContact',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('first_name', models.CharField(help_text='Contact first name', max_length=100, verbose_name='First Name')),
                ('last_name', models.CharField(help_text='Contact last name', max_length=100, verbose_name='Last Name')),
                ('email', models.EmailField(help_text='Contact email address', max_length=254, verbose_name='Email')),
                ('phone', models.CharField(blank=True, help_text='Contact phone number', max_length=20, verbose_name='Phone')),
                ('title', models.CharField(blank=True, help_text='Job title or position', max_length=100, verbose_name='Title')),
                ('contact_type', models.CharField(choices=[('primary', 'Primary Contact'), ('secondary', 'Secondary Contact'), ('billing', 'Billing Contact'), ('technical', 'Technical Contact'), ('marketing', 'Marketing Contact')], default='primary', help_text='Type of contact', max_length=20, verbose_name='Contact Type')),
                ('notes', models.TextField(blank=True, help_text='Additional notes about this contact', verbose_name='Notes')),
                ('is_active', models.BooleanField(default=True, help_text='Whether this contact is active', verbose_name='Active')),
                ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Created At')),
                ('updated_at', models.DateTimeField(auto_now=True, verbose_name='Updated At')),
                ('advertiser', models.ForeignKey(help_text='Associated advertiser', on_delete=django.db.models.deletion.CASCADE, related_name='contacts', to='advertisers.advertiser', verbose_name='Advertiser')),
            ],
            options={
                'verbose_name': 'Advertiser Contact',
                'verbose_name_plural': 'Advertiser Contacts',
                'db_table': 'advertisers_contact',
                'ordering': ['last_name', 'first_name'],
                'indexes': [
                    models.Index(fields=['email'], name='advertisers_contact_email_idx'),
                    models.Index(fields=['advertiser'], name='advertisers_contact_advertiser_idx'),
                    models.Index(fields=['contact_type'], name='advertisers_contact_type_idx'),
                    models.Index(fields=['is_active'], name='advertisers_contact_active_idx'),
                    models.Index(fields=['last_name'], name='advertisers_contact_lastname_idx'),
                ],
            },
        ),
        
        # Create AgencyUser table
        migrations.CreateModel(
            name='AgencyUser',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('role', models.CharField(choices=[('admin', 'Administrator'), ('account_manager', 'Account Manager'), ('campaign_manager', 'Campaign Manager'), ('analyst', 'Analyst'), ('viewer', 'Viewer')], default='viewer', help_text='User role within the agency', max_length=20, verbose_name='Role')),
                ('can_create_campaigns', models.BooleanField(default=False, help_text='Permission to create campaigns', verbose_name='Can Create Campaigns')),
                ('can_manage_advertisers', models.BooleanField(default=False, help_text='Permission to manage advertisers', verbose_name='Can Manage Advertisers')),
                ('can_view_reports', models.BooleanField(default=True, help_text='Permission to view reports', verbose_name='Can View Reports')),
                ('can_manage_billing', models.BooleanField(default=False, help_text='Permission to manage billing', verbose_name='Can Manage Billing')),
                ('joined_at', models.DateTimeField(default=django.utils.timezone.now, help_text='When the user joined the agency', verbose_name='Joined At')),
                ('is_active', models.BooleanField(default=True, help_text='Whether this user is active', verbose_name='Active')),
                ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Created At')),
                ('updated_at', models.DateTimeField(auto_now=True, verbose_name='Updated At')),
                ('agency', models.ForeignKey(help_text='Associated agency', on_delete=django.db.models.deletion.CASCADE, related_name='users', to='advertisers.agency', verbose_name='Agency')),
                ('user', models.ForeignKey(help_text='Django user account', on_delete=django.db.models.deletion.CASCADE, related_name='agency_memberships', to=settings.AUTH_USER_MODEL, verbose_name='User')),
            ],
            options={
                'verbose_name': 'Agency User',
                'verbose_name_plural': 'Agency Users',
                'db_table': 'advertisers_agency_user',
                'ordering': ['agency__name', 'user__last_name', 'user__first_name'],
                'indexes': [
                    models.Index(fields=['user'], name='advertisers_agency_user_user_idx'),
                    models.Index(fields=['agency'], name='advertisers_agency_user_agency_idx'),
                    models.Index(fields=['role'], name='advertisers_agency_user_role_idx'),
                    models.Index(fields=['is_active'], name='advertisers_agency_user_active_idx'),
                    models.Index(fields=['joined_at'], name='advertisers_agency_user_joined_idx'),
                ],
            },
        ),
        
        # Create AdvertiserBilling table
        migrations.CreateModel(
            name='AdvertiserBilling',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('billing_name', models.CharField(help_text='Name for billing purposes', max_length=200, verbose_name='Billing Name')),
                ('tax_id', models.CharField(blank=True, help_text='Tax identification number', max_length=50, verbose_name='Tax ID')),
                ('billing_address', models.TextField(blank=True, help_text='Billing address', verbose_name='Billing Address')),
                ('billing_city', models.CharField(blank=True, help_text='Billing city', max_length=100, verbose_name='Billing City')),
                ('billing_state', models.CharField(blank=True, help_text='Billing state/province', max_length=100, verbose_name='Billing State')),
                ('billing_country', models.CharField(blank=True, help_text='Billing country', max_length=100, verbose_name='Billing Country')),
                ('billing_postal_code', models.CharField(blank=True, help_text='Billing postal code', max_length=20, verbose_name='Billing Postal Code')),
                ('payment_method', models.CharField(choices=[('credit_card', 'Credit Card'), ('bank_transfer', 'Bank Transfer'), ('check', 'Check'), ('paypal', 'PayPal'), ('other', 'Other')], default='credit_card', help_text='Preferred payment method', max_length=20, verbose_name='Payment Method')),
                ('billing_cycle', models.CharField(choices=[('weekly', 'Weekly'), ('monthly', 'Monthly'), ('quarterly', 'Quarterly'), ('annually', 'Annually')], default='monthly', help_text='Billing cycle frequency', max_length=20, verbose_name='Billing Cycle')),
                ('credit_limit', models.DecimalField(decimal_places=2, default=Decimal('10000.00'), help_text='Maximum credit limit', max_digits=12, verbose_name='Credit Limit')),
                ('current_balance', models.DecimalField(decimal_places=2, default=Decimal('0.00'), help_text='Current outstanding balance', max_digits=12, verbose_name='Current Balance')),
                ('payment_terms', models.CharField(blank=True, help_text='Payment terms (e.g., Net 30)', max_length=50, verbose_name='Payment Terms')),
                ('notes', models.TextField(blank=True, help_text='Additional billing notes', verbose_name='Notes')),
                ('is_active', models.BooleanField(default=True, help_text='Whether billing is active', verbose_name='Active')),
                ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Created At')),
                ('updated_at', models.DateTimeField(auto_now=True, verbose_name='Updated At')),
                ('advertiser', models.OneToOneField(help_text='Associated advertiser', on_delete=django.db.models.deletion.CASCADE, related_name='billing', to='advertisers.advertiser', verbose_name='Advertiser')),
            ],
            options={
                'verbose_name': 'Advertiser Billing',
                'verbose_name_plural': 'Advertiser Billing',
                'db_table': 'advertisers_billing',
                'ordering': ['advertiser__name'],
                'indexes': [
                    models.Index(fields=['advertiser'], name='advertisers_billing_advertiser_idx'),
                    models.Index(fields=['payment_method'], name='advertisers_billing_payment_idx'),
                    models.Index(fields=['billing_cycle'], name='advertisers_billing_cycle_idx'),
                    models.Index(fields=['credit_limit'], name='advertisers_billing_credit_idx'),
                    models.Index(fields=['current_balance'], name='advertisers_billing_balance_idx'),
                    models.Index(fields=['is_active'], name='advertisers_billing_active_idx'),
                ],
            },
        ),
        
        # Add unique constraints
        migrations.AddConstraint(
            model_name='brandcategory',
            constraint=models.UniqueConstraint(fields=['name', 'parent'], name='unique_category_name_per_parent'),
        ),
        
        migrations.AddConstraint(
            model_name='brand',
            constraint=models.UniqueConstraint(fields=['name', 'advertiser'], name='unique_brand_name_per_advertiser'),
        ),
        
        migrations.AddConstraint(
            model_name='advertisercontact',
            constraint=models.UniqueConstraint(fields=['email', 'advertiser'], name='unique_contact_email_per_advertiser'),
        ),
        
        migrations.AddConstraint(
            model_name='agencyuser',
            constraint=models.UniqueConstraint(fields=['user', 'agency'], name='unique_user_per_agency'),
        ),
        
        # Add check constraints
        migrations.AddConstraint(
            model_name='agency',
            constraint=models.CheckConstraint(
                check=models.Q(commission_rate__gte=0, commission_rate__lte=100),
                name='valid_commission_rate'
            ),
        ),
        
        migrations.AddConstraint(
            model_name='advertiser',
            constraint=models.CheckConstraint(
                check=models.Q(
                    models.Q(advertiser_type='agency_managed', agency__isnull=False) |
                    models.Q(advertiser_type__in=['individual', 'company'])
                ),
                name='agency_managed_has_agency'
            ),
        ),
        
        migrations.AddConstraint(
            model_name='advertiserbilling',
            constraint=models.CheckConstraint(
                check=models.Q(credit_limit__gte=0),
                name='positive_credit_limit'
            ),
        ),
    ]