"""Утилиты для расчёта и отправки метрик качества генерации."""
import logging
import os
from typing import Any, Dict, List

import requests

logger = logging.getLogger(__name__)


def flatten_metrics(metrics: Dict[str, Any]) -> Dict[str, float]:
    """Преобразует вложенную структуру метрик в плоский словарь.

    Вложенные ключи объединяются через нижнее подчёркивание,
    """
    flattened = {}
    for parent_key, parent_value in metrics.items():
        if isinstance(parent_value, dict):
            for child_key, child_value in parent_value.items():
                if parent_value == 'rouge':
                    flattened[f'{child_key}'] = child_value
                else:
                    flattened[f'{parent_key}_{child_key}'] = child_value
        else:
            flattened[parent_key] = parent_value
    return flattened


def request_metrics(reference: str, hypothesis: str, user_input: str, documents: List[str]) -> Dict[str, float]:
    """Расчитывает метрики через сервис eval."""
    url = os.getenv('URL_EVAL')

    response = requests.post(url, 
                             json={'user_input': user_input,
                                    "context": documents,
                                   'reference': reference, 
                                   'hypothesis': hypothesis})

    if response.status_code == requests.codes.ok:
        return flatten_metrics(response.json())
    else:
        logger.error('Error generating response: %s', response.json())
        return {}


def calculate_average(metrics_list: List[Dict[str, float]]) -> Dict[str, float]:
    """Считает среднее для каждой метрики по всем генерациям."""
    if not metrics_list:
        return {}

    if all(metric is None for metric in metrics_list):
        return {}
        

    avg_metrics = {}
    num_experiments = len(metrics_list)
    for metric in metrics_list[0]:
        avg_metrics[metric] = sum(dict_metric[metric] for dict_metric in metrics_list) / num_experiments

    return avg_metrics
