/**
 * Helper QZ Tray pentru print direct la imprimanta de labeluri.
 *
 * QZ Tray (aplicație desktop) expune un websocket local; biblioteca qz-tray.js
 * trimite joburi de print direct la imprimantă, fără dialogul browserului.
 *
 * Pentru uz local rulăm NESEMNAT: la prima conexiune QZ Tray cere permisiune
 * ("Allow"). Pentru producție se poate adăuga certificat + semnătură.
 */
window.QZLabels = {
  _secSet: false,
  _connecting: null,

  available() {
    return typeof window.qz !== 'undefined';
  },

  _setupSecurity() {
    if (this._secSet || !this.available()) return;

    var certUrl = window.QZ_CERT_URL;
    var signUrl = window.QZ_SIGN_URL;

    if (certUrl && signUrl) {
      // Semnat: certificat + semnătură server-side → QZ poate „Remember", fără
      // prompt repetat.
      qz.security.setCertificatePromise(function (resolve, reject) {
        fetch(certUrl, { credentials: 'same-origin', cache: 'no-store' })
          .then(function (r) { return r.text(); })
          .then(resolve)
          .catch(reject);
      });
      if (qz.security.setSignatureAlgorithm) qz.security.setSignatureAlgorithm('SHA512');
      qz.security.setSignaturePromise(function (toSign) {
        return function (resolve, reject) {
          fetch(signUrl, {
            method: 'POST',
            credentials: 'same-origin',
            headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
            body: 'request=' + encodeURIComponent(toSign),
          })
            .then(function (r) { return r.text(); })
            .then(resolve)
            .catch(reject);
        };
      });
    } else {
      // Fallback nesemnat → QZ cere permisiune utilizatorului.
      qz.security.setCertificatePromise(function (resolve) { resolve(); });
      qz.security.setSignaturePromise(function (toSign) { return function (resolve) { resolve(); }; });
    }
    this._secSet = true;
  },

  isConnected() {
    return this.available() && qz.websocket.isActive();
  },

  async connect() {
    if (!this.available()) {
      throw new Error('QZ Tray nu este încărcat / instalat. Instalează aplicația QZ Tray și pornește-o.');
    }
    this._setupSecurity();
    if (qz.websocket.isActive()) return;
    if (!this._connecting) {
      this._connecting = qz.websocket.connect()
        .catch((e) => { this._connecting = null; throw e; });
    }
    await this._connecting;
    this._connecting = null;
  },

  async listPrinters() {
    await this.connect();
    return qz.printers.find();
  },

  /**
   * Construiește HTML-ul unui label (dimensiune în mm) din SVG-ul codului de bare
   * deja randat + textul cu modelul de telefon.
   */
  buildLabelHtml(barcodeSvg, phoneText, widthMm, heightMm, titleText) {
    const w = Number(widthMm) || 40, h = Number(heightMm) || 30;
    const esc = (s) => (s || '').toString().replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
    const phone = esc(phoneText);
    const title = esc(titleText);
    return '<!DOCTYPE html><html><head><meta charset="utf-8"><style>'
      + 'html,body{margin:0;padding:0}'
      + '.l{width:' + w + 'mm;height:' + h + 'mm;display:flex;flex-direction:column;'
      + 'align-items:center;justify-content:center;box-sizing:border-box;padding:1mm;overflow:hidden}'
      + '.l svg{max-width:100%;height:auto}'
      + '.t{font-size:9px;font-weight:700;text-align:center;margin-top:0.5mm;font-family:sans-serif}'
      + '.p{font-size:9px;font-weight:700;text-align:center;margin-top:0.3mm;font-family:sans-serif}'
      + '</style></head><body><div class="l">' + (barcodeSvg || '')
      + (title ? '<div class="t">' + title + '</div>' : '')
      + '<div class="p">' + (phone || '') + '</div></div></body></html>';
  },

  /**
   * Printează un label HTML pe imprimanta dată, în `copies` exemplare.
   * opts: { widthMm, heightMm, copies, density, interpolation, rotation, colorType, scaleContent }
   */
  async printLabel(printer, html, opts) {
    opts = opts || {};
    if (!printer) throw new Error('Nicio imprimantă selectată (configureaz-o în Setări).');
    await this.connect();
    const cfg = {
      copies: Math.max(1, parseInt(opts.copies, 10) || 1),
      units: 'mm',
      size: { width: Number(opts.widthMm) || 40, height: Number(opts.heightMm) || 30 },
      margins: 0,
      rotation: parseInt(opts.rotation, 10) || 0,
      scaleContent: opts.scaleContent !== false,
    };
    if (opts.colorType)     cfg.colorType     = opts.colorType;      // color | grayscale | blackwhite
    if (opts.interpolation) cfg.interpolation = opts.interpolation;  // nearest-neighbor | bilinear | bicubic
    if (opts.density)       cfg.density       = Number(opts.density); // rezoluție rasterizare (DPI)
    return qz.print(qz.configs.create(printer, cfg), [{ type: 'html', format: 'plain', data: html }]);
  },
};
