# Generated by Django 6.1.1 on 2026-10-06 19:45

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


class Migration(migrations.Migration):

    initial = True

    dependencies = [
        ('clubs', '0003_club_squad_membership'),
        ('players', '0002_player_integrity_constraints'),
    ]

    operations = [
        migrations.CreateModel(
            name='TrainingSession',
            fields=[
                ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
                ('session_type', models.CharField(choices=[('INDIVIDUAL', 'Individual'), ('TEAM', 'Team')], max_length=20)),
                ('status', models.CharField(choices=[('SCHEDULED', 'Scheduled'), ('COMPLETED', 'Completed'), ('CANCELLED', 'Cancelled')], default='SCHEDULED', max_length=20)),
                ('training_date', models.DateField()),
                ('target_attribute', models.CharField(max_length=40)),
                ('base_effect', models.DecimalField(decimal_places=6, default='1.000000', max_digits=8)),
                ('policy_key', models.CharField(default='ftg.training.effect.v1', max_length=100)),
                ('policy_version', models.CharField(default='1.0.0', max_length=30)),
                ('created_at', models.DateTimeField(auto_now_add=True)),
                ('completed_at', models.DateTimeField(blank=True, null=True)),
                ('cancelled_at', models.DateTimeField(blank=True, null=True)),
                ('club', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='training_sessions', to='clubs.club')),
            ],
            options={
                'ordering': ['training_date', 'created_at', 'id'],
            },
        ),
        migrations.CreateModel(
            name='TrainingParticipant',
            fields=[
                ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
                ('created_at', models.DateTimeField(auto_now_add=True)),
                ('player', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='training_participations', to='players.player')),
                ('session', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='participants', to='training.trainingsession')),
            ],
            options={
                'ordering': ['session_id', 'player_id'],
            },
        ),
        migrations.CreateModel(
            name='PlayerDevelopmentProgress',
            fields=[
                ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
                ('attribute_name', models.CharField(max_length=40)),
                ('total_points', models.DecimalField(decimal_places=6, default='0.000000', max_digits=18)),
                ('updated_at', models.DateTimeField(auto_now=True)),
                ('player', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='development_progress', to='players.player')),
            ],
            options={
                'ordering': ['player_id', 'attribute_name'],
                'constraints': [models.UniqueConstraint(fields=('player', 'attribute_name'), name='uq_player_development_attribute'), models.CheckConstraint(condition=models.Q(('attribute_name__in', ('pace', 'acceleration', 'agility', 'balance', 'strength', 'stamina', 'jumping', 'natural_fitness', 'ball_control', 'dribbling', 'passing', 'crossing', 'finishing', 'shooting', 'long_shots', 'first_touch', 'heading', 'tackling', 'marking', 'set_pieces', 'vision', 'positioning', 'decision_making', 'composure', 'concentration', 'anticipation', 'off_ball', 'aggression', 'work_rate', 'teamwork', 'gk_diving', 'gk_handling', 'gk_reflexes', 'gk_positioning', 'gk_kicking', 'gk_one_on_one'))), name='development_valid_attribute'), models.CheckConstraint(condition=models.Q(('total_points__gte', 0)), name='development_points_nonnegative')],
            },
        ),
        migrations.CreateModel(
            name='TrainingDevelopmentResult',
            fields=[
                ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
                ('attribute_name', models.CharField(max_length=40)),
                ('training_date', models.DateField()),
                ('age_years', models.PositiveSmallIntegerField()),
                ('overall_before', models.PositiveSmallIntegerField()),
                ('potential_at_training', models.PositiveSmallIntegerField()),
                ('attribute_rating_before', models.PositiveSmallIntegerField()),
                ('base_effect', models.DecimalField(decimal_places=6, max_digits=12)),
                ('potential_factor', models.DecimalField(decimal_places=6, max_digits=12)),
                ('age_factor', models.DecimalField(decimal_places=6, max_digits=12)),
                ('nutrition_multiplier', models.DecimalField(decimal_places=6, max_digits=12)),
                ('coach_multiplier', models.DecimalField(decimal_places=6, max_digits=12)),
                ('fatigue_multiplier', models.DecimalField(decimal_places=6, max_digits=12)),
                ('injury_multiplier', models.DecimalField(decimal_places=6, max_digits=12)),
                ('final_effect', models.DecimalField(decimal_places=6, max_digits=18)),
                ('progress_before', models.DecimalField(decimal_places=6, max_digits=18)),
                ('progress_after', models.DecimalField(decimal_places=6, max_digits=18)),
                ('policy_key', models.CharField(max_length=100)),
                ('policy_version', models.CharField(max_length=30)),
                ('created_at', models.DateTimeField(auto_now_add=True)),
                ('player', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='training_development_results', to='players.player')),
                ('participant', models.OneToOneField(on_delete=django.db.models.deletion.PROTECT, related_name='development_result', to='training.trainingparticipant')),
            ],
            options={
                'ordering': ['training_date', 'created_at', 'id'],
                'indexes': [models.Index(fields=['player', 'training_date'], name='trainres_player_date_idx')],
                'constraints': [models.CheckConstraint(condition=models.Q(('attribute_name__in', ('pace', 'acceleration', 'agility', 'balance', 'strength', 'stamina', 'jumping', 'natural_fitness', 'ball_control', 'dribbling', 'passing', 'crossing', 'finishing', 'shooting', 'long_shots', 'first_touch', 'heading', 'tackling', 'marking', 'set_pieces', 'vision', 'positioning', 'decision_making', 'composure', 'concentration', 'anticipation', 'off_ball', 'aggression', 'work_rate', 'teamwork', 'gk_diving', 'gk_handling', 'gk_reflexes', 'gk_positioning', 'gk_kicking', 'gk_one_on_one'))), name='training_result_valid_attribute'), models.CheckConstraint(condition=models.Q(('age_years__lte', 100)), name='training_result_age_lte_100'), models.CheckConstraint(condition=models.Q(('overall_before__gte', 1), ('overall_before__lte', 100)), name='training_result_overall_1_100'), models.CheckConstraint(condition=models.Q(('potential_at_training__gte', 1), ('potential_at_training__lte', 100)), name='training_result_potential_1_100'), models.CheckConstraint(condition=models.Q(('attribute_rating_before__gte', 1), ('attribute_rating_before__lte', 100)), name='training_result_rating_1_100'), models.CheckConstraint(condition=models.Q(('final_effect__gte', 0)), name='training_result_effect_nonnegative'), models.CheckConstraint(condition=models.Q(('progress_after__gte', models.F('progress_before')), ('progress_before__gte', 0)), name='training_result_progress_monotonic'), models.CheckConstraint(condition=models.Q(('progress_after', django.db.models.expressions.CombinedExpression(models.F('progress_before'), '+', models.F('final_effect')))), name='training_result_progress_math')],
            },
        ),
        migrations.AddIndex(
            model_name='trainingsession',
            index=models.Index(fields=['training_date', 'status'], name='training_date_status_idx'),
        ),
        migrations.AddIndex(
            model_name='trainingsession',
            index=models.Index(fields=['club', 'training_date'], name='training_club_date_idx'),
        ),
        migrations.AddConstraint(
            model_name='trainingsession',
            constraint=models.CheckConstraint(condition=models.Q(('session_type__in', ['INDIVIDUAL', 'TEAM'])), name='training_valid_session_type'),
        ),
        migrations.AddConstraint(
            model_name='trainingsession',
            constraint=models.CheckConstraint(condition=models.Q(('status__in', ['SCHEDULED', 'COMPLETED', 'CANCELLED'])), name='training_valid_status'),
        ),
        migrations.AddConstraint(
            model_name='trainingsession',
            constraint=models.CheckConstraint(condition=models.Q(('target_attribute__in', ('pace', 'acceleration', 'agility', 'balance', 'strength', 'stamina', 'jumping', 'natural_fitness', 'ball_control', 'dribbling', 'passing', 'crossing', 'finishing', 'shooting', 'long_shots', 'first_touch', 'heading', 'tackling', 'marking', 'set_pieces', 'vision', 'positioning', 'decision_making', 'composure', 'concentration', 'anticipation', 'off_ball', 'aggression', 'work_rate', 'teamwork', 'gk_diving', 'gk_handling', 'gk_reflexes', 'gk_positioning', 'gk_kicking', 'gk_one_on_one'))), name='training_valid_attribute'),
        ),
        migrations.AddConstraint(
            model_name='trainingsession',
            constraint=models.CheckConstraint(condition=models.Q(('base_effect__gt', 0)), name='training_base_effect_positive'),
        ),
        migrations.AddConstraint(
            model_name='trainingsession',
            constraint=models.CheckConstraint(condition=models.Q(models.Q(('club__isnull', True), ('session_type', 'INDIVIDUAL')), models.Q(('club__isnull', False), ('session_type', 'TEAM')), _connector='OR'), name='training_type_club_consistent'),
        ),
        migrations.AddConstraint(
            model_name='trainingsession',
            constraint=models.CheckConstraint(condition=models.Q(models.Q(('cancelled_at__isnull', True), ('completed_at__isnull', True), ('status', 'SCHEDULED')), models.Q(('cancelled_at__isnull', True), ('completed_at__isnull', False), ('status', 'COMPLETED')), models.Q(('cancelled_at__isnull', False), ('completed_at__isnull', True), ('status', 'CANCELLED')), _connector='OR'), name='training_session_lifecycle_consistent'),
        ),
        migrations.AddIndex(
            model_name='trainingparticipant',
            index=models.Index(fields=['player', 'session'], name='training_player_session_idx'),
        ),
        migrations.AddConstraint(
            model_name='trainingparticipant',
            constraint=models.UniqueConstraint(fields=('session', 'player'), name='uq_training_session_player'),
        ),
    ]
