# Generated by Django 6.1 on 2026-08-27 18:38

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


class Migration(migrations.Migration):

    initial = True

    dependencies = [
        ('domains', '0006_manual_reserve_up_to_1000'),
    ]

    operations = [
        migrations.CreateModel(
            name='SyncState',
            fields=[
                ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
                ('created_at', models.DateTimeField(auto_now_add=True)),
                ('updated_at', models.DateTimeField(auto_now=True)),
                ('status', models.CharField(choices=[('READY', 'Ready'), ('SYNCING', 'Syncing'), ('ACTION_REQUIRED', 'Action required'), ('NO_DATA', 'No data'), ('ERROR', 'Error')], default='NO_DATA', max_length=20)),
                ('last_closed_date', models.DateField(blank=True, null=True)),
                ('coverage_start', models.DateField(blank=True, null=True)),
                ('last_sync_at', models.DateTimeField(blank=True, null=True)),
                ('last_error_code', models.CharField(blank=True, default='', max_length=40)),
                ('domain', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='seo_state', to='domains.domain')),
            ],
            options={
                'abstract': False,
            },
        ),
        migrations.CreateModel(
            name='KeywordDaily',
            fields=[
                ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
                ('created_at', models.DateTimeField(auto_now_add=True)),
                ('updated_at', models.DateTimeField(auto_now=True)),
                ('date', models.DateField()),
                ('query', models.CharField(max_length=500)),
                ('clicks', models.PositiveIntegerField(default=0)),
                ('impressions', models.PositiveIntegerField(default=0)),
                ('ctr', models.FloatField(default=0.0)),
                ('position', models.FloatField(default=0.0)),
                ('domain', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='seo_keywords', to='domains.domain')),
            ],
            options={
                'ordering': ['-date', '-impressions'],
                'indexes': [models.Index(fields=['domain', 'date'], name='seo_keyword_domain__20faff_idx')],
                'constraints': [models.UniqueConstraint(fields=('domain', 'date', 'query'), name='one_keyword_row_per_day')],
            },
        ),
        migrations.CreateModel(
            name='KeywordPageDaily',
            fields=[
                ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
                ('created_at', models.DateTimeField(auto_now_add=True)),
                ('updated_at', models.DateTimeField(auto_now=True)),
                ('date', models.DateField()),
                ('query', models.CharField(max_length=500)),
                ('page', models.URLField(max_length=2000)),
                ('clicks', models.PositiveIntegerField(default=0)),
                ('impressions', models.PositiveIntegerField(default=0)),
                ('ctr', models.FloatField(default=0.0)),
                ('position', models.FloatField(default=0.0)),
                ('domain', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='seo_keyword_pages', to='domains.domain')),
            ],
            options={
                'ordering': ['-date', '-impressions'],
                'indexes': [models.Index(fields=['domain', 'date'], name='seo_keyword_domain__f83447_idx'), models.Index(fields=['domain', 'page'], name='seo_keyword_domain__f185f7_idx')],
                'constraints': [models.UniqueConstraint(fields=('domain', 'date', 'query', 'page'), name='one_keyword_page_row_per_day')],
            },
        ),
        migrations.CreateModel(
            name='SyncRun',
            fields=[
                ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
                ('created_at', models.DateTimeField(auto_now_add=True)),
                ('updated_at', models.DateTimeField(auto_now=True)),
                ('kind', models.CharField(choices=[('BACKFILL', 'Historical backfill'), ('DAILY_SYNC', 'Daily sync')], max_length=20)),
                ('origin', models.CharField(choices=[('MANUAL', 'Manual'), ('SCHEDULED', 'Scheduled')], max_length=20)),
                ('state', models.CharField(choices=[('QUEUED', 'Queued'), ('RUNNING', 'Running'), ('DONE', 'Done'), ('FAILED', 'Failed')], default='QUEUED', max_length=20)),
                ('requested_start', models.DateField()),
                ('requested_end', models.DateField()),
                ('total_items', models.PositiveIntegerField(default=0)),
                ('processed_items', models.PositiveIntegerField(default=0)),
                ('failed_items', models.PositiveIntegerField(default=0)),
                ('started_at', models.DateTimeField(blank=True, null=True)),
                ('finished_at', models.DateTimeField(blank=True, null=True)),
                ('summary', models.JSONField(blank=True, default=dict)),
                ('error_code', models.CharField(blank=True, default='', max_length=40)),
                ('domain', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='seo_runs', to='domains.domain')),
            ],
            options={
                'ordering': ['-created_at'],
                'indexes': [models.Index(fields=['domain', '-created_at'], name='seo_syncrun_domain__0c9326_idx')],
            },
        ),
        migrations.CreateModel(
            name='TrackedKeyword',
            fields=[
                ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
                ('created_at', models.DateTimeField(auto_now_add=True)),
                ('updated_at', models.DateTimeField(auto_now=True)),
                ('keyword', models.CharField(max_length=500)),
                ('source', models.CharField(choices=[('GOOGLE_DISCOVERED', 'Discovered by Google'), ('CUSTOM', 'Added by hand')], default='CUSTOM', max_length=20)),
                ('domain', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='seo_tracked', to='domains.domain')),
            ],
            options={
                'ordering': ['keyword'],
                'constraints': [models.UniqueConstraint(fields=('domain', 'keyword'), name='one_tracked_keyword_per_domain')],
            },
        ),
    ]
