"""Read-only comparison: raw skill averages and the engine's positional units."""
from django.shortcuts import get_object_or_404
from rest_framework import permissions, serializers
from rest_framework.response import Response
from rest_framework.views import APIView

from clubs.access import can_manage_club
from clubs.models import Club
from matches.engine.state import TeamState
from matches.engine.v314.evaluator import evaluate_team
from matches.tactical_analysis import scenario
from .drills import formation_identity
from .timed import formation_points


def summarize(club, value):
    players, _, actual = scenario(value, prefix="preview", club=club)
    if not actual:
        raise serializers.ValidationError("Select eleven current club players for skill averages.")
    key, _ = formation_identity(value["formation"], [p.lineup_slot for p in players])
    points = formation_points(club.pk, [p.player_id for p in players], key)
    evaluation = evaluate_team(TeamState(club_id=str(club.pk), formation=value["formation"], starters=tuple(players), substitutes=()))
    ratings = [dict(p.ratings) for p in players]
    return {"averages": {a: round(sum(r[a] for r in ratings) / 11, 3) for a in ratings[0]},
            "units": {a: round(getattr(evaluation, a), 3) for a in ("attack", "midfield", "defence", "goalkeeping", "average_position_fit")},
            "formation_cohesion": round(sum(points.values()) / 11, 6),
            "formation_key": key, "player_count": 11}


class LineupTrainingPreviewView(APIView):
    permission_classes = [permissions.IsAuthenticated]

    def post(self, request, club_id):
        club = get_object_or_404(Club, pk=club_id)
        if not can_manage_club(request.user, club):
            return Response({"detail": "Club management permission required."}, status=403)
        if not isinstance(request.data, dict):
            raise serializers.ValidationError("Expected comparison object.")
        current = summarize(club, request.data.get("current"))
        baseline = summarize(club, request.data["baseline"]) if request.data.get("baseline") else None
        delta = None if baseline is None else {category: {k: round(v - baseline[category][k], 3) for k,v in current[category].items()} for category in ("averages", "units")}
        return Response({"current": current, "baseline": baseline, "delta": delta})
