# Generated by Django 5.2.17 on 2026-10-04 20:35

import django.db.models.functions.text
import users.managers
import uuid
from django.db import migrations, models


def normalize_existing_emails(apps, schema_editor):
    User = apps.get_model('users', 'User')
    rows = list(User.objects.using(schema_editor.connection.alias).values_list('pk', 'email'))
    seen = set()
    for pk, email in rows:
        canonical = (email or '').strip().lower()
        if not canonical or canonical in seen:
            raise RuntimeError(
                'Resolve empty or case-insensitive duplicate user emails before migration; no accounts were merged.'
            )
        seen.add(canonical)
    for pk, email in rows:
        User.objects.using(schema_editor.connection.alias).filter(pk=pk).update(
            email=email.strip().lower(), auth_version=uuid.uuid4()
        )


class Migration(migrations.Migration):

    dependencies = [
        ('auth', '0012_alter_user_first_name_max_length'),
        ('users', '0001_initial'),
    ]

    operations = [
        migrations.CreateModel(
            name='AccountEmail',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('recipient', models.EmailField(max_length=254)),
                ('subject', models.CharField(max_length=150)),
                ('body', models.TextField()),
                ('created_at', models.DateTimeField(auto_now_add=True)),
                ('expires_at', models.DateTimeField()),
                ('sent_at', models.DateTimeField(blank=True, null=True)),
                ('attempts', models.PositiveSmallIntegerField(default=0)),
                ('next_attempt_at', models.DateTimeField()),
            ],
        ),
        migrations.AlterModelOptions(
            name='user',
            options={},
        ),
        migrations.AlterModelManagers(
            name='user',
            managers=[
                ('objects', users.managers.UserManager()),
            ],
        ),
        migrations.AddField(
            model_name='user',
            name='auth_version',
            field=models.UUIDField(default=uuid.uuid4, editable=False),
        ),
        migrations.AddField(
            model_name='user',
            name='display_name',
            field=models.CharField(blank=True, max_length=80),
        ),
        migrations.AddField(
            model_name='user',
            name='is_email_verified',
            field=models.BooleanField(default=False, editable=False),
        ),
        migrations.AddField(
            model_name='user',
            name='language',
            field=models.CharField(choices=[('fa', 'فارسی'), ('en', 'English')], default='fa', max_length=5),
        ),
        migrations.AddField(
            model_name='user',
            name='timezone',
            field=models.CharField(default='Asia/Tehran', max_length=64),
        ),
        migrations.AddField(
            model_name='user',
            name='updated_at',
            field=models.DateTimeField(auto_now=True),
        ),
        migrations.RunPython(normalize_existing_emails, migrations.RunPython.noop),
        migrations.AddConstraint(
            model_name='user',
            constraint=models.UniqueConstraint(django.db.models.functions.text.Lower('email'), name='users_email_ci_unique'),
        ),
        migrations.AddIndex(
            model_name='accountemail',
            index=models.Index(fields=['sent_at', 'next_attempt_at'], name='users_email_pending_idx'),
        ),
    ]
