#!/usr/bin/env python3
# api.py - Fixed API Calls berdasarkan CupidHelper
import time
import requests
import random
from datetime import datetime

class APIManager:
    def __init__(self):
        self.apis = {
            "groq": {
                "name": "Groq",
                "key": "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",
                "url": "https://api.groq.com/openai/v1/chat/completions",
                "model": "llama-3.1-8b-instant",  # 🆕 Model yang betul
                "active": True,
                "last_used": None
            },
            "deepseek": {
                "name": "DeepSeek", 
                "key": "sk-018cc05d3a574de68947e669673fdf65",
                "url": "https://api.deepseek.com/chat/completions",  # 🆕 URL yang betul
                "model": "deepseek-chat",
                "active": True,
                "last_used": None
            },
            "gemini": {
                "name": "Gemini",
                "key": "AIzaSyDVoBSniv6CtvNZDPxvPNRPfRXWvj3304M",
                "url": "https://generativelanguage.googleapis.com/v1/models/gemini-2.0-flash:generateContent",  # 🆕 URL yang betul
                "active": True,
                "last_used": None
            }
        }

        self.request_history = []
        self.fallback_order = ["groq", "deepseek", "gemini"]  # 🆕 Order berdasarkan CupidHelper

    def get_ai_response(self, prompt, bot_name="www", max_retries=2):
        """Get AI response dengan fallback - FIXED"""
        print(f"🤖 [{bot_name}] Requesting AI response...")

        for attempt in range(max_retries):
            for api_name in self.fallback_order:
                if self.apis[api_name]["active"]:
                    try:
                        response = self._call_api(api_name, prompt)
                        if response and len(response.strip()) > 3:
                            return response
                    except Exception as e:
                        print(f"❌ {api_name} failed: {e}")
                        self.apis[api_name]["active"] = False

            if attempt < max_retries - 1:
                print(f"🔄 Attempt {attempt + 1} failed, retrying...")
                time.sleep(1)

        return "Maaf, semua API sedang sibuk. Cuba sebentar lagi."

    def _call_api(self, api_name, prompt):
        """Call specific API - FIXED berdasarkan CupidHelper"""
        api_config = self.apis[api_name]

        try:
            if api_name == "groq":
                return self._call_groq(prompt, api_config)
            elif api_name == "deepseek":
                return self._call_deepseek(prompt, api_config)
            elif api_name == "gemini":
                return self._call_gemini(prompt, api_config)
        except Exception as e:
            print(f"❌ {api_name} error: {e}")
            raise

    def _call_groq(self, prompt, config):
        """Call Groq API - FIXED"""
        headers = {
            "Authorization": f"Bearer {config['key']}",
            "Content-Type": "application/json"
        }

        data = {
            "model": config["model"],  # 🆕 Gunakan model yang betul
            "messages": [
                {
                    "role": "user", 
                    "content": prompt
                }
            ],
            "temperature": 0.7,
            "max_tokens": 150
        }

        response = requests.post(config["url"], headers=headers, json=data, timeout=10)

        if response.status_code != 200:
            raise Exception(f"HTTP {response.status_code}: {response.text}")

        result = response.json()
        content = result["choices"][0]["message"]["content"].strip()

        config["last_used"] = time.time()
        self._log_request("groq", True, len(content))

        return self._trim_response(content)

    def _call_deepseek(self, prompt, config):
        """Call DeepSeek API - FIXED"""
        headers = {
            "Authorization": f"Bearer {config['key']}",
            "Content-Type": "application/json"
        }

        data = {
            "model": config["model"],
            "messages": [
                {
                    "role": "user",
                    "content": prompt
                }
            ],
            "temperature": 0.7,
            "max_tokens": 150
        }

        response = requests.post(config["url"], headers=headers, json=data, timeout=10)

        if response.status_code != 200:
            raise Exception(f"HTTP {response.status_code}: {response.text}")

        result = response.json()
        content = result["choices"][0]["message"]["content"].strip()

        config["last_used"] = time.time()
        self._log_request("deepseek", True, len(content))

        return self._trim_response(content)

    def _call_gemini(self, prompt, config):
        """Call Gemini API - FIXED"""
        url = f"{config['url']}?key={config['key']}"

        data = {
            "contents": [
                {
                    "parts": [
                        {"text": prompt}
                    ]
                }
            ],
            "generationConfig": {
                "maxOutputTokens": 150,
                "temperature": 0.7
            }
        }

        response = requests.post(url, json=data, timeout=10)

        if response.status_code != 200:
            raise Exception(f"HTTP {response.status_code}: {response.text}")

        result = response.json()
        content = result["candidates"][0]["content"]["parts"][0]["text"].strip()

        config["last_used"] = time.time()
        self._log_request("gemini", True, len(content))

        return self._trim_response(content)

    def _trim_response(self, text, max_length=200):
        """Trim response to max length"""
        if len(text) > max_length:
            text = text[:max_length-3] + "..."
        return text

    def _log_request(self, api_name, success, response_length):
        """Log API requests"""
        log_entry = {
            "timestamp": datetime.now(),
            "api": api_name,
            "success": success,
            "response_length": response_length
        }

        self.request_history.append(log_entry)

        if len(self.request_history) > 50:
            self.request_history.pop(0)

    def get_api_status(self):
        """Get status of all APIs"""
        status = {}
        for api_name, config in self.apis.items():
            status[api_name] = {
                "active": config["active"],
                "last_used": config["last_used"],
                "requests_count": len([r for r in self.request_history if r["api"] == api_name])
            }
        return status

# Global instance
api_manager = APIManager()