from datetime import date

from django.core.management.base import BaseCommand, CommandError
from django.utils import timezone

from players.models import Player
from training.models import PlayerRatingMaterializationRun, PlayerRatingMaterializationTrigger, PlayerSeasonAgingResult
from training.progression_services import PlayerProgressionMaterializationService, PlayerSeasonAgingService


class Command(BaseCommand):
    help = "Materialize development credits, run season aging, or verify immutable progression evidence."

    def add_arguments(self, parser):
        parser.add_argument("--player-id")
        parser.add_argument("--season-id")
        parser.add_argument("--all", action="store_true")
        parser.add_argument("--verify", action="store_true")
        parser.add_argument("--date")

    def handle(self, *args, **options):
        if options["verify"]:
            runs = PlayerRatingMaterializationRun.objects.prefetch_related("attribute_changes").all().order_by("created_at")
            aging = PlayerSeasonAgingResult.objects.select_related("materialization_run").all().order_by("created_at")
            for run in runs:
                PlayerProgressionMaterializationService.verify_run(run)
            for row in aging:
                PlayerSeasonAgingService.verify_result(row)
            self.stdout.write(self.style.SUCCESS(f"Verified {runs.count()} materialization runs and {aging.count()} aging results."))
            return

        if options["season_id"]:
            results = PlayerSeasonAgingService.process_season(season_id=options["season_id"])
            self.stdout.write(self.style.SUCCESS(f"Processed season progression for {len(results)} players."))
            return

        if not options["player_id"] and not options["all"]:
            raise CommandError("Use --player-id, --all, --season-id, or --verify.")
        observed_on = date.fromisoformat(options["date"]) if options["date"] else timezone.localdate()
        ids = Player.objects.order_by("pk").values_list("pk", flat=True) if options["all"] else [options["player_id"]]
        count = 0
        for player_id in ids:
            PlayerProgressionMaterializationService.materialize_player(
                player_id=player_id,
                trigger_type=PlayerRatingMaterializationTrigger.MANUAL,
                source_reference=None,
                observed_on=observed_on,
            )
            count += 1
        self.stdout.write(self.style.SUCCESS(f"Materialized {count} players."))
