const workerBase = "http://127.0.0.1:8765";
const OCR_MODE = "local_ocr";
const OCR_LABEL = "Scan Tiếng Việt: OCR Local đầy đủ";
const EMPTY_RESULT = "Markdown sẽ xuất hiện tại đây.";

const input = document.querySelector("#pdfInput");
const dropZone = document.querySelector("#dropZone");
const fileName = document.querySelector("#fileName");
const convert = document.querySelector("#convert");
const statusText = document.querySelector("#statusText");
const workerStatus = document.querySelector("#workerStatus");
const progress = document.querySelector("#progress");
const result = document.querySelector("#result");
const openOutput = document.querySelector("#openOutput");
const installLocal = document.querySelector("#installLocal");
const clearResult = document.querySelector("#clearResult");
const downloadMarkdown = document.querySelector("#downloadMarkdown");
const cancelConvert = document.querySelector("#cancelConvert");
const routeBadge = document.querySelector("#routeBadge");
let selectedFile = null;
let latestMarkdown = "";
let latestMarkdownFilename = "ocr-result.md";

if ("serviceWorker" in navigator) {
  window.addEventListener("load", () => {
    navigator.serviceWorker.register("./sw.js").catch(() => {});
  });
}

function resetMarkdownDownload() {
  latestMarkdown = "";
  latestMarkdownFilename = "ocr-result.md";
  downloadMarkdown.disabled = true;
}

function setMarkdownDownload(markdown, filename) {
  latestMarkdown = markdown || "";
  latestMarkdownFilename = filename || "ocr-result.md";
  downloadMarkdown.disabled = !latestMarkdown;
}

function setSelectedFile(file) {
  selectedFile = file && file.type === "application/pdf" ? file : null;
  convert.disabled = !selectedFile;
  cancelConvert.disabled = true;
  fileName.textContent = selectedFile ? selectedFile.name : "Chưa có tệp";
  statusText.textContent = selectedFile ? `Đã chọn: ${selectedFile.name}` : "Chưa chọn tệp.";
  progress.value = selectedFile ? 10 : 0;
  resetMarkdownDownload();
}

function markInstallReady() {
  installLocal.classList.add("is-installed");
  installLocal.textContent = "Đã cài đặt";
  installLocal.setAttribute("aria-label", "OCR Local đã cài đặt trên máy này");
  installLocal.setAttribute("aria-disabled", "true");
  installLocal.removeAttribute("download");
}

function markInstallNeeded() {
  installLocal.classList.remove("is-installed");
  installLocal.textContent = "Cài đặt";
  installLocal.setAttribute("aria-label", "Tải bộ cài OCR Local");
  installLocal.removeAttribute("aria-disabled");
  installLocal.setAttribute("download", "");
}

async function checkWorker() {
  try {
    const response = await fetch(`${workerBase}/health`);
    const data = await response.json();
    if (data.ok) {
      workerStatus.textContent = "OCR Local đã sẵn sàng";
      markInstallReady();
    } else {
      workerStatus.textContent = "OCR Local chưa sẵn sàng";
      markInstallNeeded();
    }
  } catch {
    workerStatus.textContent = "OCR Local chưa chạy. Bấm Cài đặt rồi chạy bộ cài một lần trên máy này.";
    markInstallNeeded();
  }
}

installLocal.addEventListener("click", (event) => {
  if (installLocal.classList.contains("is-installed")) {
    event.preventDefault();
  }
});

input.addEventListener("change", () => {
  setSelectedFile(input.files[0] || null);
});

dropZone.addEventListener("dragover", (event) => {
  event.preventDefault();
  dropZone.classList.add("is-dragging");
});

dropZone.addEventListener("dragleave", () => {
  dropZone.classList.remove("is-dragging");
});

dropZone.addEventListener("drop", (event) => {
  event.preventDefault();
  dropZone.classList.remove("is-dragging");
  setSelectedFile(event.dataTransfer.files[0] || null);
});

convert.addEventListener("click", async () => {
  if (!selectedFile) return;
  progress.value = 25;
  routeBadge.textContent = OCR_LABEL;
  statusText.textContent = "Đang gửi PDF vào OCR Local...";
  result.textContent = "";
  resetMarkdownDownload();
  convert.disabled = true;
  cancelConvert.disabled = false;
  try {
    const response = await fetch(`${workerBase}/convert?filename=${encodeURIComponent(selectedFile.name)}`, {
      method: "POST",
      headers: {
        "Content-Type": "application/pdf",
        "X-Mode": OCR_MODE,
      },
      body: selectedFile,
    });
    progress.value = response.ok ? 100 : 85;
    const data = await response.json();
    const conversion = data.result || {};
    statusText.textContent = data.ok ? "Hoàn tất. Bạn có thể tải Markdown." : "OCR đã dừng hoặc cần kiểm tra dependency.";
    if (data.ok && conversion.markdown) {
      result.textContent = conversion.markdown;
      setMarkdownDownload(conversion.markdown, conversion.markdown_filename);
    } else {
      result.textContent = JSON.stringify(conversion || data, null, 2);
    }
  } catch (error) {
    progress.value = 0;
    statusText.innerHTML = '<span class="error">Không gọi được OCR Local.</span> OCR chạy trên máy đang mở trang; hãy bấm Cài đặt, chạy bộ cài một lần và cho phép Local network access nếu được hỏi.';
    result.textContent = [
      "OCR Local chưa phản hồi tại http://127.0.0.1:8765.",
      "",
      "Cách xử lý trên máy đang mở trang:",
      "1. Bấm Cài đặt.",
      "2. Giải nén gói cài đặt.",
      "3. Windows: double-click Install ORC Local Windows.cmd.",
      "   macOS: double-click Install ORC Local macOS.command.",
      "4. Nếu Chrome hỏi quyền Local network access, chọn Allow.",
      "",
      String(error),
    ].join("\n");
  } finally {
    convert.disabled = !selectedFile;
    cancelConvert.disabled = true;
  }
});

cancelConvert.addEventListener("click", async () => {
  cancelConvert.disabled = true;
  statusText.textContent = "Đang yêu cầu dừng OCR...";
  try {
    await fetch(`${workerBase}/cancel`, { method: "POST" });
  } catch (error) {
    statusText.innerHTML = '<span class="error">Chưa gửi được lệnh dừng OCR Local.</span>';
    result.textContent = String(error);
  }
});

openOutput.addEventListener("click", async () => {
  try {
    await fetch(`${workerBase}/open-output`, { method: "POST" });
  } catch {
    statusText.innerHTML = '<span class="error">OCR Local chưa chạy nên chưa mở được output.</span> Hãy bấm Cài đặt và chạy bộ cài một lần.';
  }
});

clearResult.addEventListener("click", () => {
  result.textContent = EMPTY_RESULT;
  progress.value = selectedFile ? 10 : 0;
  resetMarkdownDownload();
});

downloadMarkdown.addEventListener("click", () => {
  if (!latestMarkdown) return;
  const blob = new Blob([latestMarkdown], { type: "text/markdown;charset=utf-8" });
  const url = URL.createObjectURL(blob);
  const anchor = document.createElement("a");
  anchor.href = url;
  anchor.download = latestMarkdownFilename;
  document.body.append(anchor);
  anchor.click();
  anchor.remove();
  window.setTimeout(() => URL.revokeObjectURL(url), 0);
});

checkWorker();
