# ══════════════════════════════════════════════════════════
#  engines/title.py — Title Generator (Single + Bulk)
#  Input : URL / BRAND / KEYWORD  (3 baris)
#  Output: 3 title per URL
# ══════════════════════════════════════════════════════════

import asyncio
import logging
from telegram import InlineKeyboardButton, InlineKeyboardMarkup

from config import PROMPT_TITLE, TITLE_COUNT, BULK_SLEEP_SEC, TITLE_MODE_CONFIG
from engines.utils import (load_prompt_file, call_ai, crawl_url,
                           build_title_user_message, parse_titles)

logger = logging.getLogger(__name__)


def _apply_mode(keyword: str, mode: str):
    cfg = TITLE_MODE_CONFIG.get(mode, TITLE_MODE_CONFIG['BLEND'])
    if mode == 'PURE':
        return f"PURE {keyword}", ""
    return keyword, cfg['instruction']


def _kb(*rows):
    return InlineKeyboardMarkup(
        [[InlineKeyboardButton(t, callback_data=d) for t, d in row] for row in rows]
    )


# ══════════════════════════════════════════════════════════
#  SINGLE
# ══════════════════════════════════════════════════════════
async def generate_title_single(message, context):
    try:
        system_prompt = load_prompt_file(PROMPT_TITLE)
        web_context   = context.user_data.get('web_context') or crawl_url(context.user_data['url'])
        context.user_data['web_context'] = web_context

        mode                    = context.user_data.get('title_mode', 'BLEND')
        keyword, mode_ins       = _apply_mode(context.user_data['keyword'], mode)
        ai                      = context.user_data.get('ai_provider', 'claude')
        mode_label              = TITLE_MODE_CONFIG.get(mode, {}).get('label', '')

        user_msg = build_title_user_message(
            brand            = context.user_data['brand'],
            url              = context.user_data['url'],
            keyword          = keyword,
            web_context      = web_context,
            phase            = context.user_data['selected_phase'],
            tone             = context.user_data['selected_tone'],
            title_count      = TITLE_COUNT,
            mode_instruction = mode_ins,
            revision_note    = context.user_data.get('revision_note'),
        )

        response = await call_ai(user_msg, system_prompt, message, "title", ai)
        if not response:
            return

        titles, panel = parse_titles(response, TITLE_COUNT)
        context.user_data['titles'] = titles

        # ── Output ──────────────────────────────────────
        ai_tag = '⚡ Claude' if ai == 'claude' else '🔮 Gemini'
        out    = f"*Title*  ·  {ai_tag}  ·  {mode_label}\n\n"
        for i, t in enumerate(titles):
            out += f"`{i+1}`  {t}\n\n"
        if panel:
            out += f"_{panel}_"

        keyboard = _kb(
            *[[(f"✦  Opsi {i+1}", f"select_title_{i}")] for i in range(len(titles))],
            [("↺  Regen", "regen_title"), ("✎  Notes", "note_title")]
        )

        await message.reply_text(out.strip(), reply_markup=keyboard, parse_mode="Markdown")
        context.user_data['step'] = 'WAITING_TITLE_SELECTION'

    except FileNotFoundError as e:
        await message.reply_text(f"File tidak ditemukan\n`{e}`", parse_mode="Markdown")
    except Exception as e:
        logger.error(f"Title single: {e}")
        await message.reply_text(f"Title engine error\n`{e}`", parse_mode="Markdown")


# ══════════════════════════════════════════════════════════
#  BULK
# ══════════════════════════════════════════════════════════
async def generate_title_bulk(message, context):
    try:
        bulk_data     = context.user_data.get('bulk_data', [])
        system_prompt = load_prompt_file(PROMPT_TITLE)
        phase         = context.user_data['selected_phase']
        tone          = context.user_data['selected_tone']
        mode          = context.user_data.get('title_mode', 'BLEND')
        ai            = context.user_data.get('ai_provider', 'claude')
        mode_label    = TITLE_MODE_CONFIG.get(mode, {}).get('label', '')
        ai_tag        = '⚡ Claude' if ai == 'claude' else '🔮 Gemini'

        for idx, item in enumerate(bulk_data):
            web_context       = crawl_url(item['url'])
            keyword, mode_ins = _apply_mode(item['keyword'], mode)

            user_msg = build_title_user_message(
                brand=item['brand'], url=item['url'], keyword=keyword,
                web_context=web_context, phase=phase, tone=tone,
                title_count=TITLE_COUNT, mode_instruction=mode_ins,
            )

            response = await call_ai(user_msg, system_prompt, message, "title", ai)
            if not response:
                return

            titles, panel = parse_titles(response, TITLE_COUNT)

            out  = f"*{idx+1}/{len(bulk_data)}*  ·  `{item['brand']}`\n"
            out += f"_{item['keyword']}_\n\n"
            for i, t in enumerate(titles):
                out += f"`{i+1}`  {t}\n\n"
            if panel:
                out += f"_{panel}_"

            await message.reply_text(out.strip(), parse_mode="Markdown")
            if idx < len(bulk_data) - 1:
                await asyncio.sleep(BULK_SLEEP_SEC)

        await message.reply_text(
            f"*Bulk title selesai*\n{len(bulk_data)} domain  ·  {ai_tag}  ·  {mode_label}",
            reply_markup=_kb(
                [("Bulk Baru", "mode_TITLE_BULK"), ("Menu", "menu_main")]
            ), parse_mode="Markdown"
        )
        context.user_data.clear()

    except FileNotFoundError as e:
        await message.reply_text(f"File tidak ditemukan\n`{e}`", parse_mode="Markdown")
    except Exception as e:
        logger.error(f"Title bulk: {e}")
        await message.reply_text(f"Bulk title error\n`{e}`", parse_mode="Markdown")