
(function(){
'use strict';
const TYPE='نقشه مغزی', FROM_BM='mahour_from_brainmap';
const q=(s,r=document)=>r.querySelector(s);
const isBM=a=>a&&(a.brainMap===true||a.visitType==='brain-map'||a.type===TYPE||a.serviceType===TYPE);
function ready(){return typeof db!=='undefined'&&db&&Array.isArray(db.patients)&&Array.isArray(db.appointments)}
function iso(v){try{return jalaliToIso(v)}catch(e){return ''}}
function fmtMoney(v){try{return fa(Number(v)||0)}catch(e){return String(Number(v)||0)}}

function addNav(){
 if(q('#brainMapNav'))return;
 const nav=q('.nav');if(!nav)return;
 const b=document.createElement('button');b.id='brainMapNav';b.type='button';
 b.innerHTML='<span class="bm-icon">🧠</span><span>نقشه مغزی</span>';
 b.onclick=showBrainMap;nav.appendChild(b);
}
function addPage(){
 if(q('#page-brainmap'))return;
 const main=q('main.main')||q('main');if(!main)return;
 const s=document.createElement('section');s.id='page-brainmap';s.className='page hidden staff-only';
 s.innerHTML=`<div class="page-head"><div><h2>نقشه مغزی</h2><p>نوبت‌دهی مستقل از ویزیت اولیه و کابین‌های درمان</p></div>
 <button type="button" class="btn primary" id="bmNewPatient">+ پذیرش بیمار جدید</button></div>
 <div class="form-panel"><div class="form-grid">
 <label class="field"><span>جستجوی بیمار موجود</span><input id="bmSearch" placeholder="نام، تلفن یا کد ملی"></label>
 <label class="field"><span>بیمار</span><select id="bmPatient"></select></label>
 <label class="field"><span>تاریخ</span><input id="bmDate" class="date-input" type="text" placeholder="برای انتخاب تاریخ کلیک کنید" readonly></label>
 <label class="field"><span>ساعت</span><select id="bmTime"></select></label>
 <label class="field"><span>مبلغ جلسه (تومان)</span><input id="bmFee" type="number" min="0" step="1000"></label>
 </div><div id="bmCapacity" class="notice">تاریخ را انتخاب کنید.</div>
 <div class="actions"><button type="button" class="btn primary" id="bmSaveExisting">ثبت نوبت نقشه مغزی</button></div></div>
 <div class="panel"><h3>نوبت‌های نقشه مغزی</h3><div id="bmList"></div></div>`;
 main.appendChild(s);
 q('#bmNewPatient').onclick=openAdmissionFromBrain;
 q('#bmSearch').oninput=fillPatients;q('#bmDate').oninput=refreshSlots;q('#bmSaveExisting').onclick=saveExisting;
 fillTimes();fillPatients();renderList();
}
function showBrainMap(){
 addPage();document.querySelectorAll('.page').forEach(x=>x.classList.add('hidden'));q('#page-brainmap').classList.remove('hidden');
 document.querySelectorAll('.nav button').forEach(x=>x.classList.remove('active'));q('#brainMapNav')?.classList.add('active');
 fillPatients();refreshSlots();renderList();
}
function fillPatients(){
 if(!q('#bmPatient')||!ready())return;const x=(q('#bmSearch').value||'').trim();
 const arr=db.patients.filter(p=>!p.archived&&(!x||(String(p.name||'')+String(p.phone||'')+String(p.fileNo||'')).includes(x)));
 q('#bmPatient').innerHTML=arr.map(p=>`<option value="${p.id}">${p.name} — ${p.phone||''} — ${p.fileNo||''}</option>`).join('');
}
function fillTimes(){
 const e=q('#bmTime');if(!e)return;e.innerHTML='';
 for(let h=0;h<24;h++){let t=String(h).padStart(2,'0')+':00',o=document.createElement('option');o.value=t;o.textContent=t;e.appendChild(o)}
}
function refreshSlots(){
 const e=q('#bmTime');if(!e||!ready())return;const d=iso(q('#bmDate').value);
 [...e.options].forEach(o=>{const busy=d&&db.appointments.some(a=>isBM(a)&&a.date===d&&a.time===o.value&&a.status!=='لغو شده');o.disabled=!!busy;o.textContent=o.value+(busy?' — رزرو شده':' — خالی')});
 const first=[...e.options].find(o=>!o.disabled);if(first)e.value=first.value;
 const n=[...e.options].filter(o=>!o.disabled).length;q('#bmCapacity').textContent=d?`${fmtMoney(n)} ساعت یک‌ساعته خالی`:'تاریخ را انتخاب کنید.';
}
function addBM(pid,date,time,fee){
 if(db.appointments.some(a=>isBM(a)&&a.date===date&&a.time===time&&a.status!=='لغو شده'))return false;
 db.appointments.push({id:db.nextAppointment++,patientId:pid,date,time,session:0,visitType:'brain-map',type:TYPE,serviceType:TYPE,brainMap:true,status:'رزرو شده',attendance:'pending',payment:0,estimatedFee:fee,notes:TYPE});return true;
}
function saveExisting(){
 const pid=Number(q('#bmPatient').value),date=iso(q('#bmDate').value),time=q('#bmTime').value,fee=Math.max(0,Number(q('#bmFee').value)||0);
 if(!pid||!date||!time)return toast('بیمار، تاریخ و ساعت را کامل کنید.');
 if(!addBM(pid,date,time,fee))return toast('این ساعت نقشه مغزی قبلاً رزرو شده است.');
 save();renderAll();refreshSlots();renderList();toast('نوبت نقشه مغزی ثبت شد.');
}
function openAdmissionFromBrain(){
 sessionStorage.setItem(FROM_BM,'1');
 showPage('admit');
 setTimeout(prepareAdmissionChoice,0);
}
function prepareAdmissionChoice(){
 if(sessionStorage.getItem(FROM_BM)!=='1')return;
 const form=q('#admitForm');if(!form)return;
 /* Do not turn admission into Brain Map. Keep the same form; only add a second final action. */
 const spans=[...form.querySelectorAll('.field span')];
 spans.forEach(s=>{if(s.textContent.includes('ساعت ویزیت اولیه'))s.textContent='ساعت نوبت *';if(s.textContent.includes('تاریخ ویزیت اولیه'))s.textContent='تاریخ نوبت *'});
 const notice=form.querySelector('.notice');if(notice)notice.textContent='نوع ثبت را در پایین انتخاب کنید: ویزیت اولیه یا نقشه مغزی. این دو مسیر کاملاً مستقل هستند.';
 const actions=form.querySelector('.actions');if(!actions)return;
 let brain=q('#bmAdmissionSubmit');
 if(!brain){brain=document.createElement('button');brain.id='bmAdmissionSubmit';brain.type='button';brain.className='btn secondary';brain.textContent='ثبت بیمار و نقشه مغزی';brain.onclick=saveNewBrainPatient;actions.appendChild(brain)}
 const normal=actions.querySelector('button[type="submit"]');if(normal)normal.textContent='ثبت بیمار و ویزیت اولیه';
}
function saveNewBrainPatient(){
 const name=q('#pName').value.trim(),phone=q('#pPhone').value.trim(),time=q('#pTime').value;
 const nationalId=latinDigits(q('#pFile').value).replace(/\D/g,''),date=iso(q('#pStart').value);
 if(!name||!phone||!time)return toast('اطلاعات الزامی را کامل کنید.');
 if(nationalId.length!==10)return toast('کد ملی بیمار الزامی است و باید ۱۰ رقم باشد.');
 if(!date)return toast('لطفاً تاریخ نوبت را از جدول انتخاب کنید.');
 if(db.appointments.some(a=>isBM(a)&&a.date===date&&a.time===time&&a.status!=='لغو شده'))return toast('این ساعت نقشه مغزی قبلاً رزرو شده است.');
 const p={id:db.nextPatient++,name,phone,emergencyPhone:q('#pEmergencyPhone').value.trim(),fileNo:nationalId,treatment:q('#pTreatment').value.trim(),sessions:0};
 db.patients.push(p);addBM(p.id,date,time,0);save();q('#admitForm').reset();sessionStorage.removeItem(FROM_BM);toast(`بیمار ${name} و نوبت نقشه مغزی ثبت شد.`);showBrainMap();
}
function renderList(){
 const b=q('#bmList');if(!b||!ready())return;const a=db.appointments.filter(isBM).slice().sort((x,y)=>(y.date+y.time).localeCompare(x.date+x.time));
 b.innerHTML=a.length?`<table><thead><tr><th>بیمار</th><th>تاریخ</th><th>ساعت</th><th>مبلغ</th><th>وضعیت</th></tr></thead><tbody>${a.map(x=>{const p=db.patients.find(p=>Number(p.id)===Number(x.patientId));return `<tr><td>${p?p.name:'—'}</td><td>${x.date}</td><td>${x.time}</td><td>${fmtMoney(x.estimatedFee||0)} تومان</td><td>${x.status||'رزرو شده'}</td></tr>`}).join('')}</tbody></table>`:'<div class="muted">نوبتی ثبت نشده است.</div>';
}
function boot(){if(!ready()){setTimeout(boot,100);return}addNav();addPage()}
if(document.readyState==='loading')document.addEventListener('DOMContentLoaded',boot);else boot();
})();
