/* === Popup messagerie privee, charge depuis auth-nav.php pour les utilisateurs connectes === */
/* Configuration (API, MOI_ID) injectee par PHP via window.__MESSAGERIE_CONFIG juste avant ce script. */
/* L'API renvoie is_admin sur les contacts/messages : on n'expose plus l'ADMIN_ID cote client. */

(function(){
  var cfg = window.__MESSAGERIE_CONFIG || {}, API = cfg.API, MOI_ID = cfg.MOI_ID;
  var overlay=document.getElementById('mp-overlay'),btn=document.getElementById('auth-msg-link'),badge=document.getElementById('auth-msg-badge');
  var contactsEl=document.getElementById('mp-contacts'),convEl=document.getElementById('mp-conv');
  var msgsEl=document.getElementById('mp-messages'),inputEl=document.getElementById('mp-input');
  var convNameEl=document.getElementById('mp-conv-name');
  var addInput=document.getElementById('mp-add-input'),addBtn=document.getElementById('mp-add-btn'),addMsg=document.getElementById('mp-add-msg');
  var bloquesEl=document.getElementById('mp-bloques'),bloquesToggle=document.getElementById('mp-bloques-toggle');
  var voirBloques=false;
  var contactActif=null,dernierMsgId=0,polling=null;

  function esc(s){var d=document.createElement('div');d.textContent=s;return d.innerHTML}
  function linkify(s){var e=esc(s);e=e.replace(/(https?:\/\/[^\s<>"']+)/g,function(u){var t='';while(/[.,;:!?)\]}>]$/.test(u)){t=u.slice(-1)+t;u=u.slice(0,-1)}return '<a href="'+u+'" target="_blank" rel="noopener noreferrer nofollow">'+u+'</a>'+t});return e.replace(/\n/g,'<br>')}
  function api(action,params){return API+'?action='+action+(params||'')}
  function apiPost(action,body){return fetch(API+'?action='+action,{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify(body)})}

  // Toggle popup
  btn.addEventListener('click',function(e){e.preventDefault();e.stopPropagation();if(overlay.style.display==='none'){overlay.style.display='';chargerContacts()}else{fermer()}});
  document.getElementById('mp-close').addEventListener('click',fermer);
  overlay.addEventListener('click',function(e){if(e.target===overlay)fermer()});

  function fermer(){overlay.style.display='none';clearInterval(polling);contactActif=null;convEl.style.display='none';contactsEl.style.display='';bloquesEl.style.display='none';voirBloques=false;bloquesToggle.textContent='Bloqu\u00e9s'}

  // Contacts
  function chargerContacts(){
    if(!contactActif)contactsEl.innerHTML='<div class="mp-empty">Chargement...</div>';
    fetch(api('contacts')).then(function(r){return r.json()}).then(function(d){
      if(!d.contacts){contactsEl.innerHTML='<div class="mp-empty">Erreur de chargement</div>';return}
      var total=0;
      contactsEl.innerHTML='';
      if(d.contacts.length===0){contactsEl.innerHTML='<div class="mp-empty">Aucun contact</div>';return}
      var adminNonLu=false;
      d.contacts.forEach(function(c){
        total+=c.non_lus;
        if(c.is_admin&&c.non_lus>0&&MOI_ID!==1)adminNonLu=true;
        var isAdmin=!!c.is_admin;
        var nom=isAdmin?c.pseudo+' (Admin)':c.pseudo;
        var cls='mp-contact-item'+(contactActif===c.contact_id?' active':'')+(isAdmin?' admin':'');
        var html='<div class="'+cls+'" data-id="'+c.contact_id+'" data-pseudo="'+esc(c.pseudo)+'" data-is-admin="'+(isAdmin?'1':'0')+'">';
        html+='<span class="mp-contact-name">'+esc(nom)+'</span>';
        if(c.non_lus>0)html+='<span class="mp-contact-badge">'+c.non_lus+'</span>';
        else if(MOI_ID===1&&c.non_lus_envoyes===0)html+='<span class="mp-contact-dot-lu" title="Conversation entierement lue"></span>';
        html+='</div>';
        contactsEl.insertAdjacentHTML('beforeend',html);
      });
      contactsEl.querySelectorAll('.mp-contact-item').forEach(function(el){
        el.addEventListener('click',function(){ouvrirConv(parseInt(el.dataset.id),el.dataset.pseudo,el.dataset.isAdmin==='1')})
      });
      majBadge(total,adminNonLu);
    }).catch(function(e){console.error('MP contacts:',e);contactsEl.innerHTML='<div class="mp-empty">Erreur de connexion</div>'})
  }

  function majBadge(n,adminNonLu){
    if(n>0){badge.textContent=n;badge.style.display='';btn.classList.add('has-unread')}
    else{badge.style.display='none';btn.classList.remove('has-unread')}
    if(adminNonLu)btn.classList.add('has-admin-unread');
    else btn.classList.remove('has-admin-unread');
  }

  // Conversation
  function ouvrirConv(uid,pseudo,isAdmin){
    contactActif=uid;dernierMsgId=0;
    convNameEl.textContent=isAdmin?pseudo+' (Admin)':pseudo;
    convNameEl.className='mp-conv-name'+(isAdmin?' admin':'');
    contactsEl.style.display='none';convEl.style.display='flex';
    msgsEl.innerHTML='';inputEl.focus();
    chargerMessages();
    clearInterval(polling);polling=setInterval(pollMessages,3000);
  }

  document.getElementById('mp-back').addEventListener('click',function(){
    contactActif=null;clearInterval(polling);
    convEl.style.display='none';contactsEl.style.display='';
    chargerContacts();
  });

  // Bloquer
  document.getElementById('mp-block-btn').addEventListener('click',function(){
    if(!contactActif)return;
    if(!confirm('Bloquer cet utilisateur ? Il ne pourra plus vous envoyer de messages et sera retiré de vos contacts.'))return;
    apiPost('bloquer',{bloque_id:contactActif}).then(function(r){return r.json()}).then(function(d){
      if(d.ok){contactActif=null;clearInterval(polling);convEl.style.display='none';contactsEl.style.display='';chargerContacts()}
    }).catch(function(){});
  });

  // Signaler (clic sur drapeau)
  msgsEl.addEventListener('click',function(e){
    var flag=e.target.closest('.mp-flag');
    if(!flag)return;
    e.stopPropagation();
    var id=parseInt(flag.dataset.id);
    var motif=prompt('Motif du signalement :');
    if(!motif||!motif.trim())return;
    apiPost('signaler',{message_id:id,motif:motif.trim()}).then(function(r){return r.json()}).then(function(d){
      if(d.ok){var bulle=flag.closest('.mp-bulle');if(bulle){bulle.style.opacity='0.5'}flag.remove()}
      else if(d.error)alert(d.error);
    }).catch(function(){});
  });

  function chargerMessages(){
    fetch(api('messages','&avec='+contactActif)).then(function(r){return r.json()}).then(function(d){
      if(!d.messages)return;
      renderMessages(d.messages);
      if(d.messages.length>0)dernierMsgId=Math.max.apply(null,d.messages.map(function(m){return m.id}));
      chargerContacts();
    }).catch(function(){})
  }

  function pollMessages(){
    if(!contactActif)return;
    fetch(api('nouveaux','&avec='+contactActif+'&apres='+dernierMsgId)).then(function(r){return r.json()}).then(function(d){
      if(d.messages&&d.messages.length>0){
        appendMessages(d.messages);
        dernierMsgId=Math.max.apply(null,d.messages.map(function(m){return m.id}));
        chargerContacts();
      }
    }).catch(function(){})
  }

  function renderMessages(msgs){
    msgsEl.innerHTML='';
    if(msgs.length===0){msgsEl.innerHTML='<div class="mp-empty">Aucun message</div>';return}
    var lastD='';
    msgs.forEach(function(m){var d=m.date_envoi.substring(0,10);if(d!==lastD){lastD=d;msgsEl.insertAdjacentHTML('beforeend','<div class="mp-date-sep">'+fmtDate(d)+'</div>')}msgsEl.insertAdjacentHTML('beforeend',buildBulle(m))});
    msgsEl.scrollTop=msgsEl.scrollHeight;
  }

  function appendMessages(msgs){
    var em=msgsEl.querySelector('.mp-empty');if(em)em.remove();
    msgs.forEach(function(m){msgsEl.insertAdjacentHTML('beforeend',buildBulle(m))});
    msgsEl.scrollTop=msgsEl.scrollHeight;
  }

  function buildBulle(m){
    var moi=m.expediteur_id===MOI_ID,adm=!!m.is_admin;
    var cls='mp-bulle '+(moi?'moi':'autre');if(adm)cls+=' admin';
    var h=m.date_envoi.substring(11,16);
    var dataId=!moi?' data-id="'+m.id+'"':'';
    var flag=!moi?'<button class="mp-flag" data-id="'+m.id+'" title="Signaler ce message">&#128681;</button>':'';
    return '<div class="'+cls+'"'+dataId+'>'+(adm&&!moi?'<div class="mp-admin-tag">Admin</div>':'')+linkify(m.contenu)+'<div class="mp-heure">'+h+flag+'</div></div>';
  }

  function fmtDate(iso){
    var M=['janvier','f\u00e9vrier','mars','avril','mai','juin','juillet','ao\u00fbt','septembre','octobre','novembre','d\u00e9cembre'];
    var p=iso.split('-'),a=new Date();a.setHours(0,0,0,0);var d=new Date(+p[0],p[1]-1,+p[2]);d.setHours(0,0,0,0);
    var diff=Math.round((a-d)/864e5);if(diff===0)return"Aujourd'hui";if(diff===1)return'Hier';
    return+p[2]+' '+M[+p[1]-1]+' '+p[0];
  }

  // Envoi
  function envoyer(){
    var c=inputEl.value.trim();if(!c||!contactActif)return;
    document.getElementById('mp-send').disabled=true;
    apiPost('envoyer',{destinataire_id:contactActif,contenu:c}).then(function(r){return r.json()}).then(function(d){
      document.getElementById('mp-send').disabled=false;
      if(d.ok){inputEl.value='';inputEl.style.height='auto';appendMessages([d.message]);dernierMsgId=d.message.id}
    }).catch(function(){document.getElementById('mp-send').disabled=false});
    inputEl.focus();
  }
  document.getElementById('mp-send').addEventListener('click',envoyer);
  inputEl.addEventListener('keydown',function(e){if(e.key==='Enter'&&!e.shiftKey){e.preventDefault();envoyer()}});
  inputEl.addEventListener('input',function(){inputEl.style.height='auto';inputEl.style.height=Math.min(inputEl.scrollHeight,80)+'px'});

  // Ajouter contact
  addBtn.addEventListener('click',ajouterContact);
  addInput.addEventListener('keydown',function(e){if(e.key==='Enter')ajouterContact()});
  function ajouterContact(){
    var p=addInput.value.trim();if(!p)return;addBtn.disabled=true;
    apiPost('ajouter',{pseudo:p}).then(function(r){return r.json()}).then(function(d){
      addBtn.disabled=false;
      if(d.error){addMsg.style.color='#f87171';addMsg.textContent=d.error}
      else{addMsg.style.color='#6ee7b7';addMsg.textContent=p+' ajout\u00e9 !';addInput.value='';chargerContacts()}
      setTimeout(function(){addMsg.textContent=''},3000);
    }).catch(function(){addBtn.disabled=false});
  }

  // Toggle liste bloqués
  bloquesToggle.addEventListener('click',function(){
    voirBloques=!voirBloques;
    if(voirBloques){contactsEl.style.display='none';bloquesEl.style.display='';chargerBloques();bloquesToggle.textContent='Contacts'}
    else{bloquesEl.style.display='none';contactsEl.style.display='';bloquesToggle.textContent='Bloqu\u00e9s'}
  });
  function chargerBloques(){
    bloquesEl.innerHTML='<div class="mp-empty">Chargement...</div>';
    fetch(api('bloques')).then(function(r){return r.json()}).then(function(d){
      if(!d.bloques||d.bloques.length===0){bloquesEl.innerHTML='<div class="mp-empty">Aucun utilisateur bloqu\u00e9</div>';return}
      bloquesEl.innerHTML='';
      d.bloques.forEach(function(b){
        var html='<div class="mp-bloque-item"><span>'+esc(b.pseudo)+'</span><button class="mp-unblock-btn" data-id="'+b.bloque_id+'">D\u00e9bloquer</button></div>';
        bloquesEl.insertAdjacentHTML('beforeend',html);
      });
      bloquesEl.querySelectorAll('.mp-unblock-btn').forEach(function(btn){
        btn.addEventListener('click',function(){
          apiPost('debloquer',{bloque_id:parseInt(btn.dataset.id)}).then(function(r){return r.json()}).then(function(d){
            if(d.ok)chargerBloques();
          });
        });
      });
    }).catch(function(){bloquesEl.innerHTML='<div class="mp-empty">Erreur</div>'});
  }

  // Polling badge (même quand popup fermé)
  function pollBadge(){
    fetch(api('contacts')).then(function(r){return r.json()}).then(function(d){
      if(!d.contacts)return;
      var n=0,adm=false;
      d.contacts.forEach(function(c){n+=c.non_lus;if(c.is_admin&&c.non_lus>0&&MOI_ID!==1)adm=true});
      majBadge(n,adm);
    }).catch(function(){})
  }
  setInterval(pollBadge,30000);

  // Emoji picker
  var emojis=['\u{1F600}','\u{1F602}','\u{1F605}','\u{1F609}','\u{1F60A}','\u{1F60D}','\u{1F618}','\u{1F61C}','\u{1F60E}','\u{1F913}','\u{1F914}','\u{1F92D}','\u{1F631}','\u{1F622}','\u{1F62D}','\u{1F621}','\u{1F525}','\u{2764}','\u{1F44D}','\u{1F44E}','\u{1F44C}','\u{1F44F}','\u{1F64F}','\u{1F4AA}','\u{1F389}','\u{1F3AE}','\u{1F3C6}','\u{2B50}','\u{1F4A1}','\u{1F4AC}','\u{2705}','\u{274C}','\u{2753}','\u{1F4A9}','\u{1F680}','\u{1F308}'];
  var emojiBtn=document.getElementById('mp-emoji-btn'),emojiPicker=document.getElementById('mp-emoji-picker');
  emojis.forEach(function(e){var s=document.createElement('span');s.className='mp-emoji-item';s.textContent=e;s.addEventListener('click',function(){var i=inputEl,start=i.selectionStart,end=i.selectionEnd;i.value=i.value.substring(0,start)+e+i.value.substring(end);i.selectionStart=i.selectionEnd=start+e.length;i.focus()});emojiPicker.appendChild(s)});
  emojiBtn.addEventListener('click',function(e){e.stopPropagation();emojiPicker.style.display=emojiPicker.style.display==='none'?'':'none'});
  document.addEventListener('click',function(e){if(!emojiPicker.contains(e.target)&&e.target!==emojiBtn)emojiPicker.style.display='none'});
})();
