import {
  SESSION_FLOW_STORAGE_KEY,
  MOBILE_CHECKOUT_RETURN_KEY,
  ROUTES,
} from '@/constants';

function canUseSessionStorage(): boolean {
  return typeof window !== 'undefined';
}

/** Forces light (white) UI — used for mobile app session flow. */
export function applySessionFlowLightTheme(): void {
  if (typeof document === 'undefined') return;
  document.documentElement.classList.remove('dark');
  document.documentElement.style.colorScheme = 'light';
}

export function setSessionFlowFlag(): void {
  if (!canUseSessionStorage()) return;
  sessionStorage.setItem(SESSION_FLOW_STORAGE_KEY, '1');
  applySessionFlowLightTheme();
}

export function isSessionFlow(): boolean {
  if (!canUseSessionStorage()) return false;
  return sessionStorage.getItem(SESSION_FLOW_STORAGE_KEY) === '1';
}

export function clearSessionFlowFlag(): void {
  if (!canUseSessionStorage()) return;
  sessionStorage.removeItem(SESSION_FLOW_STORAGE_KEY);
}

export function setMobileCheckoutReturn(): void {
  if (!canUseSessionStorage()) return;
  sessionStorage.setItem(MOBILE_CHECKOUT_RETURN_KEY, '1');
}

export function isMobileCheckoutReturn(): boolean {
  if (!canUseSessionStorage()) return false;
  return sessionStorage.getItem(MOBILE_CHECKOUT_RETURN_KEY) === '1';
}

export function clearMobileCheckoutReturn(): void {
  if (!canUseSessionStorage()) return;
  sessionStorage.removeItem(MOBILE_CHECKOUT_RETURN_KEY);
}

export function shouldReturnToMobileAccount(): boolean {
  return isSessionFlow() || isMobileCheckoutReturn();
}

export function clearSessionFlowState(): void {
  clearSessionFlowFlag();
  clearMobileCheckoutReturn();
}

export const SESSION_FLOW_ALLOWED_PREFIXES = [
  '/session-page',
  '/mobile',
  '/success',
  '/cancel',
] as const;

export function isSessionFlowAllowedPath(pathname: string | null): boolean {
  if (!pathname) return true;
  return SESSION_FLOW_ALLOWED_PREFIXES.some((prefix) => pathname.startsWith(prefix));
}

const SESSION_FLOW_CHROMELESS_PATHS = [ROUTES.SUCCESS, ROUTES.CANCEL] as const;

export function shouldHideChromeForSessionFlow(pathname: string | null): boolean {
  if (!pathname || !isSessionFlow()) return false;
  return SESSION_FLOW_CHROMELESS_PATHS.includes(
    pathname as (typeof SESSION_FLOW_CHROMELESS_PATHS)[number],
  );
}
