'use client';

import { useEffect } from 'react';

interface LemonSqueezyWindow extends Window {
  createLemonSqueezy: () => void;
  LemonSqueezy: {
    Setup: (options: {
      eventHandler: (event: { event: string } | string) => void;
    }) => void;
    Refresh: () => void;
    Url: {
      Open: (url: string) => void;
      Close: () => void;
    };
  };
}

export function LemonSqueezyEmbeddedCheckout(props: {
  checkoutToken: string;
  onClose?: () => void;
}) {
  useLoadScript(props.checkoutToken, props.onClose);

  return null;
}

function useLoadScript(
  checkoutToken: string,
  onClose: (() => void) | undefined,
) {
  useEffect(() => {
    const script = document.createElement('script');

    script.src = 'https://app.lemonsqueezy.com/js/lemon.js';

    script.onload = () => {
      const win = window as unknown as LemonSqueezyWindow;

      win.createLemonSqueezy();
      win.LemonSqueezy.Url.Open(checkoutToken);

      if (onClose) {
        win.LemonSqueezy.Setup({
          eventHandler: (event) => {
            if (typeof event === 'string') {
              if (event === 'close') {
                onClose();
              }

              return;
            }

            if (event.event === 'PaymentMethodUpdate.Closed') {
              onClose();
            }
          },
        });
      }
    };

    document.body.appendChild(script);

    return () => {
      document.body.removeChild(script);
    };
  }, [checkoutToken, onClose]);
}
