import { setCookie, parseCookies, destroyCookie } from 'nookies';
import { AuthUser } from '@ready/shared-types';

export const COOKIE_KEYS = {
  FOOD_ACCESS_TOKEN: 'COOKIES_USER_ACCESS_TOKEN',
  CAB_ACCESS_TOKEN: 'cookies_user_access_token',
  CAB_TEMP_TOKEN: 'cookies_user_access_token_temp',
  TEMP_FOOD_TOKEN: 'TEMP_COOKIES_USER_ACCESS_TOKEN',
} as const;

export const COOKIE_DEFAULT_OPTIONS = {
  maxAge: 30 * 24 * 60 * 60, // 30 days
  path: '/',
  sameSite: 'lax' as const,
  secure: typeof window !== 'undefined' ? window.location.protocol === 'https:' : false,
};

/**
 * Saves access token across all cookie aliases so both Food (Next) and Cab (React) can read it.
 */
export function setAuthSession(token: string, ctx: any = null) {
  if (!token) return;

  setCookie(ctx, COOKIE_KEYS.FOOD_ACCESS_TOKEN, token, COOKIE_DEFAULT_OPTIONS);
  setCookie(ctx, COOKIE_KEYS.CAB_ACCESS_TOKEN, token, COOKIE_DEFAULT_OPTIONS);
  destroyCookie(ctx, COOKIE_KEYS.CAB_TEMP_TOKEN, { path: '/' });
  destroyCookie(ctx, COOKIE_KEYS.TEMP_FOOD_TOKEN, { path: '/' });

  if (typeof window !== 'undefined') {
    try {
      sessionStorage.setItem('token', token);
      localStorage.setItem('auth_token', token);
    } catch (e) {
      // Ignore storage errors in private browsing
    }
  }
}

/**
 * Sets temporary token during multi-step OTP or registration flows.
 */
export function setTempAuthToken(token: string, ctx: any = null) {
  if (!token) return;

  setCookie(ctx, COOKIE_KEYS.CAB_TEMP_TOKEN, token, COOKIE_DEFAULT_OPTIONS);
  setCookie(ctx, COOKIE_KEYS.TEMP_FOOD_TOKEN, token, COOKIE_DEFAULT_OPTIONS);

  if (typeof window !== 'undefined') {
    try {
      sessionStorage.setItem('temp_token', token);
    } catch (e) {}
  }
}

/**
 * Retrieves the current active access token from cookies or fallback storage.
 */
export function getAuthToken(ctx: any = null): string | null {
  const cookies = parseCookies(ctx);
  const token =
    cookies[COOKIE_KEYS.FOOD_ACCESS_TOKEN] ||
    cookies[COOKIE_KEYS.CAB_ACCESS_TOKEN] ||
    cookies[COOKIE_KEYS.CAB_TEMP_TOKEN] ||
    cookies[COOKIE_KEYS.TEMP_FOOD_TOKEN];

  if (token) return token;

  if (typeof window !== 'undefined') {
    return sessionStorage.getItem('token') || localStorage.getItem('auth_token') || null;
  }

  return null;
}

/**
 * Clears all authentication state from cookies, session, and local storage.
 */
export function clearAuthSession(ctx: any = null) {
  destroyCookie(ctx, COOKIE_KEYS.FOOD_ACCESS_TOKEN, { path: '/' });
  destroyCookie(ctx, COOKIE_KEYS.CAB_ACCESS_TOKEN, { path: '/' });
  destroyCookie(ctx, COOKIE_KEYS.CAB_TEMP_TOKEN, { path: '/' });
  destroyCookie(ctx, COOKIE_KEYS.TEMP_FOOD_TOKEN, { path: '/' });

  if (typeof window !== 'undefined') {
    try {
      sessionStorage.clear();
      localStorage.removeItem('auth_token');
      localStorage.removeItem('user_info');
    } catch (e) {}
  }
}
