/* ════════════════════════════════════════════════════════════════════
   tab-protect.js — ajout d'un mot de passe (chiffrement AES-128).
   Le mot de passe d'ouverture protège la lecture ; le mot de passe
   propriétaire (facultatif) donne l'accès complet et lève les
   restrictions d'impression / copie / modification.
   ════════════════════════════════════════════════════════════════════ */
(() => {
  'use strict';
  const { byId, esc, toast, readFile, downloadBlob, baseName, formatSize } = Utils;

  const state = {
    /** @type {{name:string, bytes:Uint8Array, pages:number}|null} */
    file: null,
    busy: false,
  };

  const els = {};

  function init() {
    ['drop', 'file', 'workspace', 'card', 'pw', 'pw2', 'eye', 'owner',
     'perm-print', 'perm-copy', 'perm-modify', 'msg', 'reset', 'btn']
      .forEach((k) => { els[k.replace(/-(\w)/g, (_, c) => c.toUpperCase())] = byId(`prot-${k}`); });

    Utils.setupDropzone(els.drop, els.file, (files) => onFile(files[0]));
    Utils.bindEyeToggle(els.eye, els.pw);
    els.reset.addEventListener('click', resetAll);
    els.btn.addEventListener('click', protect);

    App.registerTab('protect', () => state.file !== null);
  }

  async function onFile(file) {
    if (!Utils.isPdf(file)) { toast('Déposez un fichier PDF.', 'error'); return; }
    try {
      const bytes = await readFile(file);
      const lib = await PdfEngine.openPdfLib(bytes); // valide et compte les pages
      state.file = { name: file.name, bytes, pages: lib.getPageCount() };

      els.card.innerHTML =
        `<svg class="icon"><use href="#i-file"/></svg>` +
        `<span class="row-body"><span class="row-name">${esc(file.name)}</span>` +
        `<span class="row-meta">${state.file.pages} page${state.file.pages > 1 ? 's' : ''} · ${formatSize(file.size)}</span></span>`;
      setMsg(null);
      els.pw.value = els.pw2.value = els.owner.value = '';
      els.drop.hidden = true;
      els.workspace.hidden = false;
      els.pw.focus();
    } catch (e) {
      if (e.code === 'ENCRYPTED') {
        toast(`« ${file.name} » est déjà protégé. Retirez d'abord son mot de passe dans l'onglet Déverrouiller.`, 'error');
      } else {
        toast(`« ${file.name} » : ${e.message}`, 'error');
      }
    }
  }

  function setMsg(text, type) {
    els.msg.hidden = !text;
    els.msg.textContent = text || '';
    els.msg.className = `msg${type ? ' ' + type : ''}`;
  }

  async function protect() {
    if (!state.file || state.busy) return;
    const pw = els.pw.value;
    if (!pw) { setMsg('Choisissez un mot de passe d\u2019ouverture.', 'error'); els.pw.focus(); return; }
    if (pw !== els.pw2.value) { setMsg('Les deux mots de passe ne correspondent pas.', 'error'); els.pw2.focus(); return; }

    state.busy = true;
    els.btn.disabled = true;
    setMsg('Chiffrement en cours…');
    try {
      const modify = els.permModify.checked;
      const doc = await PdfEngine.openPdfLib(state.file.bytes);
      doc.encrypt({
        userPassword: pw,
        ownerPassword: els.owner.value || pw,
        permissions: {
          printing: els.permPrint.checked ? 'highResolution' : false,
          copying: els.permCopy.checked,
          contentAccessibility: true, // lecture par les outils d'accessibilité toujours permise
          modifying: modify,
          annotating: modify,
          fillingForms: modify,
          documentAssembly: modify,
        },
      });
      const bytes = await doc.save();
      const outName = `${baseName(state.file.name)}-protege.pdf`;
      downloadBlob(bytes, outName, 'application/pdf');
      setMsg(`« ${outName} » téléchargé. Conservez précieusement ce mot de passe : il n'existe aucun moyen de le retrouver.`, 'ok');
      toast('PDF protégé téléchargé.', 'success');
    } catch (e) {
      console.error(e);
      setMsg(`Échec du chiffrement : ${e.message}`, 'error');
    } finally {
      state.busy = false;
      els.btn.disabled = false;
    }
  }

  function resetAll() {
    state.file = null;
    els.pw.value = els.pw2.value = els.owner.value = '';
    setMsg(null);
    els.workspace.hidden = true;
    els.drop.hidden = false;
  }

  document.addEventListener('DOMContentLoaded', init);
})();
