"""
=========================================================
CV6 AI Trading OS
AI Consensus Engine
=========================================================
"""

from collections import Counter
from typing import List

from app.ai.ai_models import (
    AIResponse,
    DecisionType,
)


class AIConsensus:
    """
    AI Consensus Engine

    Combines multiple AI provider responses
    into one final decision.
    """

    def __init__(self):

        self.weights = {
            "gpt": 1.0,
            "claude": 1.0,
            "gemini": 1.0,
            "deepseek": 1.0,
            "ollama": 1.0,
            "llama": 1.0,
        }
    def majority_vote(
        self,
        responses: List[AIResponse],
    ) -> DecisionType:
        """
        Return the majority decision
        from all AI providers.
        """

        if not responses:
            return DecisionType.HOLD

        decisions = [
            response.decision
            for response in responses
        ]

        counter = Counter(decisions)

        return counter.most_common(1)[0][0]


    def average_confidence(
        self,
        responses: List[AIResponse],
    ) -> float:
        """
        Calculate average confidence.
        """

        if not responses:
            return 0.0

        total = sum(
            response.confidence
            for response in responses
        )

        return round(
            total / len(responses),
            2,
        )
    def combine(
        self,
        responses: List[AIResponse],
    ) -> AIResponse:
        """
        Combine all AI responses into one
        final decision.
        """

        if not responses:

            return AIResponse(
                provider="gpt",
                decision=DecisionType.HOLD,
                confidence=0.0,
                reason="No AI responses available.",
                score=0.0,
            )

        final_decision = self.majority_vote(
            responses
        )

        confidence = self.average_confidence(
            responses
        )

        providers = ", ".join(
            [
                str(response.provider)
                for response in responses
            ]
        )

        return AIResponse(
            provider="gpt",
            decision=final_decision,
            confidence=confidence,
            reason=f"Consensus generated from: {providers}",
            score=confidence,
        )