import { create } from 'zustand'
import { createJSONStorage, persist, type StateStorage } from 'zustand/middleware'

export interface LocaleStore {
  locale: string
  setLocale: (locale: string) => void
}

export interface CreateLocaleStoreOptions {
  defaultLocale: string
  storageKey?: string
  storage?: StateStorage
}

const browserStorage: StateStorage = {
  getItem: (key) => {
    try {
      return typeof window === 'undefined' ? null : (window.localStorage?.getItem(key) ?? null)
    } catch {
      return null
    }
  },
  setItem: (key, value) => {
    try {
      if (typeof window !== 'undefined') window.localStorage?.setItem(key, value)
    } catch {
      // Storage can be unavailable (SSR, sandboxed frames, privacy modes). Keep state in memory.
    }
  },
  removeItem: (key) => {
    try {
      if (typeof window !== 'undefined') window.localStorage?.removeItem(key)
    } catch {
      // See setItem: persistence is best-effort, store updates must remain usable.
    }
  },
}

export function createLocaleStore(options: CreateLocaleStoreOptions) {
  const { defaultLocale, storageKey = 'platform_locale', storage } = options
  return create<LocaleStore>()(
    persist(
      (set) => ({
        locale: defaultLocale,
        setLocale: (locale) => set({ locale }),
      }),
      {
        name: storageKey,
        storage: createJSONStorage(() => storage ?? browserStorage),
      },
    ),
  )
}

/** Cookie-backed persist storage for hosts that prefer cookie over localStorage. */
export function createCookieStorage(cookieName: string): StateStorage {
  return {
    getItem: () => {
      if (typeof document === 'undefined') return null
      const match = document.cookie.match(new RegExp(`(?:^|;\\s*)${cookieName}=([^;]*)`))
      return match?.[1] ? decodeURIComponent(match[1]) : null
    },
    setItem: (_key, value) => {
      if (typeof document === 'undefined') return
      document.cookie = `${cookieName}=${encodeURIComponent(value)};path=/;max-age=31536000;samesite=lax`
    },
    removeItem: () => {
      if (typeof document === 'undefined') return
      document.cookie = `${cookieName}=;path=/;max-age=0`
    },
  }
}
