// Explicit management actions. Financial changes wait for the server; partner requests wait for owner approval.
const correctionT=x=>window.__t?window.__t(x):x;
function CorrectionIntentModal({action,payload,onClose}){
 const pending=Hydor.pendingManagementCorrection?.(action);
 const [reason,setReason]=React.useState(pending?.payload?.reason||''),[busy,setBusy]=React.useState(false),[error,setError]=React.useState('');
 const saving=React.useRef(false),push=useToast();
 const save=async()=>{
  if(saving.current)return;saving.current=true;setBusy(true);setError('');
  try{
   const r=await Hydor.write(()=>Hydor.submitManagementCorrection(action,pending?.payload||{...payload,reason}));
   if(r.ok){push(correctionT(r.result?.status==='pending'?'Sent to owner for approval. No figures changed yet.':'Correction recorded.'));onClose();}
   else setError(r.message||'Not saved');
  }catch(e){setError(e.message||'Not saved');}finally{saving.current=false;setBusy(false);}
 };
 return <Modal title={correctionT(action==='releaseVisit'?'Release employee from this visit':'Review correction')} onClose={onClose} foot={<><Btn variant="ghost" onClick={onClose}>{correctionT('Cancel')}</Btn><Btn onClick={save} disabled={busy||reason.trim().length<3} data-testid="management-correction-save">{correctionT(busy?'Saving…':'Confirm')}</Btn></>}>
  <p>{correctionT(action==='releaseVisit'?'Administrative closure preserves the recorded times and locations. It does not invent an arrival or grant visit credit.':'Changes are audited. A founder partner request changes no figures until the owner approves it.')}</p>
  {pending&&<p role="status">{correctionT('Retry the original pending action')} · {pending.payload.targetId||pending.payload.requestId} · {pending.payload.reason}</p>}
  {(pending?.payload||payload).patch?.deleted!==undefined && <p>{correctionT((pending?.payload||payload).patch.deleted?'Void transaction':'Restore')}</p>}
  <Field label={correctionT('Reason (required)')}><textarea className="inp" disabled={!!pending} value={reason} maxLength={500} onChange={e=>setReason(e.target.value)} data-testid="management-correction-reason" /></Field>
  {error&&<p role="alert" style={{color:'var(--neg)'}}>{correctionT(error)}</p>}
 </Modal>;
}
function ManagementCorrectionQueue(){
 const s=useHydor(),role=useRole(),[selected,setSelected]=React.useState(null);
 if(!['owner','cofounder'].includes(role))return null;
 const requests=(s.managementCorrections||[]).filter(r=>r.status==='pending');
 const tickets=['transaction','contract','releaseVisit','approve','reject'].map(a=>Hydor.pendingManagementCorrection?.(a)).filter(Boolean);
 if(!requests.length&&!tickets.length)return null;
 const display=(key,value)=>{
  if(key==='employeeId')return s.users.find(u=>u.id===value)?.name||value||'—';
  if(key==='partyId')return s.parties.find(p=>p.id===value)?.name||value||'—';
  return typeof value==='object'?JSON.stringify(value):String(value??'—');
 };
 return <section className="card" style={{padding:16,marginBottom:16}} data-testid="management-correction-queue">
  <h3>{correctionT('Corrections awaiting owner approval')}</h3>
  {tickets.map(t=><div key={t.opId} style={{padding:'12px 0'}}><p>{correctionT('Retry the original pending action')} · {t.payload.targetId||t.payload.requestId} · {t.payload.reason}</p><Btn onClick={()=>setSelected({action:t.action,payload:t.payload})}>{correctionT('Retry the original pending action')}</Btn></div>)}
  {requests.map(r=><article key={r.id} style={{borderTop:'1px solid var(--border)',padding:'12px 0',overflowWrap:'anywhere'}}>
   <strong>{r.requestedByName} · {r.payload.targetId}</strong><p>{r.payload.reason}</p>
   <p>{correctionT(r.action==='contract'?'Correct maintenance contract':'Transaction')} · {correctionT(({voidContract:'Void contract',editDetails:'Edit employee, value or notes',reverseVisit:'Reverse a recorded visit',extend:'Extend expiry',addVisit:'Add a visit',historicalVisit:'Record a past visit',setStart:'Set start date',resolveReview:'Resolve review'})[r.payload.correction]||'')}</p>
   {Object.entries(r.payload.patch||{}).map(([k,v])=><div key={k}><strong>{correctionT(k)}</strong>: {display(k,r.before?.[k])} → {display(k,v)}</div>)}
   {r.payload.date&&<p>{r.payload.date}</p>}
   {role==='owner'&&<div style={{display:'flex',gap:8,marginTop:12}}><Btn onClick={()=>setSelected({action:'approve',payload:{requestId:r.id}})}>{correctionT('Approve')}</Btn><Btn variant="ghost" onClick={()=>setSelected({action:'reject',payload:{requestId:r.id}})}>{correctionT('Reject')}</Btn></div>}
  </article>)}
  {selected&&<CorrectionIntentModal {...selected} onClose={()=>setSelected(null)}/>}
 </section>;
}
function VisitRecoveryPanel(){
 const s=useHydor(),role=useRole(),[selected,setSelected]=React.useState(null);
 if(role!=='owner')return null;
 const rows=(s.appointments||[]).filter(a=>a&&!a.deleted&&!a.ownerReleasedAt&&a.status==='assigned'&&a.assignedTo&&
  (Hydor.appointmentIsCurrentWork(a)||a.visitStartedAt||a.visitEndedAt));
 if(!rows.length)return null;
 return <details className="card" style={{padding:14,marginBottom:16}} data-testid="visit-recovery-panel"><summary>{correctionT('Held visits — owner recovery')} ({rows.length})</summary>
  {rows.map(a=><div key={a.id} style={{padding:'12px 0',borderBottom:'1px solid var(--border)',display:'flex',gap:12,alignItems:'center',flexWrap:'wrap'}}>
   <span>{s.users.find(u=>u.id===a.assignedTo)?.name} · {s.parties.find(p=>p.id===a.partyId)?.name||a.bookingCustomerName||a.id} · {a.desiredAt}</span>
   <Btn sm onClick={()=>setSelected(a)}>{correctionT('Release employee from this visit')}</Btn>
  </div>)}
  {selected&&<CorrectionIntentModal action="releaseVisit" payload={{targetId:selected.id}} onClose={()=>setSelected(null)}/>}
 </details>;
}
Object.assign(window,{CorrectionIntentModal,ManagementCorrectionQueue,VisitRecoveryPanel});
