# Generated by Django 6.1.1 on 2026-10-07 17:58

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


class Migration(migrations.Migration):

    initial = True

    dependencies = [
        ('careers', '0003_career_career_active_lifecycle_and_more'),
        ('clubs', '0003_club_squad_membership'),
        ('training', '0001_initial'),
    ]

    operations = [
        migrations.CreateModel(
            name='StaffMember',
            fields=[
                ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
                ('source_type', models.CharField(choices=[('CAREER', 'Career'), ('NPC', 'Npc')], max_length=12)),
                ('specialty', models.CharField(choices=[('HEAD_COACH', 'Head Coach'), ('ASSISTANT_COACH', 'Assistant Coach'), ('FITNESS_COACH', 'Fitness Coach'), ('GOALKEEPER_COACH', 'Goalkeeper Coach')], max_length=24)),
                ('first_name', models.CharField(blank=True, default='', max_length=100)),
                ('last_name', models.CharField(blank=True, default='', max_length=100)),
                ('nationality', models.CharField(blank=True, default='', max_length=100)),
                ('created_at', models.DateTimeField(auto_now_add=True)),
                ('coach_career', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='staff_identity', to='careers.career')),
            ],
            options={
                'ordering': ['last_name', 'first_name', 'id'],
            },
        ),
        migrations.CreateModel(
            name='StaffCapabilityProfile',
            fields=[
                ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
                ('level', models.PositiveSmallIntegerField()),
                ('leadership', models.PositiveSmallIntegerField()),
                ('tactical', models.PositiveSmallIntegerField()),
                ('development', models.PositiveSmallIntegerField()),
                ('fitness', models.PositiveSmallIntegerField()),
                ('goalkeeping', models.PositiveSmallIntegerField()),
                ('revision', models.PositiveIntegerField(default=1)),
                ('updated_at', models.DateTimeField(auto_now=True)),
                ('staff_member', models.OneToOneField(on_delete=django.db.models.deletion.PROTECT, related_name='capability', to='staff.staffmember')),
            ],
        ),
        migrations.CreateModel(
            name='StaffCapabilityEvent',
            fields=[
                ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
                ('revision', models.PositiveIntegerField()),
                ('level', models.PositiveSmallIntegerField()),
                ('leadership', models.PositiveSmallIntegerField()),
                ('tactical', models.PositiveSmallIntegerField()),
                ('development', models.PositiveSmallIntegerField()),
                ('fitness', models.PositiveSmallIntegerField()),
                ('goalkeeping', models.PositiveSmallIntegerField()),
                ('created_at', models.DateTimeField(auto_now_add=True)),
                ('staff_member', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='capability_events', to='staff.staffmember')),
            ],
            options={
                'ordering': ['staff_member_id', 'revision'],
            },
        ),
        migrations.CreateModel(
            name='ClubStaffAssignment',
            fields=[
                ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
                ('role', models.CharField(choices=[('HEAD_COACH', 'Head Coach'), ('ASSISTANT_COACH', 'Assistant Coach'), ('FITNESS_COACH', 'Fitness Coach'), ('GOALKEEPER_COACH', 'Goalkeeper Coach')], max_length=24)),
                ('status', models.CharField(choices=[('ACTIVE', 'Active'), ('ENDED', 'Ended')], default='ACTIVE', max_length=10)),
                ('started_at', models.DateTimeField()),
                ('ended_at', models.DateTimeField(blank=True, null=True)),
                ('created_at', models.DateTimeField(auto_now_add=True)),
                ('club', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='staff_assignments', to='clubs.club')),
                ('staff_member', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='club_assignments', to='staff.staffmember')),
            ],
            options={
                'ordering': ['club_id', 'role', 'started_at'],
            },
        ),
        migrations.CreateModel(
            name='TeamTrainingStaffSnapshot',
            fields=[
                ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
                ('target_attribute', models.CharField(max_length=40)),
                ('multiplier', models.DecimalField(decimal_places=6, max_digits=8)),
                ('context_payload', models.JSONField()),
                ('context_hash', models.CharField(max_length=64)),
                ('policy_key', models.CharField(default='ftg.staff.training.v1', max_length=100)),
                ('policy_version', models.CharField(default='1.0.0', max_length=30)),
                ('created_at', models.DateTimeField(auto_now_add=True)),
                ('assistant_assignment', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='+', to='staff.clubstaffassignment')),
                ('club', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='training_staff_snapshots', to='clubs.club')),
                ('fitness_assignment', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='+', to='staff.clubstaffassignment')),
                ('goalkeeper_assignment', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='+', to='staff.clubstaffassignment')),
                ('head_assignment', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='+', to='staff.clubstaffassignment')),
                ('session', models.OneToOneField(on_delete=django.db.models.deletion.PROTECT, related_name='staff_snapshot', to='training.trainingsession')),
            ],
        ),
        migrations.CreateModel(
            name='ClubStaffAssignmentEvent',
            fields=[
                ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
                ('event_type', models.CharField(choices=[('ASSIGNED', 'Assigned'), ('ENDED', 'Ended')], max_length=12)),
                ('previous_status', models.CharField(blank=True, default='', max_length=10)),
                ('new_status', models.CharField(choices=[('ACTIVE', 'Active'), ('ENDED', 'Ended')], max_length=10)),
                ('created_at', models.DateTimeField(auto_now_add=True)),
                ('assignment', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='events', to='staff.clubstaffassignment')),
            ],
            options={
                'ordering': ['created_at', 'id'],
                'constraints': [models.UniqueConstraint(fields=('assignment', 'event_type'), name='uq_staff_assign_event'), models.CheckConstraint(condition=models.Q(models.Q(('event_type', 'ASSIGNED'), ('new_status', 'ACTIVE'), ('previous_status', '')), models.Q(('event_type', 'ENDED'), ('new_status', 'ENDED'), ('previous_status', 'ACTIVE')), _connector='OR'), name='staff_assign_event_ok')],
            },
        ),
        migrations.AddConstraint(
            model_name='staffmember',
            constraint=models.CheckConstraint(condition=models.Q(('source_type__in', ('CAREER', 'NPC'))), name='staff_valid_source'),
        ),
        migrations.AddConstraint(
            model_name='staffmember',
            constraint=models.CheckConstraint(condition=models.Q(('specialty__in', ('HEAD_COACH', 'ASSISTANT_COACH', 'FITNESS_COACH', 'GOALKEEPER_COACH'))), name='staff_valid_specialty'),
        ),
        migrations.AddConstraint(
            model_name='staffmember',
            constraint=models.CheckConstraint(condition=models.Q(models.Q(('coach_career__isnull', False), ('source_type', 'CAREER'), ('specialty', 'HEAD_COACH')), models.Q(('coach_career__isnull', True), ('source_type', 'NPC'), ('specialty__in', ('ASSISTANT_COACH', 'FITNESS_COACH', 'GOALKEEPER_COACH'))), _connector='OR'), name='staff_source_specialty_ok'),
        ),
        migrations.AddConstraint(
            model_name='staffmember',
            constraint=models.CheckConstraint(condition=models.Q(('source_type', 'CAREER'), models.Q(models.Q(('first_name', ''), _negated=True), models.Q(('last_name', ''), _negated=True), models.Q(('nationality', ''), _negated=True)), _connector='OR'), name='staff_npc_identity_nonempty'),
        ),
        migrations.AddConstraint(
            model_name='staffcapabilityprofile',
            constraint=models.CheckConstraint(condition=models.Q(('level__gte', 1), ('level__lte', 5)), name='staff_cap_level_range'),
        ),
        migrations.AddConstraint(
            model_name='staffcapabilityprofile',
            constraint=models.CheckConstraint(condition=models.Q(('revision__gte', 1)), name='staff_cap_revision_gte1'),
        ),
        migrations.AddConstraint(
            model_name='staffcapabilityprofile',
            constraint=models.CheckConstraint(condition=models.Q(('leadership__gte', 1), ('leadership__lte', 100)), name='staff_cap_leadersh_range'),
        ),
        migrations.AddConstraint(
            model_name='staffcapabilityprofile',
            constraint=models.CheckConstraint(condition=models.Q(('tactical__gte', 1), ('tactical__lte', 100)), name='staff_cap_tactical_range'),
        ),
        migrations.AddConstraint(
            model_name='staffcapabilityprofile',
            constraint=models.CheckConstraint(condition=models.Q(('development__gte', 1), ('development__lte', 100)), name='staff_cap_developm_range'),
        ),
        migrations.AddConstraint(
            model_name='staffcapabilityprofile',
            constraint=models.CheckConstraint(condition=models.Q(('fitness__gte', 1), ('fitness__lte', 100)), name='staff_cap_fitness_range'),
        ),
        migrations.AddConstraint(
            model_name='staffcapabilityprofile',
            constraint=models.CheckConstraint(condition=models.Q(('goalkeeping__gte', 1), ('goalkeeping__lte', 100)), name='staff_cap_goalkeep_range'),
        ),
        migrations.AddConstraint(
            model_name='staffcapabilityevent',
            constraint=models.UniqueConstraint(fields=('staff_member', 'revision'), name='uq_staff_cap_event_rev'),
        ),
        migrations.AddConstraint(
            model_name='staffcapabilityevent',
            constraint=models.CheckConstraint(condition=models.Q(('level__gte', 1), ('level__lte', 5)), name='staff_evt_level_range'),
        ),
        migrations.AddConstraint(
            model_name='staffcapabilityevent',
            constraint=models.CheckConstraint(condition=models.Q(('leadership__gte', 1), ('leadership__lte', 100)), name='staff_evt_leadersh_range'),
        ),
        migrations.AddConstraint(
            model_name='staffcapabilityevent',
            constraint=models.CheckConstraint(condition=models.Q(('tactical__gte', 1), ('tactical__lte', 100)), name='staff_evt_tactical_range'),
        ),
        migrations.AddConstraint(
            model_name='staffcapabilityevent',
            constraint=models.CheckConstraint(condition=models.Q(('development__gte', 1), ('development__lte', 100)), name='staff_evt_developm_range'),
        ),
        migrations.AddConstraint(
            model_name='staffcapabilityevent',
            constraint=models.CheckConstraint(condition=models.Q(('fitness__gte', 1), ('fitness__lte', 100)), name='staff_evt_fitness_range'),
        ),
        migrations.AddConstraint(
            model_name='staffcapabilityevent',
            constraint=models.CheckConstraint(condition=models.Q(('goalkeeping__gte', 1), ('goalkeeping__lte', 100)), name='staff_evt_goalkeep_range'),
        ),
        migrations.AddIndex(
            model_name='clubstaffassignment',
            index=models.Index(fields=['club', 'status'], name='staff_club_status_idx'),
        ),
        migrations.AddConstraint(
            model_name='clubstaffassignment',
            constraint=models.CheckConstraint(condition=models.Q(('role__in', ('HEAD_COACH', 'ASSISTANT_COACH', 'FITNESS_COACH', 'GOALKEEPER_COACH'))), name='staff_assign_valid_role'),
        ),
        migrations.AddConstraint(
            model_name='clubstaffassignment',
            constraint=models.CheckConstraint(condition=models.Q(('status__in', ('ACTIVE', 'ENDED'))), name='staff_assign_valid_status'),
        ),
        migrations.AddConstraint(
            model_name='clubstaffassignment',
            constraint=models.CheckConstraint(condition=models.Q(models.Q(('ended_at__isnull', True), ('status', 'ACTIVE')), models.Q(('ended_at__isnull', False), ('status', 'ENDED')), _connector='OR'), name='staff_assign_lifecycle'),
        ),
        migrations.AddConstraint(
            model_name='clubstaffassignment',
            constraint=models.CheckConstraint(condition=models.Q(('ended_at__isnull', True), ('ended_at__gte', models.F('started_at')), _connector='OR'), name='staff_assign_end_after_start'),
        ),
        migrations.AddConstraint(
            model_name='clubstaffassignment',
            constraint=models.UniqueConstraint(condition=models.Q(('status', 'ACTIVE')), fields=('club', 'role'), name='uq_active_staff_role'),
        ),
        migrations.AddConstraint(
            model_name='clubstaffassignment',
            constraint=models.UniqueConstraint(condition=models.Q(('status', 'ACTIVE')), fields=('staff_member',), name='uq_active_staff_member'),
        ),
        migrations.AddConstraint(
            model_name='teamtrainingstaffsnapshot',
            constraint=models.CheckConstraint(condition=models.Q(('multiplier__gte', 0)), name='staff_snap_multiplier_gte0'),
        ),
        migrations.AddConstraint(
            model_name='teamtrainingstaffsnapshot',
            constraint=models.CheckConstraint(condition=models.Q(('context_hash', ''), _negated=True), name='staff_snap_hash_nonempty'),
        ),
        migrations.AddConstraint(
            model_name='teamtrainingstaffsnapshot',
            constraint=models.CheckConstraint(condition=models.Q(('policy_key', ''), _negated=True), name='staff_snap_policy_nonempty'),
        ),
        migrations.AddConstraint(
            model_name='teamtrainingstaffsnapshot',
            constraint=models.CheckConstraint(condition=models.Q(('policy_version', ''), _negated=True), name='staff_snap_version_nonempty'),
        ),
    ]
