# ══════════════════════════════════════════════════════════
#  engines/meta.py — Meta Desc Generator (Single + Bulk)
#  Input : URL / BRAND / TITLE TAG  (3 baris)
#  Output: 2 meta desc per URL
# ══════════════════════════════════════════════════════════

import asyncio
import logging
from telegram import InlineKeyboardButton, InlineKeyboardMarkup

from config import PROMPT_META, META_COUNT, BULK_SLEEP_SEC
from engines.utils import (load_prompt_file, call_ai, crawl_url,
                           build_meta_user_message, parse_meta_descs, parse_panel_score)

logger = logging.getLogger(__name__)


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


def _title_short(title: str, n: int = 55) -> str:
    return title[:n] + '…' if len(title) > n else title


# ══════════════════════════════════════════════════════════
#  SINGLE
# ══════════════════════════════════════════════════════════
async def generate_meta_single(message, context):
    try:
        system_prompt = load_prompt_file(PROMPT_META)
        web_context   = context.user_data.get('web_context') or crawl_url(context.user_data['url'])
        context.user_data['web_context'] = web_context
        ai            = context.user_data.get('ai_provider', 'claude')
        ai_tag        = '⚡ Claude' if ai == 'claude' else '🔮 Gemini'

        user_msg = build_meta_user_message(
            brand=context.user_data['brand'], url=context.user_data['url'],
            title=context.user_data['title'], web_context=web_context,
            phase=context.user_data['selected_phase'], tone=context.user_data['selected_tone'],
        )

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

        meta_descs = parse_meta_descs(response, META_COUNT)
        panel      = parse_panel_score(response)

        # ── Output ──────────────────────────────────────
        out  = f"*Meta Desc*  ·  {ai_tag}\n"
        out += f"`{context.user_data['brand']}`  ·  _{_title_short(context.user_data['title'])}_\n\n"

        if meta_descs:
            for i, (desc, chars) in enumerate(meta_descs):
                c = chars if chars else len(desc)
                out += f"`{i+1}`  {desc}\n_{c} karakter_\n\n"
        else:
            out += f"{response[:3000]}\n\n"

        if panel:
            out += f"_{panel}_"

        # Simpan untuk Full Content pipeline
        context.user_data['meta_options'] = meta_descs
        context.user_data['meta_raw']     = response

        is_full = context.user_data.get('workflow_mode') == 'FULL'
        if is_full and meta_descs:
            keyboard = _kb(
                *[[(f"✦  Meta {i+1}", f"select_meta_{i}")] for i in range(len(meta_descs))]
            )
        else:
            keyboard = _kb(
                [("↺  Regen", "regen_meta"), ("Menu", "menu_main")]
            )

        await message.reply_text(out.strip(), reply_markup=keyboard, parse_mode="Markdown")

        if not is_full:
            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"Meta single: {e}")
        await message.reply_text(f"Meta engine error\n`{e}`", parse_mode="Markdown")


# ══════════════════════════════════════════════════════════
#  BULK
# ══════════════════════════════════════════════════════════
async def generate_meta_bulk(message, context):
    try:
        bulk_data     = context.user_data.get('bulk_data', [])
        system_prompt = load_prompt_file(PROMPT_META)
        phase         = context.user_data['selected_phase']
        tone          = context.user_data['selected_tone']
        ai            = context.user_data.get('ai_provider', 'claude')
        ai_tag        = '⚡ Claude' if ai == 'claude' else '🔮 Gemini'

        for idx, item in enumerate(bulk_data):
            web_context = crawl_url(item['url'])
            user_msg    = build_meta_user_message(
                brand=item['brand'], url=item['url'], title=item['title'],
                web_context=web_context, phase=phase, tone=tone,
            )

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

            meta_descs = parse_meta_descs(response, META_COUNT)
            panel      = parse_panel_score(response)

            out  = f"*{idx+1}/{len(bulk_data)}*  ·  `{item['brand']}`\n"
            out += f"_{_title_short(item['title'])}_\n\n"

            if meta_descs:
                for i, (desc, chars) in enumerate(meta_descs):
                    c = chars if chars else len(desc)
                    out += f"`{i+1}`  {desc}\n_{c} karakter_\n\n"
            else:
                out += f"{response[:2500]}\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 meta selesai*\n{len(bulk_data)} domain  ·  {ai_tag}",
            reply_markup=_kb(
                [("Bulk Baru", "mode_META_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"Meta bulk: {e}")
        await message.reply_text(f"Bulk meta error\n`{e}`", parse_mode="Markdown")