import * as SecureStore from 'expo-secure-store';
import { create } from 'zustand';
import type { BootstrapPayload, Locale, Site, ThemeMode, User } from '../types/models';

const K_ACCESS='baltique.access'; const K_REFRESH='baltique.refresh'; const K_DEVICE='baltique.device'; const K_PREFS='baltique.prefs';
const uuid = () => `${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}-${Math.random().toString(36).slice(2)}`;
export type SessionState = {
  hydrated:boolean; accessToken:string|null; refreshToken:string|null; deviceUid:string; user:User|null; bootstrap:BootstrapPayload|null; locale:Locale; theme:ThemeMode; site:Site|null; biometric:boolean;
  hydrate:()=>Promise<void>; setTokens:(a:string|null,r:string|null)=>Promise<void>; setBootstrap:(b:BootstrapPayload)=>Promise<void>; setLocale:(l:Locale)=>Promise<void>; setTheme:(t:ThemeMode)=>Promise<void>; setSite:(s:Site)=>Promise<void>; setBiometric:(v:boolean)=>Promise<void>; clear:()=>Promise<void>;
};
async function savePrefs(state: Pick<SessionState,'locale'|'theme'|'biometric'>){await SecureStore.setItemAsync(K_PREFS,JSON.stringify(state));}
export const useSession = create<SessionState>((set,get)=>({
  hydrated:false,accessToken:null,refreshToken:null,deviceUid:'',user:null,bootstrap:null,locale:'pl',theme:'system',site:null,biometric:false,
  hydrate:async()=>{let device=await SecureStore.getItemAsync(K_DEVICE);if(!device){device=uuid();await SecureStore.setItemAsync(K_DEVICE,device);}let prefs:any={};try{prefs=JSON.parse((await SecureStore.getItemAsync(K_PREFS))||'{}');}catch{}set({deviceUid:device,accessToken:await SecureStore.getItemAsync(K_ACCESS),refreshToken:await SecureStore.getItemAsync(K_REFRESH),locale:prefs.locale==='en'?'en':'pl',theme:['dark','light','system'].includes(prefs.theme)?prefs.theme:'system',biometric:!!prefs.biometric,hydrated:true});},
  setTokens:async(a,r)=>{if(a)await SecureStore.setItemAsync(K_ACCESS,a);else await SecureStore.deleteItemAsync(K_ACCESS);if(r)await SecureStore.setItemAsync(K_REFRESH,r);else await SecureStore.deleteItemAsync(K_REFRESH);set({accessToken:a,refreshToken:r});},
  setBootstrap:async b=>{set({bootstrap:b,user:b.user,locale:b.locale||get().locale,theme:b.theme||get().theme,site:b.site});await savePrefs({...get(),locale:b.locale||get().locale,theme:b.theme||get().theme,biometric:get().biometric});},
  setLocale:async locale=>{set({locale});await savePrefs({...get(),locale,theme:get().theme,biometric:get().biometric});},
  setTheme:async theme=>{set({theme});await savePrefs({...get(),locale:get().locale,theme,biometric:get().biometric});},
  setSite:async site=>set({site}),
  setBiometric:async biometric=>{set({biometric});await savePrefs({...get(),locale:get().locale,theme:get().theme,biometric});},
  clear:async()=>{await SecureStore.deleteItemAsync(K_ACCESS);await SecureStore.deleteItemAsync(K_REFRESH);set({accessToken:null,refreshToken:null,user:null,bootstrap:null,site:null});}
}));
