o
    G$Gi                     @  s<   d dl mZ d dlZd dlmZ edZG dd dZdS )    )annotationsN)Optionalzagents.analyzerc                   @  s&   e Zd ZdZddddZddd	Zd
S )AnalyzerAgentu  
    Считает силу команд (attack/defense) по последним N завершённым матчам.
    Под твою схему matches:
      - home_team, away_team
      - home_score, away_score
      - kickoff_ts
      - status
       windowintc                 C  s   || _ || _d S )N)dbr   )selfr   r    r
   ?/var/www/www-root/data/www/77.83.87.30/agents/analyzer_agent.py__init__   s   
zAnalyzerAgent.__init__returnc                   s   d}d| j  d| j  d}| j|t|I dH }|s#td dS d}|D ]C}|d }|d	 dur9t|d	 nd
}|d durGt|d nd
}tdt|d}	tdt|d}
| j	d|||	|
I dH  |d7 }q't
d|| j  |S )uz   
        Возвращает количество команд, по которым обновили team_stats.
        )finishedFTAETFT_PENendedFinishedFINISHEDa'  
        WITH team_games AS (
            SELECT
                home_team AS team,
                home_score::float AS goals_for,
                away_score::float AS goals_against,
                kickoff_ts AS ts
            FROM matches
            WHERE status = ANY($1)
              AND home_score IS NOT NULL
              AND away_score IS NOT NULL
              AND kickoff_ts IS NOT NULL

            UNION ALL

            SELECT
                away_team AS team,
                away_score::float AS goals_for,
                home_score::float AS goals_against,
                kickoff_ts AS ts
            FROM matches
            WHERE status = ANY($1)
              AND home_score IS NOT NULL
              AND away_score IS NOT NULL
              AND kickoff_ts IS NOT NULL
        ),
        ranked AS (
            SELECT
                team,
                goals_for,
                goals_against,
                ts,
                ROW_NUMBER() OVER (PARTITION BY team ORDER BY ts DESC) AS rn
            FROM team_games
        ),
        weighted AS (
            SELECT
                team,
                goals_for,
                goals_against,
                CASE
                    WHEN rn <= 5  THEN 1.5
                    WHEN rn <= 15 THEN 1.0
                    WHEN rn <= zn THEN 0.6
                    ELSE 0
                END AS w
            FROM ranked
            WHERE rn <= a&  
        )
        SELECT
            team,
            (SUM(goals_for * w) / NULLIF(SUM(w), 0))::float AS gf,
            (SUM(goals_against * w) / NULLIF(SUM(w), 0))::float AS ga,
            COUNT(*)::int AS n
        FROM weighted
        GROUP BY team
        HAVING COUNT(*) >= 2
        NzAteam_strengths: no rows computed (maybe no finished matches yet).r   teamgfg        gagffffff?g	@aN  
                INSERT INTO team_stats(team_id, team_name, attack, defense)
                VALUES ($1, $2, $3, $4)
                ON CONFLICT (team_id)
                DO UPDATE SET
                    attack = EXCLUDED.attack,
                    defense = EXCLUDED.defense,
                    updated_at = now()
                   z,team_strengths: updated=%d teams (window=%d))r   r   	fetch_alllistlogwarningfloatmaxminexecuteinfo)r	   finished_statusesqueryrowsupdatedrr   r   r   attackdefenser
   r
   r   recompute_team_strengths   s2   +/;
	

z&AnalyzerAgent.recompute_team_strengthsN)r   )r   r   )r   r   )__name__
__module____qualname____doc__r   r)   r
   r
   r
   r   r   	   s    	r   )
__future__r   loggingtypingr   	getLoggerr   r   r
   r
   r
   r   <module>   s
    
