// جلوگیری از دوبار لود شدن
if (window.__CHAT_APP_LOADED__) {
  console.warn("Chat app already loaded");
} else {
  window.__CHAT_APP_LOADED__ = true;

  /* =========================
     STATE
  ========================== */
  let lastId = 0;

  const EMOJIS = [
    "😀","😁","😂","🤣","😊","😍","🥰","😘","😎","🤩","🤔","😅","😭","😡",
    "👍","👎","👏","🙏","🔥","❤️","💯","✨","🎉","📎"
  ];

  /* =========================
     HELPERS
  ========================== */
function formatTime(iso){
  try {
    // اضافه کردن 'Z' برای اجبار به تفسیر به عنوان UTC، با فرض اینکه زمان دریافتی UTC است
    const utcIso = iso.endsWith('Z') ? iso : iso + 'Z'; 
    
    const dateObj = new Date(utcIso); 
    
    return dateObj.toLocaleTimeString("fa-IR", {
      hour: "2-digit",
      minute: "2-digit",
      hour12: false,
      timeZone: 'Asia/Tehran' 
    });
  } catch (e) {
    console.error("Time Formatting Error:", e);
    return "";
  }
}


  function clearMessages(){
    lastId = 0;
    const box = document.getElementById("messages");
    if (box) box.innerHTML = "";
  }

  function setTitle(t){
    const el = document.getElementById("chatTitle");
    if (el) el.textContent = t;
  }

  function setStatus(t){
    const el = document.getElementById("status");
    if (el) el.textContent = t;
  }

  /* =========================
     RENDER MESSAGE
  ========================== */
 
 
 function renderMessage(m){
  const myId = Number(window.CHAT.me);
  const isMe = Number(m.user_id) === myId;

  const div = document.createElement("div");
  div.className = "bubble " + (isMe ? "me" : "other");

  let attachHtml = "";
  if (m.attachments && m.attachments.length) {
    attachHtml = m.attachments.map(a => {
      const url = a.file_path;
      const name = a.file_name || "file";
      const mime = a.mime_type || "";

      if (mime.startsWith("image/")) {
        return `<div class="attach"><a href="${url}" target="_blank" rel="noopener"><img class="attach-img" src="${url}" alt="${name}"></a></div>`;
      }
      return `<div class="attach"><a class="attach-file" href="${url}" target="_blank" rel="noopener">📎 ${name}</a></div>`;
    }).join("");
  }

  div.innerHTML = `
    <div class="text">${m.body || ""}${attachHtml}</div>
    <div class="meta">
      <span class="user">${m.username || ""}</span>
      <span class="time">${formatTime(m.created_at)}</span>
    </div>
  `;
  return div;
}


 
 
 
 
 
 
 

  /* =========================
     POLLING (PUBLIC / DM)
  ========================== */
  async function poll(){
    if (!window.CHAT || !window.CHAT.me) return;

    let url = "";
    if (window.CHAT.mode === "dm") {
      if (!window.CHAT.conversationId) return;
      url = `api/dm_messages.php?conversation_id=${window.CHAT.conversationId}&after=${lastId}`;
    } else {
      url = `api/messages.php?room_id=1&after=${lastId}`;
    }

    try {
      const res = await fetch(url);
      if (!res.ok) throw new Error("fetch failed");

      const data = await res.json();
      if (Array.isArray(data) && data.length) {
        const box = document.getElementById("messages");
        data.forEach(m => {
          const id = Number(m.id);
          if (!Number.isNaN(id)) lastId = Math.max(lastId, id);
          box.appendChild(renderMessage(m));
        });
        box.scrollTop = box.scrollHeight;
      }
      setStatus("آنلاین");
    } catch {
      setStatus("خطا در اتصال");
    }
  }

  setInterval(poll, 1000);
  poll();

  /* =========================
     LOAD USERS (CONTACTS)
  ========================== */
  async function loadUsers(q=""){
    const list = document.getElementById("usersList");
    if (!list) return;

    try {
      const res = await fetch(`api/users.php?q=${encodeURIComponent(q)}`);
      if (!res.ok) throw new Error("bad response");

      const payload = await res.json();
      if (!payload.ok) throw new Error("api error");

      const users = payload.users || [];


list.innerHTML = `<div class="chatList" id="chatList"></div>`;
const chatList = document.getElementById("chatList");

users.forEach(u => {
  if (Number(u.id) === Number(window.CHAT.me)) return;

  const item = document.createElement("div");
  item.className = "chatItem";
  item.innerHTML = `
    <div class="chatAvatar">${(u.username || "?").trim().slice(0,1)}</div>
    <div class="chatText">
      <div class="chatName">${u.username}</div>
      <div class="chatSub">برای دایرکت کلیک کن</div>
    </div>
    <div class="chatTime">DM</div>
  `;
  item.addEventListener("click", () => openDM(u.id, u.username));
  chatList.appendChild(item);
});





      users.forEach(u => {
        const item = document.createElement("div");
        item.className = "userItem";
        item.innerHTML = `
          <div class="userAvatar">${u.username.slice(0,1)}</div>
          <div class="userName">${u.username}</div>
        `;
        item.addEventListener("click", () => openDM(u.id, u.username));
        list.appendChild(item);
      });

      if (!users.length) {
        list.innerHTML = `<div class="hint">کاربری یافت نشد</div>`;
      }

    } catch (e) {
      console.error(e);
      list.innerHTML = `<div class="hint">خطا در دریافت کاربران</div>`;
    }
  }

  loadUsers();

  const userSearch = document.getElementById("userSearch");
  if (userSearch) {
    let t = null;
    userSearch.addEventListener("input", () => {
      clearTimeout(t);
      t = setTimeout(() => loadUsers(userSearch.value.trim()), 300);
    });
  }

  /* =========================
     OPEN DM
  ========================== */
  async function openDM(userId, username){
    try {
      const res = await fetch("api/dm_open.php", {
        method: "POST",
        headers: {"Content-Type":"application/x-www-form-urlencoded"},
        body: "user_id=" + encodeURIComponent(userId)
      });
      const data = await res.json();
      if (!data.ok) throw new Error("dm open failed");

      window.CHAT.mode = "dm";
      window.CHAT.conversationId = data.conversation_id;

      clearMessages();
      setTitle("دایرکت: " + username);
      poll();
    } catch {
      alert("باز کردن دایرکت انجام نشد");
    }
  }

  /* =========================
     BACK TO PUBLIC
  ========================== */
  const publicBtn = document.getElementById("publicBtn");
  if (publicBtn) {
    publicBtn.addEventListener("click", () => {
      window.CHAT.mode = "public";
      window.CHAT.conversationId = null;
      clearMessages();
      setTitle("عمومی");
      poll();
    });
  }

  /* =========================
     EMOJI
  ========================== */
  (function initEmoji(){
    const btn = document.getElementById("emojiBtn");
    const panel = document.getElementById("emojiPanel");
    const input = document.getElementById("msg");

    if (!btn || !panel || !input) return;

    panel.innerHTML = EMOJIS.map(e => `<button type="button">${e}</button>`).join("");

    btn.addEventListener("click", () => {
      panel.style.display = panel.style.display === "flex" ? "none" : "flex";
    });

    panel.addEventListener("click", e => {
      if (e.target.tagName === "BUTTON") {
        input.value += e.target.textContent;
        input.focus();
      }
    });
  })();

  /* =========================
     SEND MESSAGE
  ========================== */
  const form = document.getElementById("sendForm");
  if (form) {
   
   
   form.addEventListener("submit", async e => {
  e.preventDefault();

  const input = document.getElementById("msg");
  const fileInput = document.getElementById("file");

  const body = input.value.trim();
  const file = fileInput && fileInput.files && fileInput.files[0] ? fileInput.files[0] : null;

  if (!body && !file) return;

  // 1) اگر فایل هست -> آپلود
  let uploadMeta = null;

  if (file) {
    const fd = new FormData();
    fd.append("file", file);

    const up = await fetch("api/upload.php", { method:"POST", body: fd });
    const upData = await up.json();
    if (!upData.ok) {
      alert("آپلود فایل انجام نشد");
      return;
    }
    uploadMeta = upData;
    fileInput.value = "";
  }

  input.value = "";

  // 2) ارسال پیام + متای فایل
  let url = "";
  let params = new URLSearchParams();

  if (window.CHAT.mode === "dm") {
    url = "api/dm_send.php";
    params.set("conversation_id", window.CHAT.conversationId);
  } else {
    url = "api/send.php";
    params.set("room_id", "1");
  }

  if (body) params.set("body", body);

  if (uploadMeta && uploadMeta.ok) {
    params.set("file_path", uploadMeta.file_path);
    params.set("file_name", uploadMeta.file_name);
    params.set("mime_type", uploadMeta.mime_type);
    params.set("file_size", String(uploadMeta.file_size));
  }

  await fetch(url, {
    method:"POST",
    headers: {"Content-Type":"application/x-www-form-urlencoded"},
    body: params.toString()
  });

  poll();
});

   
   
   
  }
}








