const apiBaseUrl = "https://api.trust-movie.com";
let apiKey = null;

// API Key&#12501;&#12473;&#12531;&#12523;／&#20998;&#23398;
document.getElementById("id_b").addEventListener("click", () => {
  const input = document.getElementById("id_a").value.trim();
  if (input) {
    apiKey = input;
    document.getElementById("id_d").innerText = apiKey;
  }
});
document.getElementById("id_c").addEventListener("click", () => {
  apiKey = null;
  document.getElementById("id_a").value = "";
  document.getElementById("id_d").innerText = "None";
});

// &#82;&#101;&#115;&#112;&#111;&#110;&#115;&#101;&#12501;&#12473;&#12531;&#12483;表示用&#12501;&#12473;&#12531;&#12523;関数
function displayResponse(elementId, response, status) {
  const el = document.getElementById(elementId);
  let className = "cls_a3";
  if (status >= 400 && status < 500) {
    className = "cls_a4";
  } else if (status === 423) {
    className = "cls_a5";
  }
  el.innerHTML = '<div class="' + className + '"><pre>' +
    JSON.stringify(response, null, 2) +
    '</pre><p>Status Code: ' + status + '</p></div>';
}

// 共通の&#82;&#101;&#115;&#112;&#111;&#110;&#115;&#101;パース処理関数
async function parseResponse(res) {
  const contentType = res.headers.get("Content-Type") || "";
  if (contentType.includes("application/json")) {
    return await res.json();
  } else {
    return await res.text();
  }
}

// GET /verify の実行
document.getElementById("id_l").addEventListener("submit", async (e) => {
  e.preventDefault();
  const fileHash = document.getElementById("id_m").value.trim();
  try {
    const res = await fetch(apiBaseUrl + "/verify?fileHash=" + encodeURIComponent(fileHash));
    const data = await parseResponse(res);
    displayResponse("id_n", data, res.status);
  } catch (err) {
    displayResponse("id_n", { error: err.toString() }, 500);
  }
});

// POST /verify/file の実行（&#70;&#105;&#108;&#101; &#85;&#112;&#108;&#111;&#97;&#100;）
document.getElementById("id_p").addEventListener("submit", async (e) => {
  e.preventDefault();
  const fileInput = document.getElementById("id_q");
  if (fileInput.files.length === 0) {
    alert("Please select a file.");
    return;
  }
  const formData = new FormData();
  formData.append("file", fileInput.files[0]);
  try {
    const res = await fetch(apiBaseUrl + "/verify/file", {
      method: "POST",
      headers: apiKey ? { "Authorization": "Bearer " + apiKey } : {},
      body: formData
    });
    const data = await parseResponse(res);
    displayResponse("id_r", data, res.status);
  } catch (err) {
    displayResponse("id_r", { error: err.toString() }, 500);
  }
});

// POST /ledger の実行（&#70;&#105;&#108;&#101; &#72;&#97;&#115;&#104;＋&#12300;&#32222;&#12302;）
document.getElementById("id_t").addEventListener("submit", async (e) => {
  e.preventDefault();
  const fileHash = document.getElementById("id_u").value.trim();
  let attributes;
  try {
    attributes = JSON.parse(document.getElementById("id_v").value.trim() || "{}");
  } catch (err) {
    alert("Invalid JSON in attributes.");
    return;
  }
  try {
    const res = await fetch(apiBaseUrl + "/ledger", {
      method: "POST",
      headers: {
        "Content-Type": "application/json",
        ...(apiKey ? { "Authorization": "Bearer " + apiKey } : {})
      },
      body: JSON.stringify({ fileHash, attributes })
    });
    const data = await parseResponse(res);
    displayResponse("id_w", data, res.status);
  } catch (err) {
    displayResponse("id_w", { error: err.toString() }, 500);
  }
});

// POST /ledger/file の実行（&#70;&#105;&#108;&#101; &#85;&#112;&#108;&#111;&#97;&#100;＋&#12300;&#32222;&#12302;）
document.getElementById("id_y").addEventListener("submit", async (e) => {
  e.preventDefault();
  const fileInput = document.getElementById("id_z");
  if (fileInput.files.length === 0) {
    alert("Please select a file.");
    return;
  }
  const attributesText = document.getElementById("id_aa").value.trim();
  let attributes = {};
  if (attributesText) {
    try {
      attributes = JSON.parse(attributesText);
    } catch (err) {
      alert("Invalid JSON in attributes.");
      return;
    }
  }
  const formData = new FormData();
  formData.append("file", fileInput.files[0]);
  formData.append("attributes", JSON.stringify(attributes));
  try {
    const res = await fetch(apiBaseUrl + "/ledger/file", {
      method: "POST",
      headers: apiKey ? { "Authorization": "Bearer " + apiKey } : {},
      body: formData
    });
    const data = await parseResponse(res);
    displayResponse("id_ab", data, res.status);
  } catch (err) {
    displayResponse("id_ab", { error: err.toString() }, 500);
  }
});