# Generated by Django 5.2.17 on 2026-09-30 17:33

import django.db.models.deletion
import django.utils.timezone
import uuid
from django.conf import settings
from django.db import migrations, models


class Migration(migrations.Migration):

    initial = True

    dependencies = [
        ('customers', '0002_customeraddress_customercontact'),
        ('organization', '0002_userorganizationassignment'),
        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
    ]

    operations = [
        migrations.CreateModel(
            name='NotificationTemplate',
            fields=[
                ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
                ('created_at', models.DateTimeField(default=django.utils.timezone.now, editable=False)),
                ('code', models.SlugField(max_length=64)),
                ('name', models.CharField(max_length=150)),
                ('channel', models.CharField(choices=[('SMS', 'SMS'), ('EMAIL', 'Email')], max_length=10)),
                ('subject', models.CharField(blank=True, max_length=200)),
                ('body', models.TextField(max_length=4000)),
                ('is_active', models.BooleanField(default=True)),
                ('updated_at', models.DateTimeField(default=django.utils.timezone.now)),
                ('company', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='organization.company')),
                ('updated_by', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL)),
            ],
            options={
                'ordering': ['created_at', 'pk'],
                'permissions': [('manage_templates', 'Manage company notification templates')],
                'abstract': False,
                'default_permissions': (),
            },
        ),
        migrations.CreateModel(
            name='Notification',
            fields=[
                ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
                ('created_at', models.DateTimeField(default=django.utils.timezone.now, editable=False)),
                ('template_code', models.CharField(max_length=64)),
                ('channel', models.CharField(choices=[('SMS', 'SMS'), ('EMAIL', 'Email')], max_length=10)),
                ('destination', models.CharField(max_length=254)),
                ('subject', models.CharField(blank=True, max_length=200)),
                ('body', models.TextField(max_length=4000)),
                ('event', models.CharField(max_length=40)),
                ('related_id', models.UUIDField(blank=True, null=True)),
                ('related_reference', models.CharField(blank=True, max_length=150)),
                ('idempotency_key', models.CharField(max_length=64)),
                ('status', models.CharField(choices=[('PENDING', 'Pending'), ('SENDING', 'Sending'), ('SENT', 'Sent'), ('FAILED', 'Failed'), ('UNKNOWN', 'Unknown'), ('CANCELLED', 'Cancelled')], default='PENDING', max_length=10)),
                ('sent_at', models.DateTimeField(blank=True, null=True)),
                ('cancelled_at', models.DateTimeField(blank=True, null=True)),
                ('cancelled_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='+', to=settings.AUTH_USER_MODEL)),
                ('company', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='organization.company')),
                ('customer', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='customers.customer')),
                ('requested_by', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='+', to=settings.AUTH_USER_MODEL)),
                ('service_center', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='organization.servicecenter')),
                ('template', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='communications.notificationtemplate')),
            ],
            options={
                'ordering': ['created_at', 'pk'],
                'permissions': [('view_notification', 'View communication history'), ('send_notification', 'Request, send, retry or cancel notifications')],
                'abstract': False,
                'default_permissions': (),
            },
        ),
        migrations.CreateModel(
            name='NotificationAttempt',
            fields=[
                ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
                ('created_at', models.DateTimeField(default=django.utils.timezone.now, editable=False)),
                ('number', models.PositiveIntegerField()),
                ('provider', models.CharField(max_length=64)),
                ('provider_reference', models.CharField(blank=True, max_length=128)),
                ('finished_at', models.DateTimeField(blank=True, null=True)),
                ('result', models.CharField(choices=[('STARTED', 'Started'), ('ACCEPTED', 'Accepted'), ('REJECTED', 'Rejected'), ('UNKNOWN', 'Unknown')], default='STARTED', max_length=10)),
                ('error_code', models.CharField(blank=True, max_length=40)),
                ('actor', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL)),
                ('notification', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='attempts', to='communications.notification')),
            ],
            options={
                'ordering': ['created_at', 'pk'],
                'abstract': False,
                'default_permissions': (),
                'constraints': [models.UniqueConstraint(fields=('notification', 'number'), name='communication_attempt_unique'), models.CheckConstraint(condition=models.Q(('number__gte', 1)), name='communication_attempt_positive'), models.CheckConstraint(condition=models.Q(models.Q(('finished_at', None), ('result', 'STARTED')), models.Q(('finished_at__isnull', False), ('result__in', ['ACCEPTED', 'REJECTED', 'UNKNOWN'])), _connector='OR'), name='communication_attempt_result')],
            },
        ),
        migrations.AddConstraint(
            model_name='notificationtemplate',
            constraint=models.UniqueConstraint(fields=('company', 'code', 'channel'), name='communication_template_unique'),
        ),
        migrations.AddConstraint(
            model_name='notificationtemplate',
            constraint=models.CheckConstraint(condition=models.Q(('channel__in', ['SMS', 'EMAIL'])), name='communication_template_channel'),
        ),
        migrations.AddConstraint(
            model_name='notification',
            constraint=models.UniqueConstraint(fields=('company', 'idempotency_key'), name='communication_event_unique'),
        ),
        migrations.AddConstraint(
            model_name='notification',
            constraint=models.CheckConstraint(condition=models.Q(('channel__in', ['SMS', 'EMAIL'])), name='communication_channel_valid'),
        ),
        migrations.AddConstraint(
            model_name='notification',
            constraint=models.CheckConstraint(condition=models.Q(models.Q(('cancelled_at', None), ('cancelled_by', None), ('sent_at__isnull', False), ('status', 'SENT')), models.Q(('cancelled_at__isnull', False), ('cancelled_by__isnull', False), ('sent_at', None), ('status', 'CANCELLED')), models.Q(('cancelled_at', None), ('cancelled_by', None), ('sent_at', None), ('status__in', ['PENDING', 'SENDING', 'FAILED', 'UNKNOWN'])), _connector='OR'), name='communication_status_valid'),
        ),
    ]