// ===== Scroll to bottom button =====
(function initToBottom(){
  const box = document.getElementById("messages");
  const btn = document.getElementById("toBottomBtn");
  if (!box || !btn) return;

  function isNearBottom(){
    return (box.scrollHeight - box.scrollTop - box.clientHeight) < 120;
  }

  function updateBtn(){
    btn.style.display = isNearBottom() ? "none" : "grid";
  }

  btn.addEventListener("click", () => {
    box.scrollTop = box.scrollHeight;
    updateBtn();
  });

  box.addEventListener("scroll", updateBtn);
  updateBtn();
})();




// Mobile sidebar toggle
(function(){
  const btn = document.getElementById("menuBtn");
  const overlay = document.getElementById("overlay");
  if (!btn || !overlay) return;

  function openMenu(){ document.body.classList.add("sidebar-open"); }
  function closeMenu(){ document.body.classList.remove("sidebar-open"); }

  btn.addEventListener("click", () => {
    document.body.classList.contains("sidebar-open") ? closeMenu() : openMenu();
  });

  overlay.addEventListener("click", closeMenu);

  // وقتی روی یک یوزر/روم کلیک شد، منو جمع بشه
  document.addEventListener("click", (e) => {
    if (e.target.closest(".userItem") || e.target.closest(".chatItem") || e.target.closest(".room")) {
      closeMenu();
    }
  });
})();












  
  
  function formatTehranTime(isoString) {
    if (!isoString) return 'زمان نامشخص';
    const dateObj = new Date(isoString);
    const options = { 
        timeZone: 'Asia/Tehran', 
        hour: '2-digit', 
        minute: '2-digit',
        hour12: false 
    };
    return dateObj.toLocaleString('fa-IR', options);
}

