# Generated by Django 5.2.4 on 2025-08-05 00:19

import django.core.validators
import django.db.models.deletion
import uuid
from django.conf import settings
from django.db import migrations, models


class Migration(migrations.Migration):

    initial = True

    dependencies = [
        ('contenttypes', '0002_remove_content_type_name'),
        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
    ]

    operations = [
        migrations.CreateModel(
            name='ActivityCategory',
            fields=[
                ('created_at', models.DateTimeField(auto_now_add=True, help_text='Timestamp when this object was created', verbose_name='Created At')),
                ('updated_at', models.DateTimeField(auto_now=True, help_text='Timestamp when this object was last modified', verbose_name='Updated At')),
                ('id', models.UUIDField(default=uuid.uuid4, editable=False, help_text='Unique identifier for this object', primary_key=True, serialize=False)),
                ('is_deleted', models.BooleanField(default=False, help_text='Whether this object has been soft-deleted', verbose_name='Is Deleted')),
                ('deleted_at', models.DateTimeField(blank=True, help_text='Timestamp when this object was soft-deleted', null=True, verbose_name='Deleted At')),
                ('name', models.CharField(help_text='Human-readable name of the activity category', max_length=100, unique=True, verbose_name='Category Name')),
                ('code', models.CharField(help_text="Unique code for programmatic access (e.g., 'auth', 'content')", max_length=50, unique=True, validators=[django.core.validators.RegexValidator('^[a-z_]+$', 'Code must be lowercase with underscores only')], verbose_name='Category Code')),
                ('description', models.TextField(blank=True, help_text='Detailed description of what activities belong to this category', verbose_name='Description')),
                ('color', models.CharField(default='#007bff', help_text="Hex color code for UI representation (e.g., '#007bff')", max_length=7, validators=[django.core.validators.RegexValidator('^#[0-9A-Fa-f]{6}$', 'Color must be a valid hex code')], verbose_name='Color')),
                ('icon', models.CharField(default='fas fa-activity', help_text="CSS icon class for UI representation (e.g., 'fas fa-user')", max_length=50, verbose_name='Icon')),
                ('is_system', models.BooleanField(default=False, help_text='Whether this is a system-defined category that cannot be deleted', verbose_name='Is System Category')),
                ('is_active', models.BooleanField(default=True, help_text='Whether this category is currently active', verbose_name='Is Active')),
                ('retention_days', models.PositiveIntegerField(default=365, help_text='Number of days to retain activities in this category (0 = forever)', verbose_name='Retention Days')),
                ('deleted_by', models.ForeignKey(blank=True, help_text='User who soft-deleted this object', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='%(class)s_deleted', to=settings.AUTH_USER_MODEL, verbose_name='Deleted By')),
                ('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='activities.activitycategory', verbose_name='Parent Category')),
            ],
            options={
                'verbose_name': 'Activity Category',
                'verbose_name_plural': 'Activity Categories',
                'db_table': 'activities_categories',
                'ordering': ['name'],
            },
        ),
        migrations.CreateModel(
            name='Activity',
            fields=[
                ('created_at', models.DateTimeField(auto_now_add=True, help_text='Timestamp when this object was created', verbose_name='Created At')),
                ('updated_at', models.DateTimeField(auto_now=True, help_text='Timestamp when this object was last modified', verbose_name='Updated At')),
                ('id', models.UUIDField(default=uuid.uuid4, editable=False, help_text='Unique identifier for this object', primary_key=True, serialize=False)),
                ('is_deleted', models.BooleanField(default=False, help_text='Whether this object has been soft-deleted', verbose_name='Is Deleted')),
                ('deleted_at', models.DateTimeField(blank=True, help_text='Timestamp when this object was soft-deleted', null=True, verbose_name='Deleted At')),
                ('action', models.CharField(choices=[('LOGIN', 'Login'), ('LOGOUT', 'Logout'), ('PASSWORD_CHANGE', 'Password Change'), ('PASSWORD_RESET', 'Password Reset'), ('ACCOUNT_LOCKED', 'Account Locked'), ('ACCOUNT_UNLOCKED', 'Account Unlocked'), ('CREATE', 'Create'), ('READ', 'Read'), ('UPDATE', 'Update'), ('DELETE', 'Delete'), ('RESTORE', 'Restore'), ('UPLOAD', 'Upload'), ('DOWNLOAD', 'Download'), ('EXPORT', 'Export'), ('IMPORT', 'Import'), ('CAMPAIGN_START', 'Campaign Start'), ('CAMPAIGN_STOP', 'Campaign Stop'), ('CAMPAIGN_PAUSE', 'Campaign Pause'), ('CAMPAIGN_RESUME', 'Campaign Resume'), ('SYSTEM_BACKUP', 'System Backup'), ('SYSTEM_RESTORE', 'System Restore'), ('SYSTEM_MAINTENANCE', 'System Maintenance'), ('CONFIGURATION_CHANGE', 'Configuration Change'), ('PERMISSION_GRANTED', 'Permission Granted'), ('PERMISSION_REVOKED', 'Permission Revoked'), ('ROLE_ASSIGNED', 'Role Assigned'), ('ROLE_REMOVED', 'Role Removed'), ('SECURITY_VIOLATION', 'Security Violation'), ('REPORT_GENERATED', 'Report Generated'), ('ANALYTICS_VIEWED', 'Analytics Viewed'), ('DATA_EXPORTED', 'Data Exported'), ('OTHER', 'Other')], help_text='Type of action that was performed', max_length=50, verbose_name='Action')),
                ('description', models.TextField(help_text='Human-readable description of what happened', verbose_name='Description')),
                ('object_id', models.PositiveIntegerField(blank=True, help_text='ID of the object this activity relates to', null=True, verbose_name='Object ID')),
                ('ip_address', models.GenericIPAddressField(blank=True, help_text='IP address from which the activity was performed', null=True, verbose_name='IP Address')),
                ('user_agent', models.TextField(blank=True, help_text='Browser/client user agent string', verbose_name='User Agent')),
                ('session_key', models.CharField(blank=True, help_text='Session key for tracking user sessions', max_length=40, verbose_name='Session Key')),
                ('request_path', models.CharField(blank=True, help_text='URL path where the activity occurred', max_length=500, verbose_name='Request Path')),
                ('request_method', models.CharField(blank=True, choices=[('GET', 'GET'), ('POST', 'POST'), ('PUT', 'PUT'), ('PATCH', 'PATCH'), ('DELETE', 'DELETE'), ('HEAD', 'HEAD'), ('OPTIONS', 'OPTIONS')], help_text='HTTP method used for the request', max_length=10, verbose_name='Request Method')),
                ('is_successful', models.BooleanField(default=True, help_text='Whether the activity completed successfully', verbose_name='Is Successful')),
                ('error_message', models.TextField(blank=True, help_text='Error message if the activity failed', verbose_name='Error Message')),
                ('metadata', models.JSONField(blank=True, default=dict, help_text='Additional structured data about the activity', verbose_name='Metadata')),
                ('duration_ms', models.BigIntegerField(blank=True, help_text='Duration of the activity in milliseconds', null=True, verbose_name='Duration (ms)')),
                ('content_type', models.ForeignKey(blank=True, help_text='Type of object this activity relates to', null=True, on_delete=django.db.models.deletion.SET_NULL, to='contenttypes.contenttype', verbose_name='Content Type')),
                ('deleted_by', models.ForeignKey(blank=True, help_text='User who soft-deleted this object', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='%(class)s_deleted', to=settings.AUTH_USER_MODEL, verbose_name='Deleted By')),
                ('user', models.ForeignKey(blank=True, help_text='User who performed this activity', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='activities', to=settings.AUTH_USER_MODEL, verbose_name='User')),
                ('category', models.ForeignKey(blank=True, help_text='Category this activity belongs to', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='activities', to='activities.activitycategory', verbose_name='Category')),
            ],
            options={
                'verbose_name': 'Activity',
                'verbose_name_plural': 'Activities',
                'db_table': 'activities_activities',
                'ordering': ['-created_at'],
            },
        ),
        migrations.CreateModel(
            name='ActivitySummary',
            fields=[
                ('created_at', models.DateTimeField(auto_now_add=True, help_text='Timestamp when this object was created', verbose_name='Created At')),
                ('updated_at', models.DateTimeField(auto_now=True, help_text='Timestamp when this object was last modified', verbose_name='Updated At')),
                ('id', models.UUIDField(default=uuid.uuid4, editable=False, help_text='Unique identifier for this object', primary_key=True, serialize=False)),
                ('date', models.DateField(help_text='Date for which this summary is calculated', verbose_name='Date')),
                ('total_activities', models.PositiveIntegerField(default=0, help_text='Total number of activities for this date/scope', verbose_name='Total Activities')),
                ('successful_activities', models.PositiveIntegerField(default=0, help_text='Number of successful activities', verbose_name='Successful Activities')),
                ('failed_activities', models.PositiveIntegerField(default=0, help_text='Number of failed activities', verbose_name='Failed Activities')),
                ('unique_users', models.PositiveIntegerField(default=0, help_text='Number of unique users (for global summaries)', verbose_name='Unique Users')),
                ('unique_ips', models.PositiveIntegerField(default=0, help_text='Number of unique IP addresses', verbose_name='Unique IPs')),
                ('avg_duration_ms', models.FloatField(blank=True, help_text='Average activity duration in milliseconds', null=True, verbose_name='Average Duration (ms)')),
                ('peak_hour', models.PositiveSmallIntegerField(blank=True, help_text='Hour with the most activity (0-23)', null=True, verbose_name='Peak Hour')),
                ('summary_data', models.JSONField(blank=True, default=dict, help_text='Additional summary statistics and breakdowns', verbose_name='Summary Data')),
                ('category', models.ForeignKey(blank=True, help_text='Category for category-specific summaries (null for all categories)', null=True, on_delete=django.db.models.deletion.CASCADE, related_name='activity_summaries', to='activities.activitycategory', verbose_name='Category')),
                ('user', models.ForeignKey(blank=True, help_text='User for user-specific summaries (null for global summaries)', null=True, on_delete=django.db.models.deletion.CASCADE, related_name='activity_summaries', to=settings.AUTH_USER_MODEL, verbose_name='User')),
            ],
            options={
                'verbose_name': 'Activity Summary',
                'verbose_name_plural': 'Activity Summaries',
                'db_table': 'activities_summaries',
                'ordering': ['-date'],
            },
        ),
        migrations.AddIndex(
            model_name='activitycategory',
            index=models.Index(fields=['code'], name='activities__code_b7f8cd_idx'),
        ),
        migrations.AddIndex(
            model_name='activitycategory',
            index=models.Index(fields=['is_active'], name='activities__is_acti_58b6aa_idx'),
        ),
        migrations.AddIndex(
            model_name='activitycategory',
            index=models.Index(fields=['is_system'], name='activities__is_syst_3bd050_idx'),
        ),
        migrations.AddIndex(
            model_name='activity',
            index=models.Index(fields=['user', '-created_at'], name='activities__user_id_2a4536_idx'),
        ),
        migrations.AddIndex(
            model_name='activity',
            index=models.Index(fields=['category', '-created_at'], name='activities__categor_3ba073_idx'),
        ),
        migrations.AddIndex(
            model_name='activity',
            index=models.Index(fields=['action', '-created_at'], name='activities__action_282bc0_idx'),
        ),
        migrations.AddIndex(
            model_name='activity',
            index=models.Index(fields=['content_type', 'object_id'], name='activities__content_b7080e_idx'),
        ),
        migrations.AddIndex(
            model_name='activity',
            index=models.Index(fields=['ip_address'], name='activities__ip_addr_bdc940_idx'),
        ),
        migrations.AddIndex(
            model_name='activity',
            index=models.Index(fields=['session_key'], name='activities__session_a23c44_idx'),
        ),
        migrations.AddIndex(
            model_name='activity',
            index=models.Index(fields=['is_successful'], name='activities__is_succ_5304be_idx'),
        ),
        migrations.AddIndex(
            model_name='activity',
            index=models.Index(fields=['-created_at'], name='activities__created_f44f53_idx'),
        ),
        migrations.AddIndex(
            model_name='activitysummary',
            index=models.Index(fields=['date'], name='activities__date_96015b_idx'),
        ),
        migrations.AddIndex(
            model_name='activitysummary',
            index=models.Index(fields=['user', 'date'], name='activities__user_id_2e758f_idx'),
        ),
        migrations.AddIndex(
            model_name='activitysummary',
            index=models.Index(fields=['category', 'date'], name='activities__categor_4d5325_idx'),
        ),
        migrations.AlterUniqueTogether(
            name='activitysummary',
            unique_together={('date', 'user', 'category')},
        ),
    ]
