<!DOCTYPE html>
<html th:lang="${#locale.language}" th:dir="#{language.direction}" th:data-language="${#locale.toString()}" xmlns:th="https://www.thymeleaf.org">
  <head>
    <th:block th:insert="~{fragments/common :: head(title=#{crop.title}, header=#{crop.header})}"></th:block>
  </head>

  <body>
    <div id="page-container">
      <div id="content-wrap">
        <th:block th:insert="~{fragments/navbar.html :: navbar}"></th:block>
        <br><br>
        <div class="container">
          <div class="row justify-content-center">
            <div class="col-md-6 bg-card">
              <div class="tool-header">
                <span class="material-symbols-rounded tool-header-icon organize">crop</span>
                <span class="tool-header-text" th:text="#{crop.header}"></span>
              </div>
              <form id="cropForm" th:action="@{'/api/v1/general/crop'}" method="post" enctype="multipart/form-data">
                <div th:replace="~{fragments/common :: fileSelector(name='fileInput', multipleInputsForSingleRequest=false, accept='application/pdf')}"></div>
                <input id="x" type="hidden" name="x">
                <input id="y" type="hidden" name="y">
                <input id="width" type="hidden" name="width">
                <input id="height" type="hidden" name="height">
                <button type="submit" class="btn btn-primary" th:text="#{crop.submit}"></button>
              </form>
              <div id="canvasesContainer" style="position: relative; margin: 20px 0; width: auto;">
                <canvas id="cropPdfCanvas" style="width: 100%"></canvas>
                <canvas id="overlayCanvas" style="position: absolute; top: 0; left: 0; z-index: 2; width: 100%"></canvas>
              </div>

            </div>
          </div>
          <script type="module" th:src="@{'/pdfjs-legacy/pdf.mjs'}"></script>
          <script>
            let pdfCanvas  = document.getElementById('cropPdfCanvas');
            let overlayCanvas = document.getElementById('overlayCanvas');
            let canvasesContainer = document.getElementById('canvasesContainer');
            canvasesContainer.style.display = "none";
            let containerRect = canvasesContainer.getBoundingClientRect();

            let context = pdfCanvas.getContext('2d');
            let overlayContext = overlayCanvas.getContext('2d');

            overlayCanvas.width = pdfCanvas.width;
            overlayCanvas.height = pdfCanvas.height;

            let isDrawing = false; // New flag to check if drawing is ongoing

            let cropForm = document.getElementById('cropForm');
            let fileInput = document.getElementById('fileInput-input');
            let xInput = document.getElementById('x');
            let yInput = document.getElementById('y');
            let widthInput = document.getElementById('width');
            let heightInput = document.getElementById('height');

            let pdfDoc = null;
            let currentPage = 1;
            let totalPages = 0;

            let startX = 0;
            let startY = 0;
            let rectWidth = 0;
            let rectHeight = 0;


            let pageScale = 1; // The scale which the pdf page renders
            let timeId = null; // timeout id for resizing canvases event

            function renderPageFromFile(file) {
              if (file.type === 'application/pdf') {
                let reader = new FileReader();
                reader.onload = function(ev) {
                  let typedArray = new Uint8Array(reader.result);
                  pdfjsLib.GlobalWorkerOptions.workerSrc = './pdfjs-legacy/pdf.worker.mjs'
                  pdfjsLib.getDocument(typedArray).promise.then(function(pdf) {
                    pdfDoc = pdf;
                    totalPages = pdf.numPages;
                    renderPage(currentPage);
                  });
                };
                reader.readAsArrayBuffer(file);
              }
            }

            window.addEventListener("resize", function() {
              clearTimeout(timeId);

              timeId = setTimeout(function () {
                 if (fileInput.files.length == 0) return;
                 let canvasesContainer = document.getElementById('canvasesContainer');
                 let containerRect = canvasesContainer.getBoundingClientRect();

                 context.clearRect(0, 0, pdfCanvas.width, pdfCanvas.height);

                 overlayContext.clearRect(0, 0, overlayCanvas.width, overlayCanvas.height);

                 pdfCanvas.width = containerRect.width;
                 pdfCanvas.height = containerRect.height;

                 overlayCanvas.width = containerRect.width;
                 overlayCanvas.height = containerRect.height;

                 let file = fileInput.files[0];
                 renderPageFromFile(file);
             }, 1000);
            });

            fileInput.addEventListener('change', function(e) {
              canvasesContainer.style.display = "block"; // set for visual purposes
              let file = e.target.files[0];
              renderPageFromFile(file);
            });

            cropForm.addEventListener('submit', function(e) {
              if (xInput.value == "" && yInput.value == "" && widthInput.value == "" && heightInput.value == "") {
                // Ορίστε συντεταγμένες για ολόκληρη την επιφάνεια του PDF
                xInput.value = 0;
                yInput.value = 0;
                widthInput.value = containerRect.width;
                heightInput.value = containerRect.height;
              }
            });

            overlayCanvas.addEventListener('mousedown', function(e) {
              // Clear previously drawn rectangle on the main canvas
              context.clearRect(0, 0, pdfCanvas.width, pdfCanvas.height);
              renderPage(currentPage); // Re-render the PDF

              // Clear the overlay canvas to ensure old drawings are removed
              overlayContext.clearRect(0, 0, overlayCanvas.width, overlayCanvas.height);

              startX = e.offsetX;
              startY = e.offsetY;
              isDrawing = true;
            });

            overlayCanvas.addEventListener('mousemove', function(e) {
              if (!isDrawing) return;
              overlayContext.clearRect(0, 0, overlayCanvas.width, overlayCanvas.height); // Clear previous rectangle

              rectWidth = e.offsetX - startX;
              rectHeight = e.offsetY - startY;
              overlayContext.strokeStyle = 'red';
              overlayContext.strokeRect(startX, startY, rectWidth, rectHeight);
            });

            overlayCanvas.addEventListener('mouseup', function(e) {
              isDrawing = false;

              rectWidth = e.offsetX - startX;
              rectHeight = e.offsetY - startY;

              let flippedY = pdfCanvas.height - e.offsetY;

              xInput.value = startX / pageScale;
              yInput.value = flippedY / pageScale;
              widthInput.value = rectWidth / pageScale;
              heightInput.value = rectHeight /pageScale;

              // Draw the final rectangle on the main canvas
              context.strokeStyle = 'red';
              context.strokeRect(startX, startY, rectWidth, rectHeight);

              overlayContext.clearRect(0, 0, overlayCanvas.width, overlayCanvas.height); // Clear the overlay
            });

            function renderPage(pageNumber) {
              pdfDoc.getPage(pageNumber).then(function(page) {
                let canvasesContainer = document.getElementById('canvasesContainer');
                let containerRect = canvasesContainer.getBoundingClientRect();

                pageScale = containerRect.width / page.getViewport({ scale: 1 }).width; // The new scale

                let viewport = page.getViewport({ scale: containerRect.width / page.getViewport({ scale: 1 }).width });

                canvasesContainer.width =viewport.width;
                canvasesContainer.height = viewport.height;

                pdfCanvas.width = viewport.width;
                pdfCanvas.height = viewport.height;

                overlayCanvas.width = viewport.width;  // Match overlay canvas size with PDF canvas
                overlayCanvas.height = viewport.height;

                let renderContext = { canvasContext: context, viewport: viewport };
                page.render(renderContext);
                pdfCanvas.classList.add("shadow-canvas");
              });
            }
          </script>
        </div>
      </div>
      <th:block th:insert="~{fragments/footer.html :: footer}"></th:block>
    </div>
  </body>
</html>
