"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.isInAiConsultation = isInAiConsultation;
exports.cancelAiConsultation = cancelAiConsultation;
exports.getAiState = getAiState;
exports.startAiConsultation = startAiConsultation;
exports.handleAiMessage = handleAiMessage;
exports.handleOrderNow = handleOrderNow;
const generative_ai_1 = require("@google/generative-ai");
const grammy_1 = require("grammy");
const config_1 = require("../config");
const Lead_1 = require("../models/Lead");
const ServiceCategory_1 = require("../models/ServiceCategory");
const Service_1 = require("../models/Service");
const adminBot_1 = require("../adminBot");
const aiStates = new Map();
function isInAiConsultation(userId) {
    return aiStates.has(userId);
}
function cancelAiConsultation(userId) {
    aiStates.delete(userId);
}
function getAiState(userId) {
    return aiStates.get(userId);
}
// ─── Tombol yang selalu tampil setelah respons AI ─────────────────────────────
function getConsultKeyboard() {
    return new grammy_1.InlineKeyboard()
        .text("📋 Pesan Sekarang", "order_now")
        .text("❌ Akhiri Konsultasi", "cancel_ai_consult");
}
// ─── System prompt ────────────────────────────────────────────────────────────
function buildSystemPrompt() {
    const categories = ServiceCategory_1.ServiceCategoryModel.getAll();
    let servicesInfo = "";
    for (const cat of categories) {
        const pkgs = Service_1.ServiceModel.getByCategory(cat.slug);
        servicesInfo += `\n${cat.icon} ${cat.name}:\n`;
        for (const pkg of pkgs) {
            servicesInfo += `  - ${pkg.name}: ${pkg.price}\n`;
        }
    }
    return `Kamu adalah konsultan sales profesional dari JD Technolody, perusahaan pengembang software Indonesia.

LAYANAN & HARGA:
${servicesInfo}

KEPRIBADIAN:
- Profesional, ramah, dan responsif
- Berbicara dalam Bahasa Indonesia
- Jawaban detail dan helpful
- Selalu promosikan layanan JD Technolody secara natural
- Jangan sebut kompetitor

TUGASMU:
Bantu user memahami kebutuhan project mereka dan jelaskan layanan JD Technolody yang sesuai.
Kamu hanya fokus pada topik:
- Kebutuhan project software (website, aplikasi, bot telegram)
- Layanan dan harga JD Technolody
- Estimasi waktu dan biaya pengerjaan
- Saran teknis terkait project

Jika user bertanya di luar topik tersebut, arahkan kembali ke konsultasi project.

Di setiap respons, tanyakan hal yang relevan untuk memahami kebutuhan user lebih dalam.
User bisa chat sepuasnya — tidak ada batas percakapan.
Jangan menyebut bahwa percakapan akan direkam atau data akan disimpan.`;
}
// ─── Buat Gemini model ────────────────────────────────────────────────────────
function getModel() {
    const genAI = new generative_ai_1.GoogleGenerativeAI(config_1.config.GEMINI_API_KEY);
    return genAI.getGenerativeModel({
        model: "gemini-2.5-flash",
        systemInstruction: buildSystemPrompt(),
    });
}
// ─── Kirim pesan ke Gemini ────────────────────────────────────────────────────
async function sendToGemini(state, userMessage) {
    const model = getModel();
    const chat = model.startChat({ history: state.history });
    const result = await chat.sendMessage(userMessage);
    const text = result.response.text();
    state.history.push({ role: "user", parts: [{ text: userMessage }] });
    state.history.push({ role: "model", parts: [{ text }] });
    // Batasi history max 30 pasang pesan
    if (state.history.length > 60) {
        state.history.splice(0, 2);
    }
    return text;
}
// ─── Mulai konsultasi AI ──────────────────────────────────────────────────────
async function startAiConsultation(ctx) {
    if (ctx.callbackQuery) {
        try {
            await ctx.deleteMessage();
        }
        catch (_) { }
    }
    if (!config_1.config.GEMINI_API_KEY) {
        await ctx.reply("⚠️ Fitur AI sedang tidak tersedia. Silakan hubungi admin untuk konsultasi.", {
            reply_markup: new grammy_1.InlineKeyboard().url("💬 Hubungi Admin", "https://t.me/jdtechnolody"),
        });
        return;
    }
    const userId = ctx.from.id;
    const firstName = ctx.from.first_name;
    aiStates.set(userId, { history: [] });
    const state = aiStates.get(userId);
    await ctx.reply("🤖 _Menghubungkan ke konsultan AI..._", { parse_mode: "Markdown" });
    try {
        const reply = await sendToGemini(state, `Halo, saya ${firstName} ingin konsultasi tentang project.`);
        await ctx.reply(reply, {
            parse_mode: "Markdown",
            reply_markup: getConsultKeyboard(),
        });
    }
    catch (err) {
        console.error("[AI] Error:", err.message);
        await ctx.reply("⚠️ Konsultan AI sedang sibuk. Coba lagi atau hubungi admin langsung.", {
            reply_markup: new grammy_1.InlineKeyboard().url("💬 Hubungi Admin", "https://t.me/jdtechnolody"),
        });
        aiStates.delete(userId);
    }
}
// ─── Terima pesan user saat konsultasi ───────────────────────────────────────
async function handleAiMessage(ctx) {
    const userId = ctx.from.id;
    const state = aiStates.get(userId);
    if (!state || !ctx.message?.text)
        return;
    try {
        await ctx.api.sendChatAction(ctx.chat.id, "typing");
    }
    catch (_) { }
    try {
        const reply = await sendToGemini(state, ctx.message.text.trim());
        await ctx.reply(reply, {
            parse_mode: "Markdown",
            reply_markup: getConsultKeyboard(),
        });
    }
    catch (err) {
        console.error("[AI] Error:", err.message);
        await ctx.reply("⚠️ Terjadi kesalahan. Coba ulangi pesan Anda.");
    }
}
// ─── Tombol Pesan Sekarang ────────────────────────────────────────────────────
async function handleOrderNow(ctx) {
    const userId = ctx.from.id;
    const state = aiStates.get(userId);
    const from = ctx.from;
    try {
        await ctx.deleteMessage();
    }
    catch (_) { }
    // Buat ringkasan dari history percakapan untuk disimpan sebagai lead
    let conversationSummary = "Konsultasi via AI";
    if (state && state.history.length > 0) {
        // Ambil teks dari history untuk ringkasan
        const userMessages = state.history
            .filter((h) => h.role === "user")
            .map((h) => h.parts[0]?.text || "")
            .filter(Boolean)
            .join(" | ");
        if (userMessages)
            conversationSummary = userMessages.substring(0, 500);
    }
    const name = `${from.first_name}${from.last_name ? " " + from.last_name : ""}`;
    try {
        Lead_1.LeadModel.create({
            telegramId: from.id,
            username: from.username,
            name,
            serviceType: "other",
            projectName: "Konsultasi AI",
            features: conversationSummary,
            deadline: "Akan didiskusikan",
            budget: "Akan didiskusikan",
        });
    }
    catch (_) { }
    // Notifikasi admin dengan ringkasan percakapan
    const adminMsg = `🔔 *LEAD PESAN SEKARANG!*\n\n` +
        `👤 Nama: *${name}*\n` +
        `📱 @${from.username || "-"} (ID: ${from.id})\n\n` +
        `💬 *Ringkasan Konsultasi:*\n${conversationSummary.substring(0, 300)}\n\n` +
        `🕐 ${new Date().toLocaleString("id-ID")}\n` +
        `🏷 Status: *HOT LEAD*`;
    const kb = new grammy_1.InlineKeyboard();
    if (from.username)
        kb.url("💬 Chat Telegram", `https://t.me/${from.username}`);
    await (0, adminBot_1.notifyAdmin)(ctx.api, adminMsg, kb.inline_keyboard.length ? kb : undefined);
    aiStates.delete(userId);
    await ctx.reply(`✅ *Permintaan Anda sudah diterima!*\n\n` +
        `Tim JD Technolody akan segera menghubungi Anda untuk diskusi lebih lanjut dan penawaran resmi.\n\n` +
        `_Estimasi respon: dalam 1×24 jam pada hari kerja._`, {
        parse_mode: "Markdown",
        reply_markup: new grammy_1.InlineKeyboard()
            .url("💬 Hubungi Admin Langsung", "https://t.me/jdtechnolody"),
    });
}
