import { useState, useCallback, useRef } from 'react';
import { reloadIframe } from '@ablogcms/utils';
import * as api from '../api';
import { rewriteUrl } from '../utils';

export default function usePreviewMode({ initialUrl = '' } = {}) {
  const iframeRef = useRef<HTMLIFrameElement | null>(null);
  const [url, setUrl] = useState(rewriteUrl(initialUrl));
  const [isLoading, setIsLoading] = useState(false);
  const [error, setError] = useState<Error | null>(null);

  const setIframeRef = useCallback((iframe: HTMLIFrameElement | null) => {
    iframeRef.current = iframe;
  }, []);

  const changeUrl = useCallback((url: string) => {
    setUrl(rewriteUrl(url));
  }, []);

  const doEnablePreviewMode = useCallback(async (ua: string) => {
    const formData = new FormData();
    formData.append('preview_fake_ua', ua);
    formData.append('preview_token', window.csrfToken);
    await api.enablePreviewMode(formData);
    if (iframeRef.current) {
      await reloadIframe(iframeRef.current);
    }
  }, []);

  const enablePreviewMode = useCallback(
    async (ua: string) => {
      setIsLoading(true);
      try {
        await doEnablePreviewMode(ua);
        // プレビュー共有ページ（admin/preview/share.html）は Preview::isPreviewShareAdmin により
        // 管理画面バンドル（ACMS.events を初期化する admin.js）が読み込まれないため、
        // ACMS.events 自体が undefined になりうる（公開エントリの built-in/dispatch.js 経由で
        // このフックへ到達する）。実際に本番でも共有ページ上でデバイス切替が行われる想定のため要ガード
        void ACMS.events?.emit('preview.mode.change', { enabled: true });
      } catch (error) {
        console.error(error);
        if (error instanceof Error) {
          setError(new Error(error.message));
        }
      } finally {
        setIsLoading(false);
      }
    },
    [doEnablePreviewMode]
  );

  const disablePreviewMode = useCallback(async () => {
    try {
      await api.disablePreviewMode();
      void ACMS.events?.emit('preview.mode.change', { enabled: false });
    } catch (error) {
      console.error(error);
      if (error instanceof Error) {
        setError(new Error(error.message));
      }
    }
  }, []);

  return { setIframeRef, isLoading, enablePreviewMode, disablePreviewMode, error, url, changeUrl };
}
