# ══════════════════════════════════════════════════════════
#  engines/claude_client.py
#  Claude API caller dengan prompt caching aktif
# ══════════════════════════════════════════════════════════

import logging
from typing import Optional
import anthropic

from config import ANTHROPIC_API_KEY, CLAUDE_SONNET, CLAUDE_HAIKU

logger = logging.getLogger(__name__)

_client = anthropic.Anthropic(api_key=ANTHROPIC_API_KEY)


async def call_claude(user_message: str, system_prompt: str,
                      message, task: str = "title") -> Optional[str]:
    """
    system_prompt → cached (bayar 10% setelah hit)
    user_message  → fresh tiap request
    task: 'title' | 'meta' → Sonnet | 'article' → Haiku
    """
    model     = CLAUDE_HAIKU if task == "article" else CLAUDE_SONNET
    max_tokens = 4096 if task == "article" else 1024
    try:
        response = _client.messages.create(
            model=model,
            max_tokens=max_tokens,
            system=[{"type": "text", "text": system_prompt,
                     "cache_control": {"type": "ephemeral"}}],
            messages=[{"role": "user", "content": user_message}]
        )
        usage = response.usage
        if getattr(usage, 'cache_read_input_tokens', 0):
            logger.info(f"[CACHE HIT] read={usage.cache_read_input_tokens} in={usage.input_tokens} out={usage.output_tokens}")
        else:
            logger.info(f"[CACHE MISS] write={getattr(usage,'cache_creation_input_tokens',0)} in={usage.input_tokens} out={usage.output_tokens}")
        return response.content[0].text
    except anthropic.APIStatusError as e:
        logger.error(f"Claude API error: {e}")
        await message.reply_text(f"Claude API error\n`{e.message}`", parse_mode="Markdown")
        return None
    except Exception as e:
        logger.error(f"Claude unexpected: {e}")
        await message.reply_text(f"Unexpected error\n`{e}`", parse_mode="Markdown")
        return None
