/**
 * TDV_NET.js - Network Layer (Final Version)
 * Trách nhiệm: Xử lý giao tiếp postMessage và quản lý lỗi hệ thống.
 * Tuân thủ: SDK Message Protocol & Game Channels Guide
 */

var TDV_Net = {
  mode: "live",
  gameCode: "G110",

  // 1. KHỞI TẠO SDK
  init: function (gameCode, defaultData) {
    this.gameCode = gameCode || "G110";
    const urlParams = new URLSearchParams(window.location.search);
    const paramsObj = Object.fromEntries(urlParams.entries());
    this.mode = paramsObj.mode || "dev";

    console.log(
      `📡 [NET] Init | Mode: ${this.mode} | GameCode: ${this.gameCode}`,
    );

    // Payload chuẩn Protocol cho chế độ LIVE
    let initPayload = {
      mode: this.mode,
      game_code: this.gameCode,
      assignment_id: paramsObj.assignment_id || "", // Bắt buộc cho LIVE
      student_id: paramsObj.student_id || "", // Bắt buộc cho LIVE
      api_base_url: paramsObj.api_base_url || "", // Bắt buộc cho LIVE
      auth_token: paramsObj.auth_token || "", // Token xác thực
    };

    // Gộp các params khác từ URL (như bg, game_id...)
    initPayload = Object.assign({}, paramsObj, initPayload);

    if (window.parent !== window) {
      window.parent.postMessage(
        {
          type: "SDK_INIT",
          payload: initPayload,
        },
        "*",
      );
    }

    // Điều phối Mode
    if (this.mode === "dev") {
      setTimeout(() => {
        if (window.TDV_Core) TDV_Core.loadRawData(defaultData);
      }, 1000);
    } else if (this.mode === "preview") {
      console.log("👁️ [NET] Preview Mode: Waiting for SDK_PUSH_DATA...");
    }
  },

  // 2. GỬI ĐÁP ÁN (Check Answer)
  sendAnswer: function (qId, choiceArray, timeSpentMs) {
    window.parent.postMessage(
      {
        type: "SDK_CHECK_ANSWER",
        payload: {
          question_id: qId,
          choice: choiceArray, // Array cho Sequence Game
          time_spent: timeSpentMs,
        },
      },
      "*",
    );
  },

  // 3. GỬI KẾT QUẢ CUỐI (Final Result)
  sendFinalResult: function (score, timeSpent, details) {
    window.parent.postMessage(
      {
        type: "SDK_FINAL_RESULT",
        payload: { score, time_spent: timeSpent, details },
      },
      "*",
    );
  },
};

// --- LISTENER: XỬ LÝ CÁC SỰ KIỆN TỪ SERVER ---
window.addEventListener("message", function (event) {
  if (!event.data) return;
  const { type, payload } = event.data;

  if (!window.TDV_Core) return;

  switch (type) {
    case "SDK_DATA_READY":
      TDV_Core.loadCleanData(payload); //
      break;

    case "SDK_PUSH_DATA":
      console.log("📥 [NET] Received Push Data (Preview)");
      TDV_Core.loadRawData(payload.items); //
      break;

    case "SDK_ANSWER_RESULT":
      TDV_Core.onServerResult(payload); //
      break;

    // --- LẮNG NGHE LỖI HỆ THỐNG ---
    case "SDK_ERROR":
      const { code, message, details } = payload;
      console.error(`❌ [SDK_ERROR] Code: ${code} | Message: ${message}`);
      if (details) console.error("Details:", details);
      if (window["TDVTriger"]) {
      }
      break;

    case "SDK_READY": //Log trạng thái sẵn sàng kết nối.
      console.log("✅ [NET] SDK Ready:", payload);
      break;
  }
});

window.TDV_Net = TDV_Net;
