/**
 * ui-renderer.js - Moteur Visuel (Version Dense & Sécurisée)
 * Ghost Buster : interception DOM et remplacement VIP (anti-texte fantôme).
 */
import { Translations } from './i18n.js';
import { AvisionState } from './state.js';

/** Texte VIP de remplacement (anti-ghost) lorsque "Bonjour London" ou "ravis de vous accueillir" est détecté. */
const VIP_REPLACEMENT_TEXT = "🌟 Ravi de vous voir ici ! Découvrez AVI SEO Local Consultant à London. Nous sommes là pour vous avec le sourire — notre équipe Marketing vous accueille toute l'année. Chaque avis compte pour nous ! À très bientôt ! #AvisClients #Recommandation #Marketing";

/** Message discret pendant l’optimisation automatique. */
const MSG_AVI_OPTIMISE = "AVI optimise le contenu pour votre fiche...";

/** Patterns d’URL d’image par défaut (graphique / ancien fallback) pour forcer "Changer la Photo". */
const DEFAULT_IMAGE_PATTERNS = [
    'photo-1560472354-b33ff0c44a43',
    'analytics',
    'chart',
    'graph',
    'google.com/chart'
];

function hasGhostContent(content) {
    if (typeof content !== 'string') return false;
    const lower = content.toLowerCase();
    return lower.indexOf('bonjour london') !== -1 || lower.indexOf('ravis de vous accueillir') !== -1;
}

function isDefaultImage(imageUrl) {
    if (typeof imageUrl !== 'string' || !imageUrl) return false;
    const lower = imageUrl.toLowerCase();
    return DEFAULT_IMAGE_PATTERNS.some(function (p) { return lower.indexOf(p) !== -1; });
}

function showOptimizeMessage(container) {
    const el = document.getElementById('avision-optimize-message');
    if (el) {
        el.textContent = MSG_AVI_OPTIMISE;
        el.style.display = '';
        return;
    }
    const msg = document.createElement('div');
    msg.id = 'avision-optimize-message';
    msg.setAttribute('role', 'status');
    msg.setAttribute('aria-live', 'polite');
    msg.style.cssText = 'font-size:12px;color:#64748b;margin-top:6px;';
    msg.textContent = MSG_AVI_OPTIMISE;
    const parent = container && container.parentNode ? container.parentNode : document.body;
    if (container && container.nextSibling) {
        parent.insertBefore(msg, container.nextSibling);
    } else {
        parent.appendChild(msg);
    }
}

function hideOptimizeMessage() {
    const el = document.getElementById('avision-optimize-message');
    if (el) el.style.display = 'none';
}

/**
 * Retourne le texte VIP si le contenu contient un motif fantôme, sinon le contenu inchangé.
 * @param {string} content
 * @returns {string}
 */
export function sanitizeVipContent(content) {
    if (typeof content !== 'string') return content;
    if (hasGhostContent(content)) return VIP_REPLACEMENT_TEXT;
    return content;
}

/**
 * À appeler lorsque le volet de validation affiche un post (données chargées).
 * Si le texte contient un fantôme → affiche "AVI optimise..." et dispatch avision-auto-regenerate-post.
 * Si l’image est l’image par défaut → dispatch avision-auto-change-photo.
 * @param {Object} opts - { content: string, imageUrl?: string, postId?: number, auditId?: number, textareaOrContainer?: HTMLElement }
 */
export function onValidationPanelPostRendered(opts) {
    const content = opts && opts.content;
    const imageUrl = opts && opts.imageUrl;
    const postId = opts && opts.postId;
    const auditId = opts && opts.auditId;
    const container = opts && opts.textareaOrContainer;

    if (hasGhostContent(content)) {
        showOptimizeMessage(container || document.getElementById('validation-post-textarea'));
        document.dispatchEvent(new CustomEvent('avision-auto-regenerate-post', {
            detail: { reason: 'ghost', postId, auditId, content }
        }));
        if (typeof window.avisionRegeneratePost === 'function') {
            window.avisionRegeneratePost(auditId, postId);
        }
    }

    if (isDefaultImage(imageUrl)) {
        document.dispatchEvent(new CustomEvent('avision-auto-change-photo', {
            detail: { reason: 'default_image', imageUrl, postId, auditId }
        }));
        if (typeof window.avisionChangePhoto === 'function') {
            window.avisionChangePhoto(auditId, postId);
        }
    }
}

