import React, { useEffect } from 'react';
import useRouter from '@/_hooks/use-router';
import config from 'config';
import toast from 'react-hot-toast';
import './embed-loader.scss';
import Loader from '@/ToolJetUI/Loader/Loader';

// In-memory PAT token store
let inMemoryPatToken = null;

export function setPatToken(patToken) {
  inMemoryPatToken = patToken;
}

export function getPatToken() {
  if (inMemoryPatToken) return inMemoryPatToken;
  // Fallback to window.name (persists across same-tab navigations)
  if (window.name && window.name.length > 0) {
    inMemoryPatToken = window.name;
    return inMemoryPatToken;
  }
  return undefined;
}

export default function EmbedAppRedirect() {
  const router = useRouter();
  const { appId } = router.query;

  useEffect(() => {
    // 🔐 Ensure the page is embedded
    if (window.self === window.top) {
      // Not inside an iframe
      toast.error('This page must be embedded inside a parent application.');
      return;
    }
    const token = new URLSearchParams(window.location.search).get('personal-access-token');

    if (!token || typeof appId !== 'string') {
      parent?.postMessage({ type: 'TJ_EMBED_APP_LOGOUT', error: 400, message: 'Missing token or appId' }, '*');
      return;
    }

    const initiateSession = async () => {
      try {
        const res = await fetch(`${config.apiUrl}/ext/users/session`, {
          method: 'POST',
          headers: { 'Content-Type': 'application/json' },
          credentials: 'include',
          body: JSON.stringify({ appId, accessToken: token }),
        });
        if (!res.ok) {
          if (res.status === 401 || res.status === 403) {
            toast.error('Your pat is expired. Please refresh or contact your admin.');
            // 🔔 Show toast if token is expired or invalid
            parent?.postMessage(
              {
                type: 'TJ_EMBED_APP_LOGOUT',
                error: res.status,
                message: 'Your pat is expired. Please refresh or contact your admin.',
              },
              '*'
            );
          }
          return;
        }

        const result = await res.json();
        // ✅ Store PAT in memory
        setPatToken(result.signedPat);
        window.name = result.signedPat;
        window.location.href = `applications/${appId}`;
      } catch (error) {
        parent?.postMessage({ type: 'TJ_EMBED_APP_LOGOUT', error: 500, message: 'Network error' }, '*');
      }
    };

    initiateSession();
  }, [appId]);

  return (
    <div className="embed-loader">
      <div className="embed-loader__content">
        <Loader width={30} absolute={false} />
        <div className="embed-loader__text">Loading embedded app</div>
      </div>
    </div>
  );
}
