import type { ReviewSettings } from '../types';

declare global {
  interface Window {
    CommentMateSettings?: Partial<ReviewSettings>;
  }
}

const fallbackRestUrl = `${window.location.origin}/wp-json/commentmate/v1/`;
const reviewModeParam = 'commentmate-mode';
const reviewModeStorageKey = 'commentmate-review-mode';

export function reviewSettings(): ReviewSettings {
  const settings = window.CommentMateSettings ?? {};

  return {
    restUrl: ensureTrailingSlash(settings.restUrl ?? fallbackRestUrl),
    pluginUrl: settings.pluginUrl,
    reviewParam: settings.reviewParam ?? 'review',
    csrfToken: settings.csrfToken,
    // Some WordPress integrations emit an empty string rather than a boolean.
    // Treat that as unset so the live viewport remains the responsive authority.
    isMobile: Boolean(settings.isMobile) || isSmallOrCoarsePointer(),
    session: settings.session ?? null,
    admin: settings.admin ?? null
  };
}

export function ensureTrailingSlash(url: string): string {
  return url.endsWith('/') ? url : `${url}/`;
}

export function isReviewRequest(): boolean {
  const { reviewParam } = reviewSettings();
  return new URL(window.location.href).searchParams.get(reviewParam) === 'true';
}

export function isSmallOrCoarsePointer(): boolean {
  return typeof window.matchMedia === 'function' && window.matchMedia('(max-width: 767px), (pointer: coarse)').matches;
}

export function reviewUrl(target: string | URL): string {
  const url = new URL(target, window.location.origin);
  if (url.origin !== window.location.origin) {
    return url.toString();
  }

  url.searchParams.set(reviewSettings().reviewParam, 'true');
  if (persistedReviewMode() === 'browse') url.searchParams.set(reviewModeParam, 'browse');
  else url.searchParams.delete(reviewModeParam);
  return url.toString();
}

export function initialReviewMode(): 'comment' | 'browse' {
  return new URL(window.location.href).searchParams.get(reviewModeParam) === 'browse' || persistedReviewMode() === 'browse'
    ? 'browse'
    : 'comment';
}

export function rememberReviewMode(mode: 'comment' | 'browse'): void {
  try {
    window.sessionStorage.setItem(reviewModeStorageKey, mode);
  } catch {
    // URL propagation still preserves the mode when storage is restricted.
  }
}

function persistedReviewMode(): 'comment' | 'browse' {
  const fromUrl = new URL(window.location.href).searchParams.get(reviewModeParam);
  if (fromUrl === 'browse') return 'browse';
  try {
    return window.sessionStorage.getItem(reviewModeStorageKey) === 'browse' ? 'browse' : 'comment';
  } catch {
    return 'comment';
  }
}

export function exitReviewMode(): void {
  window.location.assign(urlWithoutReviewMode(window.location.href));
}

export function urlWithoutReviewMode(target: string | URL): string {
  const url = new URL(target, window.location.origin);
  url.searchParams.delete(reviewSettings().reviewParam);
  url.searchParams.delete('commentmate-mode');
  url.searchParams.delete('commentmate-focus');
  url.searchParams.delete('commentmate-focus-kind');
  if (url.hash.startsWith('#commentmate=')) url.hash = '';
  return url.toString();
}
