U
    1i                     @  s   d Z ddlmZ ddlZddlmZmZ ddlmZm	Z	 ddl
mZmZmZ edZdZe	 d	d
ddddZd%d	ddddddddZdddddZd&ddddddZd'ddddd d!Zd(d	dddd
d"d#d$ZdS ))z7Search Analytics data fetching with pagination support.    )annotationsN)date	timedelta)RateLimiterretry_on_api_error)PageMetricsQueryMetricsSearchMetricsseo_optimizeria  strdictz
list[dict])site_urlrequest_bodyreturnc                 C  s"   |   j||d }|dg S )z/Execute a single searchAnalytics.query request.)ZsiteUrlbodyrows)ZsearchanalyticsqueryZexecuteget)servicer   r   Zresponse r   4/opt/web_system/seo_auto/src/api/search_analytics.py_execute_query   s     r   r   zlist[str] | NonezRateLimiter | None)r   
start_dateend_date
dimensionsrate_limiterr   c           
   	   C  s   |dkrg }g }d}|r"| | | | |t|d}t| ||}	|	sLq||	 tdt|	t||||| t|	tk rq|t7 }q|S )a  Fetch search analytics data with pagination.

    Args:
        service: Webmasters v3 service.
        site_url: GSC property URL.
        start_date: Start date for the query.
        end_date: End date for the query.
        dimensions: List of dimensions (e.g., ['query', 'page']).
        rate_limiter: Optional rate limiter instance.

    Returns:
        List of row dicts from the API response.
    Nr   )Z	startDateZendDater   ZrowLimitZstartRowz2Fetched %d rows (total: %d) for %s [%s-%s] dims=%s)acquire	isoformat	ROW_LIMITr   extendloggerdebuglen)
r   r   r   r   r   r   Zall_rowsZ	start_rowr   r   r   r   r   fetch_search_analytics   s:    

    
r#   r	   )r   r   c                 C  s   | s
t  S tdd | D }tdd | D }|dkr>|| nd}tdd | D }|dkrd|| nd}t ||t|dt|dd	S )
z(Aggregate rows into total SearchMetrics.c                 s  s   | ]}| d dV  qdS )clicksr   Nr   .0rr   r   r   	<genexpr>Y   s     z$_aggregate_totals.<locals>.<genexpr>c                 s  s   | ]}| d dV  qdS )impressionsr   Nr%   r&   r   r   r   r)   Z   s     r   g        c                 s  s&   | ]}| d d| dd V  qdS )positionr   r*   Nr%   r&   r   r   r   r)   ^   s          )r$   r*   ctrr+   )r	   sumround)r   Ztotal_clicksZtotal_impressionsr.   Zweighted_posZavg_positionr   r   r   _aggregate_totalsT   s    r1      intzlist[QueryMetrics])r   top_nr   c                 C  s   g }| D ]^}| dg }|sq|t|d | dd| ddt| dddt| dddd	 q|jd
d dd |d| S )zAConvert API rows (with 'query' dimension) to sorted QueryMetrics.keysr   r$   r*   r.   r,   r+   r-   )r   r$   r*   r.   r+   c                 S  s   | j S Nr$   mr   r   r   <lambda>{       z(_rows_to_query_metrics.<locals>.<lambda>TkeyreverseN)r   appendr   r0   sortr   r4   metricsrowr5   r   r   r   _rows_to_query_metricsk   s     

	rD   zlist[PageMetrics]c                 C  s   g }| D ]^}| dg }|sq|t|d | dd| ddt| dddt| dddd	 q|jd
d dd |d| S )z?Convert API rows (with 'page' dimension) to sorted PageMetrics.r5   r   r$   r*   r.   r,   r+   r-   )pager$   r*   r.   r+   c                 S  s   | j S r6   r7   r8   r   r   r   r:      r;   z'_rows_to_page_metrics.<locals>.<lambda>Tr<   N)r   r?   r   r0   r@   rA   r   r   r   _rows_to_page_metrics   s     

	rF   )r   r   r   r   r   c              
   C  s   t | |||g |d}t|}t | |||dg|d}t|}t | |||dg|d}	t|	}
td||||j|j|jd |j	 |||
||	dS )zFetch all analytics dimensions for a period.

    Returns:
        Dict with keys: total, queries, pages, rows_by_query, rows_by_page
    )r   r   r   rE   zDPeriod %s~%s for %s: clicks=%d, impressions=%d, ctr=%.2f%%, pos=%.1fd   )totaltop_queries	top_pagesrows_by_queryZrows_by_page)
r#   r1   rD   rF   r    infor$   r*   r.   r+   )r   r   r   r   r   Z
total_rowsrH   
query_rowsrI   Z	page_rowsrJ   r   r   r   fetch_for_period   sV                     rN   )NN)r2   )r2   )N)__doc__
__future__r   loggingdatetimer   r   src.api.rate_limiterr   r   src.models.data_modelsr   r   r	   	getLoggerr    r   r   r#   r1   rD   rF   rN   r   r   r   r   <module>   s"   
  9 