'use client';

const STORAGE_KEY = 'gooseek_sidebar_menu_v2';

// Порядок по популярности для РФ: поиск, история, финансы, здоровье, путешествия, обучение, медицина, недвижимость, психология, спорт, дети, товары, покупки, игры, налоги, законодательство
export const DEFAULT_ORDER = [
  'discover',
  'library',
  'finance',
  'health',
  'travel',
  'education',
  'medicine',
  'spaces',
  'realEstate',
  'psychology',
  'sports',
  'children',
  'goods',
  'shopping',
  'games',
  'taxes',
  'legislation',
  'profile',
] as const;

export type SidebarItemId = (typeof DEFAULT_ORDER)[number];

export interface SidebarMenuConfig {
  order: string[];
  visible: Record<string, boolean>;
}

const defaultVisible: Record<string, boolean> = Object.fromEntries(
  DEFAULT_ORDER.map((id) => [id, true]),
);

function parseConfig(raw: string | null): SidebarMenuConfig {
  if (!raw) {
    return { order: [...DEFAULT_ORDER], visible: { ...defaultVisible } };
  }
  try {
    const parsed = JSON.parse(raw) as Partial<SidebarMenuConfig>;
    const order = Array.isArray(parsed.order) ? parsed.order : [...DEFAULT_ORDER];
    const visible =
      parsed.visible && typeof parsed.visible === 'object'
        ? { ...defaultVisible, ...parsed.visible }
        : { ...defaultVisible };
    return { order, visible };
  } catch {
    return { order: [...DEFAULT_ORDER], visible: { ...defaultVisible } };
  }
}

export function getSidebarMenuConfig(): SidebarMenuConfig {
  if (typeof window === 'undefined') {
    return { order: [...DEFAULT_ORDER], visible: { ...defaultVisible } };
  }
  return parseConfig(localStorage.getItem(STORAGE_KEY));
}

export function setSidebarMenuConfig(config: SidebarMenuConfig): void {
  if (typeof window === 'undefined') return;
  localStorage.setItem(STORAGE_KEY, JSON.stringify(config));
  window.dispatchEvent(new CustomEvent('client-config-changed'));
}

export function isSidebarItemVisible(id: string): boolean {
  const config = getSidebarMenuConfig();
  return config.visible[id] !== false;
}

export function setSidebarItemVisible(id: string, visible: boolean): void {
  const config = getSidebarMenuConfig();
  config.visible[id] = visible;
  setSidebarMenuConfig(config);
}

export function getSidebarOrder(): string[] {
  return getSidebarMenuConfig().order;
}

export function setSidebarOrder(order: string[]): void {
  const config = getSidebarMenuConfig();
  config.order = order;
  setSidebarMenuConfig(config);
}
