'use client';
import {useCallback,useEffect,useRef,useState} from 'react';
import type {DashboardData} from '@/lib/dashboard';
import {IDENTITY_CHANGED_EVENT} from '@/lib/identity-sync';
import {identityRefreshKey} from '@/lib/identity-presentation';
const refreshKey='planck-account-updated';
export function useCustomerData(userId?:string){
 const [state,setState]=useState<{subject?:string;data:DashboardData|null;status:'loading'|'ready'|'error';refreshing:boolean;error:string}>({data:null,status:'loading',refreshing:false,error:''});
 const active=useRef(userId),requestId=useRef(0),identitySnapshot=useRef<{userId:string;key:string}|null>(null);
 const pending=useRef(false);
 const cancelRequests=useCallback(()=>{requestId.current++;pending.current=false},[]);
 const load=useCallback(async(background=false)=>{
  if(background&&pending.current)return;
  if(!userId||active.current!==userId)return;const sequence=++requestId.current;
  pending.current=true;
  // Refreshes update the current account in place; only its first load needs a skeleton.
  setState(s=>{const data=s.subject===userId?s.data:null;return {subject:userId,data,status:data?'ready':'loading',refreshing:true,error:background&&data?s.error:''}});
  try{const r=await fetch('/api/dashboard',{cache:'no-store'});
   if(r.status===401&&active.current===userId&&requestId.current===sequence)window.dispatchEvent(new Event('planck:session-refresh'));
   const d=await r.json() as DashboardData & {error?:string};
   if(!r.ok)throw new Error(d.error||'دریافت اطلاعات انجام نشد.');
   if(active.current===userId&&requestId.current===sequence){const previous=identitySnapshot.current;identitySnapshot.current={userId,key:identityRefreshKey(d.account)};setState({subject:userId,data:d,status:'ready',refreshing:false,error:''});if(previous?.userId===userId&&previous.key!==identitySnapshot.current.key)window.dispatchEvent(new CustomEvent(IDENTITY_CHANGED_EVENT,{detail:{userId}}));}
  }catch(e){if(active.current===userId&&requestId.current===sequence)setState(s=>{const data=s.subject===userId?s.data:null;return {subject:userId,data,status:data?'ready':'error',refreshing:false,error:background&&data?s.error:e instanceof Error?e.message:'دریافت اطلاعات انجام نشد.'}});}
  finally{if(requestId.current===sequence)pending.current=false}
 },[userId]);
 const reload=useCallback(()=>load(),[load]);
 useEffect(()=>{
  active.current=userId;
  identitySnapshot.current=null;
  let disposed=false;
  queueMicrotask(()=>{if(disposed)return;if(userId)void reload();else setState({data:null,status:'loading',refreshing:false,error:''})});
  if(!userId)return()=>{disposed=true;active.current=undefined;cancelRequests()};
  const refresh=()=>{if(document.visibilityState==='visible')void load(true)};
  const onStorage=(event:StorageEvent)=>{if(event.key===refreshKey)refresh()};
  const timer=window.setInterval(refresh,20_000);
  window.addEventListener('focus',refresh);window.addEventListener('storage',onStorage);document.addEventListener('visibilitychange',refresh);
  return()=>{disposed=true;active.current=undefined;cancelRequests();window.clearInterval(timer);window.removeEventListener('focus',refresh);window.removeEventListener('storage',onStorage);document.removeEventListener('visibilitychange',refresh)};
 },[userId,reload,load,cancelRequests]);
 const save=useCallback(async(action:string,payload:Record<string,unknown>)=>{
  if(!userId||active.current!==userId)throw new Error('ابتدا وارد حساب شوید.');
  const response=await fetch('/api/dashboard',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({action,payload})});
  if(response.status===401&&active.current===userId)window.dispatchEvent(new Event('planck:session-refresh'));
  const result=await response.json() as {error?:string};
  if(!response.ok)throw new Error(result.error||'ذخیره اطلاعات انجام نشد.');
  if(active.current===userId){
   // Only a timestamp crosses tabs; account and message content stay in memory.
   try{localStorage.setItem(refreshKey,String(Date.now()))}catch{}
   await reload();
  }
 },[userId,reload]);
 return {data:userId&&state.subject===userId?state.data:null,status:state.subject===userId?state.status:'loading' as const,refreshing:!!userId&&(state.subject!==userId||state.refreshing),error:state.subject===userId?state.error:'',reload,save};
}
