// libs/setting/src/lib/hooks.ts

import { useCallback } from 'react';
import { useSettingStore } from './store';
import { ApplicationStatus } from '@bc-game/core';
import type { Theme, Language } from './types';

// ===== Theme Hooks =====

/**
 * 테마 관련 기능을 제공하는 훅
 */
export function useTheme() {
  const theme = useSettingStore((state) => state.theme);
  const setThemeAction = useSettingStore((state) => state.setTheme);
  const toggleThemeAction = useSettingStore((state) => state.toggleTheme);

  const setTheme = useCallback(
    (newTheme: Theme) => {
      setThemeAction(newTheme);
    },
    [setThemeAction],
  );

  const toggleTheme = useCallback(() => {
    toggleThemeAction();
  }, [toggleThemeAction]);

  const setLight = useCallback(() => {
    setThemeAction('light');
  }, [setThemeAction]);

  const setDark = useCallback(() => {
    setThemeAction('dark');
  }, [setThemeAction]);

  return {
    theme,
    isDark: theme === 'dark',
    isLight: theme === 'light',
    setTheme,
    toggleTheme,
    setLight,
    setDark,
  } as const;
}

export function useCurrentTheme(): Theme {
  return useSettingStore((state) => state.theme);
}

export function useIsDarkMode(): boolean {
  return useSettingStore((state) => state.theme === 'dark');
}

export function useIsLightMode(): boolean {
  return useSettingStore((state) => state.theme === 'light');
}

export function useSetTheme(): (theme: Theme) => void {
  return useSettingStore((state) => state.setTheme);
}

export function useToggleTheme(): () => void {
  return useSettingStore((state) => state.toggleTheme);
}

// ===== Language Hooks =====

/**
 * 언어 관련 기능을 제공하는 훅
 */
export function useLanguage() {
  const language = useSettingStore((state) => state.language);
  const setLanguageAction = useSettingStore((state) => state.setLanguage);

  const setLanguage = useCallback(
    (newLanguage: Language) => {
      setLanguageAction(newLanguage);
    },
    [setLanguageAction],
  );

  const setKorean = useCallback(() => {
    setLanguageAction('ko');
  }, [setLanguageAction]);

  const setEnglish = useCallback(() => {
    setLanguageAction('en');
  }, [setLanguageAction]);

  const toggleLanguage = useCallback(() => {
    const currentLanguage = useSettingStore.getState().language;
    setLanguageAction(currentLanguage === 'ko' ? 'en' : 'ko');
  }, [setLanguageAction]);

  return {
    language,
    isKorean: language === 'ko',
    isEnglish: language === 'en',
    setLanguage,
    setKorean,
    setEnglish,
    toggleLanguage,
  } as const;
}

export function useCurrentLanguage(): Language {
  return useSettingStore((state) => state.language);
}

export function useIsKorean(): boolean {
  return useSettingStore((state) => state.language === 'ko');
}

export function useIsEnglish(): boolean {
  return useSettingStore((state) => state.language === 'en');
}

export function useSetLanguage(): (language: Language) => void {
  return useSettingStore((state) => state.setLanguage);
}

export function useTranslation<T>(translations: Record<Language, T>): T {
  const language = useSettingStore((state) => state.language);
  return translations[language];
}

export function useT(): <T>(translations: Record<Language, T>) => T {
  const language = useSettingStore((state) => state.language);
  return useCallback(
    <T>(translations: Record<Language, T>): T => translations[language],
    [language],
  );
}

// ===== Setting Hooks =====

/**
 * 전체 설정 관련 기능을 제공하는 통합 훅
 */
export function useSetting() {
  const theme = useSettingStore((state) => state.theme);
  const language = useSettingStore((state) => state.language);
  const status = useSettingStore((state) => state.status);
  const error = useSettingStore((state) => state.error);
  const config = useSettingStore((state) => state.config);

  const setThemeAction = useSettingStore((state) => state.setTheme);
  const toggleThemeAction = useSettingStore((state) => state.toggleTheme);
  const setLanguageAction = useSettingStore((state) => state.setLanguage);
  const resetToDefaultsAction = useSettingStore(
    (state) => state.resetToDefaults,
  );
  const setupAction = useSettingStore((state) => state.setup);
  const teardownAction = useSettingStore((state) => state.teardown);

  const setTheme = useCallback(
    (newTheme: Theme) => setThemeAction(newTheme),
    [setThemeAction],
  );

  const toggleTheme = useCallback(
    () => toggleThemeAction(),
    [toggleThemeAction],
  );

  const setLanguage = useCallback(
    (newLanguage: Language) => setLanguageAction(newLanguage),
    [setLanguageAction],
  );

  const resetToDefaults = useCallback(
    () => resetToDefaultsAction(),
    [resetToDefaultsAction],
  );

  const setup = useCallback(async () => setupAction(), [setupAction]);

  const teardown = useCallback(async () => teardownAction(), [teardownAction]);

  return {
    theme,
    language,
    config,
    status,
    error,
    isDark: theme === 'dark',
    isLight: theme === 'light',
    isKorean: language === 'ko',
    isEnglish: language === 'en',
    isReady: status === ApplicationStatus.READY,
    isSettingUp: status === ApplicationStatus.SETTING_UP,
    hasError: status === ApplicationStatus.ERROR,
    setTheme,
    toggleTheme,
    setLanguage,
    resetToDefaults,
    setup,
    teardown,
  } as const;
}

export function useSettingStatus() {
  const status = useSettingStore((state) => state.status);
  const error = useSettingStore((state) => state.error);

  return {
    status,
    error,
    isReady: status === ApplicationStatus.READY,
    isSettingUp: status === ApplicationStatus.SETTING_UP,
    hasError: status === ApplicationStatus.ERROR,
    isIdle: status === ApplicationStatus.IDLE,
  } as const;
}

export function useSettingReady(): boolean {
  return useSettingStore((state) => state.status === ApplicationStatus.READY);
}
