import type { AppearanceConfig, CountryConfigResponse, ThemeOption } from "../api-types";
import type { AppLocale } from "../i18n/config";
import { isAppLocale, resolveAppLocale, DEFAULT_LOCALE } from "../i18n/config";

const CONSENT_LOCALES = ["uz", "ru"] as const;

export function isAllowedLocale(
  locale: string,
  configLanguages: string[],
): locale is AppLocale {
  return isAppLocale(locale) && configLanguages.includes(locale);
}

export function isAllowedTheme(
  theme: string,
  allowedThemes: string[],
): theme is ThemeOption {
  return allowedThemes.includes(theme);
}

export function isConsentLocale(locale: string): boolean {
  return (CONSENT_LOCALES as readonly string[]).includes(locale);
}

export function resolveEffectiveLocale(
  profileLanguage?: string | null,
  storedLocale?: string | null,
  configLanguages?: string[],
): AppLocale {
  const languages = configLanguages ?? ["uz", "ru", "en"];

  if (profileLanguage && isAllowedLocale(profileLanguage, languages)) {
    return profileLanguage;
  }
  if (storedLocale && isAllowedLocale(storedLocale, languages)) {
    return storedLocale;
  }
  return resolveAppLocale(languages[0]) ?? DEFAULT_LOCALE;
}

export function resolveEffectiveTheme(
  storedTheme?: string | null,
  appearance?: AppearanceConfig | null,
): ThemeOption {
  const allowed = appearance?.allowedThemes ?? ["light", "dark", "system"];
  const defaultTheme = appearance?.defaultTheme ?? "system";

  if (storedTheme && isAllowedTheme(storedTheme, allowed)) {
    return storedTheme;
  }
  return defaultTheme;
}

export function filterLanguageOptions(
  configLanguages: string[],
): AppLocale[] {
  return configLanguages.filter(isAppLocale);
}

export function isDarkModeEnabled(config?: CountryConfigResponse | null): boolean {
  return config?.appearance?.darkModeEnabled !== false;
}