function createMessageElement(message) {
    const isMe = message.senderId === window.CHAT.me;
    const senderName = isMe ? window.CHAT.meName : message.senderName;
    const displayTime = formatTehranTime(message.timestamp); 

    const messageDiv = document.createElement('div');
    messageDiv.className = `message ${isMe ? 'mine' : 'other'}`;
    
    messageDiv.innerHTML = `
        <div class="meta">
            <span class="sender">${senderName}</span>
            <span class="time">${displayTime}</span>
        </div>
        <div class="content">${message.text}</div>
    `;
    return messageDiv;
}
  
  
  













function updateOnlineStatus(onlineUsersMap) {
    // 1. به‌روزرسانی منوی کاربران (فرض بر وجود کلاس userItem)
    const userItems = document.querySelectorAll('#usersList .userItem');
    userItems.forEach(item => {
        const userNameElement = item.querySelector('.userName');
        if (userNameElement) {
            const username = userNameElement.textContent.trim();
            if (onlineUsersMap.has(username)) {
                item.classList.add('is-online'); // کلاس برای استایل‌دهی آنلاین
            } else {
                item.classList.remove('is-online');
            }
        }
    });

    // 2. به‌روزرسانی لیست چت‌ها (فرض بر وجود کلاس chatItem)
    const chatItems = document.querySelectorAll('#chatList .chatItem');
    chatItems.forEach(item => {
        const chatNameElement = item.querySelector('.chatName');
        if (chatNameElement) {
            const username = chatNameElement.textContent.trim();
            
            // ایجاد یا حذف نشانگر آنلاین بودن
            let indicator = item.querySelector('.online-indicator');
            
            if (onlineUsersMap.has(username)) {
                if (!indicator) {
                     const indicator = document.createElement('div');
                     indicator.className = 'online-indicator';
                     // قرار دادن نشانگر بعد از آواتار چت
                     const avatar = item.querySelector('.chatAvatar');
                     if (avatar) {
                         avatar.after(indicator);
                     }
                }
            } else {
                if (indicator) indicator.remove();
            }
        }
    });
}

/**
 * فراخوانی API برای دریافت لیست کاربران آنلاین
 */
function fetchOnlineUsers() {
    fetch('api/get_online_users.php') 
        .then(response => {
            // بررسی کد وضعیت HTTP (مثلاً 200، 401 و غیره)
            if (!response.ok) {
                // اگر خطای 500 برطرف شده باشد، اینجا نباید اتفاق بیفتد.
                throw new Error(`HTTP error! Status: ${response.status}`);
            }
            return response.json();
        })
        .then(data => {
            if (data.ok && data.users) {
                // تبدیل آرایه کاربران به Map برای جستجوی سریع
                const onlineUsersMap = new Map();
                data.users.forEach(user => onlineUsersMap.set(user.username, true));
                
                // به‌روزرسانی رابط کاربری
                updateOnlineStatus(onlineUsersMap);
            } else {
                console.warn("پاسخ سرور نامعتبر است:", data);
            }
        })
        .catch(error => console.error('خطا در دریافت لیست آنلاین‌ها:', error));
}

// 1. اجرای اولیه برای بارگذاری سریع وضعیت
fetchOnlineUsers();

// 2. تنظیم Polling برای به‌روزرسانی هر 10 ثانیه (10000 میلی‌ثانیه)
setInterval(fetchOnlineUsers, 10000);
