"""
Prediction Calculator Module.

This module provides functions to calculate match predictions based on
energy scores from sentiment analysis.
"""

from typing import Dict, Any


def calculate_confidence_meter(home_energy: float, away_energy: float) -> float:
    """
    Calculate the Confidence Meter (0-100%) based on energy difference.
    
    The Confidence Meter represents how confident we are in the prediction
    based on the difference in energy scores between the two teams.
    
    Formula: min(100, abs(home_energy - away_energy) * 2)
    
    Args:
        home_energy: Energy score of the home team (float, any value)
        away_energy: Energy score of the away team (float, any value)
    
    Returns:
        Confidence score between 0.0 and 100.0
    
    Examples:
        >>> calculate_confidence_meter(50.0, 50.0)
        0.0
        >>> calculate_confidence_meter(60.0, 50.0)
        20.0
        >>> calculate_confidence_meter(100.0, 50.0)
        100.0
    """
    energy_diff = abs(home_energy - away_energy)
    confidence = min(100.0, energy_diff * 2.0)
    return confidence


def determine_winner(home_energy: float, away_energy: float) -> str:
    """
    Determine the predicted winner based on energy scores.
    
    Args:
        home_energy: Energy score of the home team
        away_energy: Energy score of the away team
    
    Returns:
        'home' if home team has higher energy,
        'away' if away team has higher energy,
        'draw' if energies are equal
    
    Examples:
        >>> determine_winner(60.0, 40.0)
        'home'
        >>> determine_winner(40.0, 60.0)
        'away'
        >>> determine_winner(50.0, 50.0)
        'draw'
    """
    if home_energy > away_energy:
        return 'home'
    elif away_energy > home_energy:
        return 'away'
    else:
        return 'draw'


def calculate_prediction(home_energy: float, away_energy: float) -> Dict[str, Any]:
    """
    Calculate a complete match prediction based on energy scores.
    
    This function combines confidence calculation and winner determination
    to provide a comprehensive prediction result.
    
    Args:
        home_energy: Energy score of the home team
        away_energy: Energy score of the away team
    
    Returns:
        Dictionary containing:
        - confidence: Confidence score (0.0 - 100.0)
        - predicted_winner: 'home', 'away', or 'draw'
        - home_energy: Original home energy score
        - away_energy: Original away energy score
    
    Examples:
        >>> calculate_prediction(65.0, 45.0)
        {'confidence': 40.0, 'predicted_winner': 'home', 
         'home_energy': 65.0, 'away_energy': 45.0}
    """
    confidence = calculate_confidence_meter(home_energy, away_energy)
    predicted_winner = determine_winner(home_energy, away_energy)
    
    return {
        'confidence': confidence,
        'predicted_winner': predicted_winner,
        'home_energy': home_energy,
        'away_energy': away_energy
    }


def validate_prediction_result(result: Dict[str, Any]) -> bool:
    """
    Validate that a prediction result contains all required fields and valid values.
    
    Args:
        result: Dictionary to validate
    
    Returns:
        True if valid, False otherwise
    
    Examples:
        >>> validate_prediction_result({'confidence': 75.0, 'predicted_winner': 'home',
        ...                            'home_energy': 65.0, 'away_energy': 45.0})
        True
        >>> validate_prediction_result({'confidence': -10.0, 'predicted_winner': 'home',
        ...                            'home_energy': 65.0, 'away_energy': 45.0})
        False
    """
    # Check required fields
    required_fields = ['confidence', 'predicted_winner', 'home_energy', 'away_energy']
    if not all(field in result for field in required_fields):
        return False
    
    # Validate confidence
    confidence = result['confidence']
    if not isinstance(confidence, (int, float)):
        return False
    if confidence < 0.0 or confidence > 100.0:
        return False
    
    # Validate predicted_winner
    winner = result['predicted_winner']
    if winner not in ['home', 'away', 'draw']:
        return False
    
    # Validate energy scores (should be non-negative)
    home_energy = result['home_energy']
    away_energy = result['away_energy']
    if not isinstance(home_energy, (int, float)) or not isinstance(away_energy, (int, float)):
        return False
    if home_energy < 0.0 or away_energy < 0.0:
        return False
    
    return True
