function workMetrics(work,moneyCents=0,distanceMeters=0,now=Date.now()){
  if(!work)return {workedMs:0,pausedMs:0,incomeCents:moneyCents,distanceMeters,averagePerHour:0,averagePerKm:distanceMeters?moneyCents/100/(distanceMeters/1000):0,status:'Pronto para iniciar'};
  const end=work.endedAt??now;
  const pausedMs=work.pauses.reduce((sum,p)=>sum+Math.max(0,Math.min(p.end??end,end)-Math.max(p.start,work.startedAt)),0);
  const workedMs=Math.max(0,end-work.startedAt-pausedMs);
  const incomeCents=work.endedAt!==null?work.finalIncomeCents:moneyCents,meters=work.endedAt!==null?work.finalDistanceMeters:distanceMeters;
  return {workedMs,pausedMs,incomeCents,distanceMeters:meters,averagePerHour:workedMs?incomeCents/100/(workedMs/3600000):0,averagePerKm:meters?incomeCents/100/(meters/1000):0,status:work.endedAt!==null?'Terminado':work.pauses.at(-1)?.end===null?'Em pausa':'A trabalhar'};
}

// WIDGET PEQUENO v2: reads the car widget's shared StreamElements state directly.
// No private key is needed in this widget.
const MEDIAS_API='https://lisbonbusdriver-viagens.pages.dev/api/public-stats';
let mediasData=null,mediasFetchedAt=0,mediasLoading=false,mediasTimer=null,mediasPoll=null,mediasFailed=false;
const MEDIAS_CAR_STORE='lisbonbusdriverwidgetv1';
let mediasDirect=null,mediasStoreEpoch=0;
function receiveCarState(value){
 if(!value||!Number.isSafeInteger(value.moneyCents)||value.moneyCents<0)return false;
 const meters=Number(value.distanceMeters||0);
 if(!Number.isSafeInteger(meters)||meters<0)return false;
 const w=value.workday;
 if(w&&(!Number.isSafeInteger(w.startedAt)||!Array.isArray(w.pauses)))return false;
 mediasDirect={moneyCents:value.moneyCents,distanceMeters:meters,workday:w||null};
 mediasStoreEpoch++;mediasFailed=false;renderMedias();return true;
}
async function readCarStore(){
 if(!window.SE_API?.store?.get)return false;
 const epoch=mediasStoreEpoch;
 try{const saved=await window.SE_API.store.get(MEDIAS_CAR_STORE);if(epoch!==mediasStoreEpoch)return !!mediasDirect;return receiveCarState(saved)}catch{return false}
}
const mediasSet=(id,value)=>{const el=document.getElementById(id);if(el)el.textContent=value};
const mediasNumber=(n,d=2)=>Number(n).toLocaleString('pt-PT',{minimumFractionDigits:d,maximumFractionDigits:d});
function renderMedias(){
 if(!mediasData&&!mediasDirect)return;
 const d=mediasDirect?{...workMetrics(mediasDirect.workday,mediasDirect.moneyCents,mediasDirect.distanceMeters),source:'twitch'}:mediasData;
 let ms=Math.max(0,Number(d.workedMs)||Number(d.totalMinutes||0)*60000);
 if(!mediasDirect&&d.source==='twitch'&&d.status==='A trabalhar')ms+=Math.max(0,Date.now()-mediasFetchedAt);
 const income=Number(d.incomeCents)/100,km=Number(d.distanceMeters)/1000;
 const hour=d.source==='twitch'?(ms?income/(ms/3600000):0):Number(d.averagePerHour||0);
 mediasSet('income',mediasNumber(income)+' €');
 mediasSet('distance',mediasNumber(km,1)+' km');
 mediasSet('average',km?mediasNumber(income/km)+' €/km':'— €/km');
 mediasSet('hourly-average',d.source==='twitch'?(ms?mediasNumber(hour)+' €/h':'— €/h'):mediasNumber(hour)+' €/h');
 const minutes=Math.floor(ms/60000),hours=`${Math.floor(minutes/60)} h ${String(minutes%60).padStart(2,'0')} min`;
 mediasSet('widget-status',mediasDirect?`Ligado ao widget do carro · ${d.status} · ${hours}`:mediasFailed?'Sem ligação · últimos valores recebidos':d.source==='twitch'?`${d.status} · ${hours}`:'ATUALIZAÇÃO AUTOMÁTICA');
}
async function refreshMedias(){
 if(mediasLoading)return;
 mediasLoading=true;
 if(await readCarStore()){mediasLoading=false;return}
 const controller=new AbortController(),timeout=setTimeout(()=>controller.abort(),10000);
 try{
  const response=await fetch(MEDIAS_API+'?v='+Date.now(),{cache:'no-store',signal:controller.signal});
  if(!response.ok)throw Error('HTTP '+response.status);
  const data=await response.json();
  if(!Number.isSafeInteger(data.incomeCents)||data.incomeCents<0||!Number.isSafeInteger(data.distanceMeters)||data.distanceMeters<0)throw Error('Totais inválidos');
  mediasData=data;mediasFetchedAt=Date.now();mediasFailed=false;renderMedias();
 }catch{
  mediasFailed=true;if(mediasData)renderMedias();else mediasSet('widget-status','Sem dados online · verifica a ligação');
 }finally{clearTimeout(timeout);mediasLoading=false}
}
window.addEventListener('onWidgetLoad',()=>{
 if(mediasPoll)clearInterval(mediasPoll);if(mediasTimer)clearInterval(mediasTimer);
 // Keep this compact card visible; !f still lets the broadcaster hide/show it.
 document.getElementById('trip-widget')?.classList.add('is-visible');
 void refreshMedias();mediasPoll=setInterval(refreshMedias,5000);mediasTimer=setInterval(renderMedias,1000);
});
window.addEventListener('onEventReceived',event=>{
 const detail=event.detail||{};
 if(detail.listener==='kvstore:update'){
  const data=detail.event?.data||detail.event||{};
  if(data.key===MEDIAS_CAR_STORE||data.key==='customWidget.'+MEDIAS_CAR_STORE)receiveCarState(data.value);
  return;
 }
 if(detail.listener!=='message')return;
 const data=detail.event?.data||detail.event||{},text=String(data.text||'').trim();
 if(!/^!f\s*$/i.test(text))return;
 const tags=data.tags||{},badges=(Array.isArray(data.badges)?data.badges:[]).map(b=>String(b?.type||b)).join(',')+','+String(tags.badges||'');
 if(String(tags.mod)!=='1'&&!/(^|[,/])(moderator|broadcaster)([,/]|$)/i.test(badges))return;
 document.getElementById('trip-widget')?.classList.toggle('is-visible');
});
