import { useState as a, useRef as N, useEffect as k } from "react";
import * as x from "pdfjs-dist";
import { ErrorType as O } from "../types.js";
import { getThumbnailViewport as U } from "../getThumbnailViewport.js";
import { useConfigContext as h } from "../../contexts/ConfigContext.js";
import { useDocumentPasswordContext as j } from "../../contexts/DocumentPasswordContext.js";
const G = (f, s, V = {}) => {
  const [n, C] = a(), { workerUrlAdded: y } = h(), [I, L] = a(/* @__PURE__ */ new Map()), d = N(), [S, m] = a(0), [P, T] = a(!1), [q, v] = a(), { password: u, passwordError: D, setPasswordError: c, passwordRequired: g, setPasswordRequired: p } = j(), { onLoadError: i, onLoaded: w } = V;
  return k(() => {
    if (!y || !f)
      return;
    m(0), d.current = Date.now();
    const r = d.current, E = {
      url: f,
      cMapPacked: (s == null ? void 0 : s.isCompressed) ?? !0,
      ...(s == null ? void 0 : s.url) && { cMapUrl: s.url },
      ...u && { password: u },
      verbosity: x.VerbosityLevel.ERRORS
    };
    try {
      const e = x.getDocument(E);
      e.onProgress = (o) => {
        if (r === d.current) {
          const { loaded: R, total: l } = o, b = l ? Math.min(100, Math.round(R / l * 100)) : 0;
          m(b);
        }
      }, T(!0);
      const t = e.promise.then((o) => (r === d.current && (C(o), m(100)), w && w(o), p(!1), c(""), o)).catch((o) => {
        o instanceof Error && o.name === "PasswordException" ? (p(!0), c(o.message || "Password required")) : o instanceof Error && o.name === "InvalidPDFException" && u ? (p(!0), c("Incorrect password")) : i && i(o);
      }).finally(() => {
        T(!1);
      });
      return () => {
        t.finally(() => {
          e.destroy();
        });
      };
    } catch (e) {
      v(O.NOT_SUPPORTED), i && i(e);
    }
  }, [f, y, u, i, w]), k(() => {
    if (g)
      return;
    const r = /* @__PURE__ */ new Map();
    if (!n || P) {
      L(r);
      return;
    }
    const E = n.numPages, e = [];
    for (let t = 1; t <= E; t++) {
      const o = n.getPage(t);
      e.push(o);
    }
    Promise.all(e).then((t) => {
      t.map((o) => {
        const { thumbnailViewport: R, scale: l } = U(o), b = o.getViewport();
        r.set(o.pageNumber, {
          page: o,
          thumbnailViewport: R,
          thumbnailScale: l,
          defaultRotation: b.rotation
        });
      }), L(r);
    });
  }, [n, P, g]), {
    pdf: n,
    pages: I,
    loading: P,
    error: q,
    loadingProgress: S,
    passwordRequired: g,
    passwordError: D
  };
};
export {
  G as useLoadPdf
};
