
import { Handler } from '/csspageweaver/lib/paged.esm.js';

export default class after extends Handler {

  constructor(chunker, polisher, caller) {
    super(chunker, polisher, caller);
  }

  afterPageLayout(pageElement, page, breakToken) {
    lines(pageElement, ".title, .subtitle, p");
    letters(pageElement, ".title, .subtitle, p");
    // applyFontSizes(pageElement, ".title, .subtitle");
    // grossiPara(pageElement, "p");
  }
}


function getRandomLineLength() {
  return Math.floor(Math.random() * (34 - 20 + 1)) + 20;
}


function letters(content, elements){
  console.log("letters");
  let selectedElements = content.querySelectorAll(elements);
  selectedElements.forEach(function(element) {
    console.log("Type:", element.tagName, element);

    // Vérifier si des span.line existent déjà
    let lineSpans = element.querySelectorAll('.line');

    if (lineSpans.length > 0) {
      // Si des lignes existent, appliquer les lettres à chaque ligne
      lineSpans.forEach(function(lineSpan) {
        let text = lineSpan.textContent;
        let chars = text.split('');

        lineSpan.innerHTML = '';
        chars.forEach(function(char) {
          let letterSpan = document.createElement('span');
          letterSpan.className = 'letter';
          letterSpan.textContent = char;
          lineSpan.appendChild(letterSpan);
        });
      });
      console.log("Caractères appliqués dans", lineSpans.length, "lignes");
    } else {
      // Sinon, appliquer directement sur l'élément
      let text = element.textContent;
      let chars = text.split('');

      element.innerHTML = '';
      chars.forEach(function(char) {
        let letterSpan = document.createElement('span');
        letterSpan.className = 'letter';
        letterSpan.textContent = char;
        element.appendChild(letterSpan);
      });
      console.log("Caractères traités:", chars.length);
    }
  });
}


function grossiPara(content, elements){
  console.log("grossiPara");
  let selectedElements = content.querySelectorAll(elements);
  selectedElements.forEach(function(element) {

    // Trouver toutes les lignes
    let lineSpans = element.querySelectorAll('.line');

    if (lineSpans.length > 0) {
      // Appliquer les tailles pour chaque ligne
      lineSpans.forEach(function(lineSpan) {
        let letterSpans = lineSpan.querySelectorAll('.letter');
        let length = letterSpans.length;

        letterSpans.forEach(function(letterSpan, i) {
          // Progression linéaire de 10px à 28px
          let ratio = i / (length - 1);
          let fontSize = 10 + (28 - 10) * ratio;

          letterSpan.style.fontSize = fontSize + 'px';
        });
      });
      console.log("Progression appliquée sur", lineSpans.length, "lignes");
    } else {
      // Sinon, appliquer directement sur les lettres de l'élément
      let letterSpans = element.querySelectorAll('.letter');
      let length = letterSpans.length;

      letterSpans.forEach(function(letterSpan, i) {
        // Progression linéaire de 10px à 28px
        let ratio = i / (length - 1);
        let fontSize = 10 + (28 - 10) * ratio;

        letterSpan.style.fontSize = fontSize + 'px';
      });
      console.log("Progression appliquée sur", length, "lettres");
    }
  });
}

function applyFontSizes(content, elements){
  console.log("applyFontSizes");
  let selectedElements = content.querySelectorAll(elements);
  selectedElements.forEach(function(element) {

    // Trouver toutes les lignes
    let lineSpans = element.querySelectorAll('.line');

    if (lineSpans.length > 0) {
      // Appliquer les tailles pour chaque ligne
      lineSpans.forEach(function(lineSpan) {
        // Chaque ligne a son propre maxSize aléatoire
        let maxSize = getRandomLineLength();
        console.log("Max size pour cette ligne:", maxSize);

        let letterSpans = lineSpan.querySelectorAll('.letter');
        let length = letterSpans.length;

        // Position aléatoire du pic entre 30% et 70% de la ligne
        let peakPosition = Math.random() * (0.7 - 0.3) + 0.3;
        let peak = length * peakPosition;
        console.log("Pic à la position:", Math.round(peak), "sur", length);

        letterSpans.forEach(function(letterSpan, i) {
          // Calculer la taille en fonction de la distance au pic
          let distanceFromPeak = Math.abs(i - peak);
          let maxDistance = Math.max(peak, length - peak);
          let ratio = 1 - (distanceFromPeak / maxDistance);
          let fontSize = 9 + (maxSize - 9) * ratio;

          letterSpan.style.fontSize = fontSize + 'px';
        });
      });
      console.log("Tailles appliquées sur", lineSpans.length, "lignes");
    } else {
      // Sinon, appliquer directement sur les lettres de l'élément
      let maxSize = getRandomLineLength();
      console.log("Max size pour cet élément:", maxSize);

      let letterSpans = element.querySelectorAll('.letter');
      let length = letterSpans.length;

      // Position aléatoire du pic entre 30% et 70% de la ligne
      let peakPosition = Math.random() * (0.7 - 0.3) + 0.3;
      let peak = length * peakPosition;
      console.log("Pic à la position:", Math.round(peak), "sur", length);

      letterSpans.forEach(function(letterSpan, i) {
        // Calculer la taille en fonction de la distance au pic
        let distanceFromPeak = Math.abs(i - peak);
        let maxDistance = Math.max(peak, length - peak);
        let ratio = 1 - (distanceFromPeak / maxDistance);
        let fontSize = 9 + (maxSize - 9) * ratio;

        letterSpan.style.fontSize = fontSize + 'px';
      });
      console.log("Tailles appliquées sur", length, "lettres");
    }
  });
}


function lines(content, elements){
  console.log("lines");
  let selectedElements = content.querySelectorAll(elements);
  selectedElements.forEach(function(element) {
    console.log("Type:", element.tagName, element);

    let text = element.textContent;

    // Créer des spans temporaires pour chaque mot afin de mesurer leur position
    let words = text.split(/(\s+)/); // Garde les espaces
    element.innerHTML = '';

    let wordElements = [];
    words.forEach(function(word) {
      if (word.length > 0) { // Ignorer les chaînes vides
        let span = document.createElement('span');
        span.textContent = word;
        span.style.display = 'inline';
        element.appendChild(span);

        let rect = span.getBoundingClientRect();
        wordElements.push({
          element: span,
          word: word,
          top: Math.round(rect.top)
        });
      }
    });

    // Grouper les mots par ligne avec une tolérance de 2px
    let lines = [];
    let currentLine = [];
    let currentTop = null;

    wordElements.forEach(function(wordObj) {
      if (currentTop === null || Math.abs(wordObj.top - currentTop) <= 2) {
        currentLine.push(wordObj.word);
        if (currentTop === null) {
          currentTop = wordObj.top;
        }
      } else {
        lines.push(currentLine.join(''));
        currentLine = [wordObj.word];
        currentTop = wordObj.top;
      }
    });

    if (currentLine.length > 0) {
      lines.push(currentLine.join(''));
    }

    // Reconstruire l'élément avec des span.line
    element.innerHTML = '';
    lines.forEach(function(lineText) {
      let lineSpan = document.createElement('span');
      lineSpan.className = 'line';
      lineSpan.style.display = 'block';
      lineSpan.textContent = lineText;
      element.appendChild(lineSpan);
    });

    console.log("Lignes détectées:", lines.length);
  });
}

