/* ════════════════════════════════════════════════════════════════════
   tab-unlock.js — retrait du mot de passe d'un PDF.
   Fonctionne quand l'utilisateur connaît le mot de passe (d'ouverture
   ou propriétaire). Un champ laissé vide couvre le cas des PDF qui
   s'ouvrent librement mais bloquent copie / impression (restrictions
   posées avec un mot de passe propriétaire seul).
   ════════════════════════════════════════════════════════════════════ */
(() => {
  'use strict';
  const { byId, esc, toast, readFile, downloadBlob, baseName, formatSize } = Utils;

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

  const els = {};

  function init() {
    ['drop', 'file', 'workspace', 'card', 'status', 'pw', 'pw-field', 'eye', 'msg', 'reset', 'btn']
      .forEach((k) => { els[k.replace(/-(\w)/g, (_, c) => c.toUpperCase())] = byId(`unl-${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', unlock);
    els.pw.addEventListener('keydown', (e) => { if (e.key === 'Enter') unlock(); });

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

  async function onFile(file) {
    if (!Utils.isPdf(file)) { toast('Déposez un fichier PDF.', 'error'); return; }
    let bytes;
    try {
      bytes = await readFile(file);
    } catch (e) { toast(e.message, 'error'); return; }

    // Un chargement sans mot de passe détermine l'état du document.
    let encrypted = false;
    try {
      await PdfEngine.openPdfLib(bytes);
    } catch (e) {
      if (e.code === 'ENCRYPTED') encrypted = true;
      else { toast(`« ${file.name} » : ${e.message}`, 'error'); return; }
    }

    state.file = { name: file.name, bytes };
    state.encrypted = encrypted;
    els.card.innerHTML =
      `<svg class="icon"><use href="#${encrypted ? 'i-lock' : 'i-file'}"/></svg>` +
      `<span class="row-body"><span class="row-name">${esc(file.name)}</span>` +
      `<span class="row-meta">${formatSize(file.size)}${encrypted ? ' · document protégé' : ''}</span></span>`;

    els.status.hidden = encrypted;
    els.status.textContent = 'Ce document n\u2019est pas protégé par un mot de passe : rien à déverrouiller.';
    els.status.className = 'msg ok';
    els.pwField.hidden = !encrypted;
    els.pw.value = '';
    els.btn.disabled = !encrypted;
    setMsg(null);
    els.drop.hidden = true;
    els.workspace.hidden = false;
    if (encrypted) els.pw.focus();
  }

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

  async function unlock() {
    if (!state.file || !state.encrypted || state.busy) return;
    state.busy = true;
    els.btn.disabled = true;
    setMsg('Déchiffrement en cours…');
    try {
      // La chaîne vide est un mot de passe valable : elle ouvre les PDF
      // dont seul le mot de passe propriétaire a été défini.
      const doc = await PdfEngine.openPdfLib(state.file.bytes, els.pw.value);
      const bytes = await doc.save();
      const outName = `${baseName(state.file.name)}-deverrouille.pdf`;
      downloadBlob(bytes, outName, 'application/pdf');
      setMsg(`« ${outName} » téléchargé : il s'ouvre désormais sans mot de passe ni restriction.`, 'ok');
      toast('PDF déverrouillé téléchargé.', 'success');
    } catch (e) {
      if (e.code === 'BAD_PASSWORD' || e.code === 'ENCRYPTED') {
        setMsg('Mot de passe incorrect pour ce document. Vérifiez la saisie et réessayez.', 'error');
        els.pw.focus();
        els.pw.select();
      } else {
        console.error(e);
        setMsg(`Échec du déverrouillage : ${e.message}`, 'error');
      }
    } finally {
      state.busy = false;
      els.btn.disabled = !state.encrypted;
    }
  }

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

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