/**
 * Initialise le Ghost Buster : MutationObserver + listeners sur #validation-post-textarea.
 * Au rendu, si fantôme détecté : remplacement VIP + message "AVI optimise..." + dispatch pour auto-régénération.
 */
function initGhostBuster() {
    try {
        if (typeof localStorage !== 'undefined') localStorage.clear();
        if (typeof sessionStorage !== 'undefined') sessionStorage.clear();
    } catch (e) { /* ignore */ }
    const textarea = document.getElementById('validation-post-textarea');
    if (!textarea) return;

    const applySanitize = () => {
        const val = textarea.value;
        const sanitized = sanitizeVipContent(val);
        if (sanitized !== val) {
            textarea.value = sanitized;
            showOptimizeMessage(textarea);
            const auditId = parseInt(textarea.getAttribute('data-audit-id'), 10) || 0;
            const postId = parseInt(textarea.getAttribute('data-post-id'), 10) || 0;
            document.dispatchEvent(new CustomEvent('avision-auto-regenerate-post', {
                detail: { reason: 'ghost', postId, auditId, content: val }
            }));
            if (typeof window.avisionRegeneratePost === 'function') {
                window.avisionRegeneratePost(auditId, postId);
            }
        } else {
            hideOptimizeMessage();
        }
    };

    textarea.addEventListener('input', applySanitize);
    textarea.addEventListener('change', applySanitize);

    const observer = new MutationObserver(() => {
        applySanitize();
    });
    observer.observe(textarea, { attributes: true, attributeFilter: ['value'], subtree: false });
    applySanitize();
}

if (typeof document !== 'undefined') {
    if (document.readyState === 'loading') {
        document.addEventListener('DOMContentLoaded', initGhostBuster);
    } else {
        initGhostBuster();
    }
}

export const UIRenderer = {

    /** Filtre VIP : à appeler quand le volet de validation affiche un post (voir onValidationPanelPostRendered). */
    onValidationPanelPostRendered: onValidationPanelPostRendered,
    hideOptimizeMessage: hideOptimizeMessage,
    hasGhostContent: hasGhostContent,
    isDefaultImage: isDefaultImage,

    updateLanguage: function(lang) {
        const dico = Translations ? Translations[lang] : null;
        if (!dico) console.warn("Avision: Missing translations for " + lang);

        jQuery('[data-i18n]').each(function() {
            const $el = jQuery(this);
            const key = $el.data('i18n');
            
            let finalKey = key;
            if (key === 'lvl1_verify_btn' && AvisionState.data.lvl1Done) {
                finalKey = 'lvl1_verified_btn';
            }

            if (dico && dico[finalKey]) {
                if ($el.is('input') || $el.is('textarea')) {
                    $el.attr('placeholder', dico[finalKey]);
                } else {
                    $el.html(dico[finalKey]);
                }
            }
        });

        jQuery('.header-flag').removeClass('active');
        jQuery(`.header-flag[data-lang="${lang}"]`).addClass('active');
    },

    clearChat: function() {
        jQuery('#chatBody').empty();
    },

    toggleAccordion: function(id) {
        const contentId = '#' + id + '-content';
        const chevronId = '#chevron-' + id;
        
        const $content = jQuery(contentId);
        const $chevron = jQuery(chevronId);
        
        console.log(`Avision Renderer: Toggle ${id}`, $content.length ? "Found" : "Not Found");

        if ($content.hasClass('is-open')) {
            $content.removeClass('is-open');
            $chevron.css('transform', 'rotate(0deg)');
        } else {
            $content.addClass('is-open');
            $chevron.css('transform', 'rotate(180deg)');
        }
    },

    showFeedback: function(elId, msg, success = true) {
        const $el = jQuery('#' + elId);
        $el.html(msg).show();
        $el.css('color', success ? '#10b981' : '#ef4444');
    },

    addChatMessage: function(sender, text) {
        const $body = jQuery('#chatBody');
        const style = sender === 'avi' 
            ? 'background:white; border:1px solid #e2e8f0; align-self:flex-start;' 
            : 'background:#3b82f6; color:white; align-self:flex-end;';
            
        // Convert markdown **bold** to HTML
        const rendered = text
            .replace(/\*\*([^*]+)\*\*/g, '<strong>$1</strong>')
            .replace(/\*([^*]+)\*/g, '<em>$1</em>');
        const html = `<div class="msg" style="padding:10px 15px; border-radius:12px; margin-bottom:8px; max-width:85%; ${style}">${rendered}</div>`;
        $body.append(html);
        $body.scrollTop($body[0].scrollHeight);
    }
};
