"use client";

import { QrCodeInfo } from "@/app/api/qrcode";
import { Box, Button, Modal, ModalProps } from "@mui/material";
import { useCallback, useEffect, useMemo, useState } from "react";
import BarcodeScanner, { BarcodeStringFormat } from "react-qr-barcode-scanner";
import { BarcodeFormat, Result } from "@zxing/library";

interface Props {
  scannerConfig: ScannerConfig;
}

// interface Props extends Omit<ModalProps, "children"> {
//   scannerConfig: ScannerConfig;
// }

const style = {
  position: "absolute",
  top: "50%",
  left: "50%",
  transform: "translate(-50%, -50%)",
  bgcolor: "background.paper",
  pt: 5,
  px: 5,
  pb: 10,
  width: { xs: "80%", sm: "80%", md: "80%" },
};

export var defaultScannerConfig: ScannerConfig = {
  onUpdate: (err, result) => {
    if (result) {
      const data = JSON.parse(result.getText());
      console.log(data);
    } else return;
  },
  width: 500,
  height: 500,
  facingMode: "environment",
  // torch: false
};

export interface ScannerConfig {
  onUpdate: (arg0: unknown, arg1?: Result) => void;
  onError?: (arg0: string | DOMException) => void;
  width?: number | string;
  height?: number | string;
  facingMode?: "environment" | "user"; // default environment
  delay?: number; // Delay between scans in milliseconds. Default is 500ms.
  videoConstraints?: MediaTrackConstraints; // Video constraints to pass to the webcam. If not provided, the default constraints will be used.
  formats?: BarcodeFormat[] | BarcodeStringFormat[]; // Array of barcode formats to decode. If not provided, all formats will be used. A smaller list may improve the speed of the scan.
  stopStream?: boolean;
}

const ReactQrCodeScanner: React.FC<Props> = ({ scannerConfig }) => {
  const [stopStream, setStopStream] = useState(
    scannerConfig.stopStream || defaultScannerConfig.stopStream || false,
  );
  const [torchEnabled, setTorchEnabled] = useState<boolean>(false);
  // const _scannerConfig = useMemo(() => ({
  //   ...defaultScannerConfig,
  //   ...scannerConfig,
  // }),[])
  const [_scannerConfig, setScannerConfig] = useState<ScannerConfig>({
    ...defaultScannerConfig,
  });
  useEffect(() => {
    setScannerConfig({
      ...defaultScannerConfig,
      ...scannerConfig,
    });
  }, []);
  const SwitchOnOffScanner = useCallback(() => {
    // Stop the QR Reader stream (fixes issue where the browser freezes when closing the modal) and then dismiss the modal one tick later
    setStopStream((prev) => !prev);
  }, []);

  const SwitchOnOffTorch = useCallback(() => {
    setTorchEnabled((prev) => !prev);
  }, []);

  return (
    <>
      {!stopStream ? (
        <BarcodeScanner
          stopStream={stopStream}
          torch={torchEnabled}
          {..._scannerConfig}
        />
      ) : undefined}
      <Button onClick={SwitchOnOffTorch}>{torchEnabled ? "off" : "on"}</Button>
      <Button onClick={SwitchOnOffScanner}>
        {stopStream ? "start" : "stop"}
      </Button>
    </>
  );
};
export default ReactQrCodeScanner;
