"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.salesRedirector = exports.SalesRedirector = void 0;
/** Pitch hint templates per style */
const PITCH_HINTS = {
    subtle: [
        'Konuşma akışında doğal bir şekilde, kullanıcıya özel bir fotoğraf gönderebileceğini ima et. Baskıcı olma, sadece hafifçe değin.',
        'Kullanıcıyla sohbet ederken, güzel bir fotoğrafın olduğunu ve paylaşabileceğini nazikçe belirt.',
        'Konuşmanın doğal akışında, Stars ile özel içerik alabileceğini kısa ve zarif şekilde söyle.',
    ],
    playful: [
        'Eğlenceli ve flörtöz bir şekilde, kullanıcıya özel bir fotoğraf atabileceğini söyle. Emoji kullan, oyuncu ol. Örnek tarz: "sana güzel bi sürprizim var 😏"',
        'Şakacı bir üslupla kullanıcıya özel içerik öner. Merak uyandır ama baskıcı olma. Örnek tarz: "bi şey göstermek istiyorum ama cesaret edemiyorum 🙈"',
        'Oyuncu ve sevimli bir şekilde Stars ile fotoğraf gönderebileceğini belirt. Örnek tarz: "istersen güzel bi foto atabilirim ;)"',
    ],
    direct: [
        'Kullanıcıya doğrudan özel fotoğraf gönderebileceğini söyle. Net ve açık ol ama saygılı kal.',
        'Stars ile özel içerik alabileceğini açıkça belirt. Fiyatı ve ne alacağını kısaca açıkla.',
        'Kullanıcıya direkt olarak özel görsellerini Stars karşılığı paylaşabileceğini söyle.',
    ],
};
/**
 * Analyzes user interest level from conversation context.
 * Returns a score between 0 and 1.
 */
function analyzeInterestLevel(history) {
    const messages = history.messages;
    if (messages.length === 0)
        return 0;
    let score = 0;
    const recentMessages = messages.slice(-10);
    const userMessages = recentMessages.filter((m) => m.role === 'user');
    if (userMessages.length === 0)
        return 0;
    // More user messages = more engaged
    score += Math.min(userMessages.length / 10, 0.3);
    // Check for interest signals in recent user messages
    const interestKeywords = [
        'foto', 'fotoğraf', 'resim', 'görsel', 'gör', 'göster',
        'merak', 'ister', 'at', 'gönder', 'paylaş',
        'güzel', 'tatlı', 'seksi', 'çekici', 'hoş',
    ];
    const recentUserText = userMessages.map((m) => m.content.toLowerCase()).join(' ');
    const matchCount = interestKeywords.filter((kw) => recentUserText.includes(kw)).length;
    score += Math.min(matchCount * 0.1, 0.4);
    // Longer conversations indicate engagement
    score += Math.min(history.totalMessages / 50, 0.3);
    return Math.min(score, 1);
}
class SalesRedirector {
    /**
     * Checks if it's appropriate to make a sales pitch based on:
     * - Minimum message count before first pitch
     * - Cooldown time since last pitch
     * - User interest level
     */
    shouldPitch(history, profile) {
        const { min_messages_before_pitch, cooldown_minutes } = profile.salesBehavior;
        // Check minimum message count
        if (history.messages.length < min_messages_before_pitch) {
            return false;
        }
        // Check cooldown: find last pitch timestamp
        const lastPitch = this.findLastPitch(history);
        if (lastPitch) {
            const lastPitchTime = new Date(lastPitch.timestamp).getTime();
            const now = Date.now();
            const elapsedMinutes = (now - lastPitchTime) / (1000 * 60);
            if (elapsedMinutes < cooldown_minutes) {
                return false;
            }
        }
        // Check interest level - only pitch if user shows some engagement
        const interest = analyzeInterestLevel(history);
        if (interest < 0.1) {
            return false;
        }
        return true;
    }
    /**
     * Generates a hint/instruction for the AI to naturally include
     * a sales pitch in its response, matching the character's pitch style.
     */
    generatePitchHint(profile) {
        const style = profile.salesBehavior.pitch_style;
        const hints = PITCH_HINTS[style] ?? PITCH_HINTS['subtle'];
        const idx = Math.floor(Math.random() * hints.length);
        return hints[idx];
    }
    /**
     * Marks the last assistant message in the conversation as having a pitch.
     * Returns a new ConversationHistory (immutable).
     */
    recordPitch(history) {
        const messages = [...history.messages];
        // Find last assistant message
        for (let i = messages.length - 1; i >= 0; i--) {
            if (messages[i].role === 'assistant') {
                messages[i] = {
                    ...messages[i],
                    metadata: { ...messages[i].metadata, starsPitchMade: true },
                };
                break;
            }
        }
        return { ...history, messages };
    }
    /**
     * Marks the last pitch message as accepted.
     * Returns a new ConversationHistory (immutable).
     */
    recordAcceptance(history) {
        const messages = [...history.messages];
        // Find last assistant message with a pitch
        for (let i = messages.length - 1; i >= 0; i--) {
            if (messages[i].role === 'assistant' && messages[i].metadata?.starsPitchMade) {
                messages[i] = {
                    ...messages[i],
                    metadata: { ...messages[i].metadata, starsAccepted: true },
                };
                break;
            }
        }
        return { ...history, messages };
    }
    /**
     * Returns conversion stats from the conversation history.
     */
    getConversionStats(history) {
        let pitches = 0;
        let acceptances = 0;
        for (const msg of history.messages) {
            if (msg.metadata?.starsPitchMade) {
                pitches++;
            }
            if (msg.metadata?.starsAccepted) {
                acceptances++;
            }
        }
        const rate = pitches > 0 ? acceptances / pitches : 0;
        return { pitches, acceptances, rate };
    }
    /** Find the last message that had a pitch */
    findLastPitch(history) {
        for (let i = history.messages.length - 1; i >= 0; i--) {
            if (history.messages[i].metadata?.starsPitchMade) {
                return history.messages[i];
            }
        }
        return null;
    }
}
exports.SalesRedirector = SalesRedirector;
/** Singleton instance */
exports.salesRedirector = new SalesRedirector();
//# sourceMappingURL=sales-redirect.js.map