window.addEventListener('DOMContentLoaded', function() {
  pdfjsLib.GlobalWorkerOptions.workerSrc = 'pdfjs/pdf.worker.js';

  const mobileBreakpoint = 700;
  const mobileScale = 2.2;
  const desktopScale = 1.5;

  let pdfDoc = null,
      pageNum = 1,
      canvasLeft = document.getElementById('left-page'),
      canvasRight = document.getElementById('right-page'),
      ctxLeft = canvasLeft.getContext('2d'),
      ctxRight = canvasRight.getContext('2d'),
      lightboxPageNum = 1;

  function isMobile() {
    return window.innerWidth < mobileBreakpoint;
  }

  function getCurrentPDFUrl() {
    const chooser = document.getElementById('pdf-chooser');
    return "pdfs/" + chooser.value;
  }

  function updateBulletinLinks() {
    const chooser = document.getElementById('pdf-chooser');
    const file = "pdfs/" + chooser.value;
    document.getElementById('preview-bulletin').href = file;
    document.getElementById('download-bulletin').href = file;
    document.getElementById('download-bulletin').setAttribute('download', chooser.value);
  }

  function matchCanvasSize(canvas, refCanvas) {
    canvas.width = refCanvas.width;
    canvas.height = refCanvas.height;
    let ctx = canvas.getContext('2d');
    ctx.clearRect(0, 0, canvas.width, canvas.height);
    ctx.fillStyle = "#fff";
    ctx.fillRect(0, 0, canvas.width, canvas.height);
  }

  function renderPageToCanvas(num, canvas, ctx, scaleOverride, matchDims) {
    if (!pdfDoc || num < 1 || num > pdfDoc.numPages) {
      if (matchDims) {
        canvas.width = matchDims.width;
        canvas.height = matchDims.height;
        ctx.clearRect(0, 0, canvas.width, canvas.height);
        ctx.fillStyle = "#fff";
        ctx.fillRect(0, 0, canvas.width, canvas.height);
      } else {
        ctx.clearRect(0, 0, canvas.width, canvas.height);
      }
      return;
    }
    pdfDoc.getPage(num).then(function(page) {
      const scale = typeof scaleOverride === 'number' ? scaleOverride : (isMobile() ? mobileScale : desktopScale);
      const viewport = page.getViewport({ scale });
      canvas.width = viewport.width;
      canvas.height = viewport.height;
      page.render({canvasContext: ctx, viewport: viewport});
    });
  }

  function renderSpread() {
    if (!pdfDoc) return;
    const total = pdfDoc.numPages;

    let leftPageNum = null, rightPageNum = null;
    let label;

    if (isMobile()) {
      // Mobile: single page view (right canvas only)
      leftPageNum = null;
      rightPageNum = pageNum;
      label = `Page ${pageNum} of ${total}`;
    } else {
      // Desktop: spread logic (no repeated/overlapping pages)
      if (pageNum === 1) {
        // Cover only (right side)
        leftPageNum = null;
        rightPageNum = 1;
        label = "Cover";
      } else {
        // Spreads are (even, odd) pairs: 2/3, 4/5, etc.
        leftPageNum = pageNum;
        rightPageNum = (pageNum + 1 <= total) ? pageNum + 1 : null;
        label = (leftPageNum && rightPageNum)
          ? `${leftPageNum}/${rightPageNum}`
          : leftPageNum
            ? `${leftPageNum}`
            : "";
      }
    }

    // Render right page first for sizing, then left to match (or blank for cover)
    if (rightPageNum && rightPageNum >= 1 && rightPageNum <= total) {
      pdfDoc.getPage(rightPageNum).then(function(rightPage) {
        const scale = isMobile() ? mobileScale : desktopScale;
        const rightViewport = rightPage.getViewport({ scale });
        renderPageToCanvas(rightPageNum, canvasRight, ctxRight, scale);
        // Always match left to right if no left page (e.g. cover)
        if (leftPageNum && leftPageNum >= 1 && leftPageNum <= total) {
          renderPageToCanvas(leftPageNum, canvasLeft, ctxLeft, scale);
        } else {
          matchCanvasSize(canvasLeft, canvasRight);
        }
      });
    } else if (leftPageNum && leftPageNum >= 1 && leftPageNum <= total) {
      // Only left page (rare)
      pdfDoc.getPage(leftPageNum).then(function(leftPage) {
        const scale = isMobile() ? mobileScale : desktopScale;
        const leftViewport = leftPage.getViewport({ scale });
        renderPageToCanvas(leftPageNum, canvasLeft, ctxLeft, scale);
        matchCanvasSize(canvasRight, canvasLeft);
      });
    } else {
      // Both blank
      ctxLeft.clearRect(0, 0, canvasLeft.width, canvasLeft.height);
      ctxRight.clearRect(0, 0, canvasRight.width, canvasRight.height);
    }

    document.getElementById('page-num').textContent = label;
    document.getElementById('page-count').textContent = total;
  }

  function loadCurrentPDF() {
    fetch(getCurrentPDFUrl())
      .then(res => res.arrayBuffer())
      .then(buffer => pdfjsLib.getDocument({data: new Uint8Array(buffer)}).promise)
      .then(function(pdf) {
        pdfDoc = pdf;
        pageNum = 1;
        renderSpread();
      }, function(error) {
        alert("Failed to load PDF. Please check your file exists in /pdfs/ and try again.");
      });
    updateBulletinLinks();
  }

  // Dropdown change
  document.getElementById('pdf-chooser').addEventListener('change', function() {
    loadCurrentPDF();
    updateBulletinLinks();
  });

  // Navigation
  document.getElementById('next-page').addEventListener('click', function() {
    if (!pdfDoc) return;
    const total = pdfDoc.numPages;
    if (isMobile()) {
      if (pageNum < total) {
        pageNum++;
        renderSpread();
      }
    } else {
      if (pageNum === 1) {
        // From cover to first spread
        pageNum = 2;
        renderSpread();
      } else if (pageNum + 1 < total) {
        pageNum += 2;
        renderSpread();
      } else if (pageNum + 1 === total) {
        // Last spread
        pageNum += 2;
        renderSpread();
      }
    }
  });

  document.getElementById('prev-page').addEventListener('click', function() {
    if (!pdfDoc) return;
    if (isMobile()) {
      if (pageNum > 1) {
        pageNum--;
        renderSpread();
      }
    } else {
      if (pageNum <= 3) {
        // Go back to cover
        pageNum = 1;
        renderSpread();
      } else {
        pageNum -= 2;
        renderSpread();
      }
    }
  });

  // LIGHTBOX LOGIC
  function showLightbox(pageToShow) {
    if (!pdfDoc) return;
    if (pageToShow < 1) pageToShow = 1;
    if (pageToShow > pdfDoc.numPages) pageToShow = pdfDoc.numPages;
    lightboxPageNum = pageToShow;
    const modal = document.getElementById('lightbox-modal');
    const lightboxCanvas = document.getElementById('lightbox-canvas');
    const ctx = lightboxCanvas.getContext('2d');
    const scale = isMobile() ? mobileScale * 1.4 : desktopScale * 2.5;
    pdfDoc.getPage(pageToShow).then(function(page) {
      const viewport = page.getViewport({ scale });
      lightboxCanvas.width = viewport.width;
      lightboxCanvas.height = viewport.height;
      page.render({canvasContext: ctx, viewport: viewport});
      document.getElementById('lightbox-label').textContent = `Page ${pageToShow} of ${pdfDoc.numPages}`;
    });
    modal.style.display = 'flex';
  }

  document.getElementById('lightbox-prev').addEventListener('click', function(e) {
    e.stopPropagation();
    if (!pdfDoc) return;
    if (lightboxPageNum > 1) showLightbox(lightboxPageNum - 1);
  });
  document.getElementById('lightbox-next').addEventListener('click', function(e) {
    e.stopPropagation();
    if (!pdfDoc) return;
    if (lightboxPageNum < pdfDoc.numPages) showLightbox(lightboxPageNum + 1);
  });
  document.getElementById('close-lightbox').addEventListener('click', function(e) {
    e.stopPropagation();
    document.getElementById('lightbox-modal').style.display = 'none';
  });
  document.getElementById('lightbox-backdrop').addEventListener('click', function() {
    document.getElementById('lightbox-modal').style.display = 'none';
  });

  // Canvas click for lightbox
  canvasLeft.addEventListener('click', () => {
    if (!pdfDoc) return;
    if (isMobile()) return; // Left not used on mobile
    const total = pdfDoc.numPages;
    let leftPageNum = null;
    if (pageNum === 1) return; // Blank
    else leftPageNum = pageNum;
    if (leftPageNum && leftPageNum >= 1 && leftPageNum <= total) showLightbox(leftPageNum);
  });

  canvasRight.addEventListener('click', () => {
    if (!pdfDoc) return;
    const total = pdfDoc.numPages;
    let rightPageNum = null;
    if (isMobile()) rightPageNum = pageNum;
    else if (pageNum === 1) rightPageNum = 1;
    else rightPageNum = (pageNum + 1 <= total) ? pageNum + 1 : null;
    if (rightPageNum && rightPageNum >= 1 && rightPageNum <= total) showLightbox(rightPageNum);
  });

  // On resize, re-render for mobile/desktop switch
  window.addEventListener('resize', function() {
    renderSpread();
  });

  // Initial load
  loadCurrentPDF();
  updateBulletinLinks();
});
