"use client";
import { useEffect,useMemo,useState } from "react";
import { Car,Users,KeyRound,Wrench,ShieldCheck,LayoutDashboard,Plus,Search,Eye,Pencil,Trash2,RotateCcw,CheckCircle2,Clock3,Menu,X,Loader2,GalleryVerticalEnd,Ticket,MessageSquareText,Bell,ChevronLeft,ChevronRight,LogOut,UserCog,ClipboardPlus } from "lucide-react";
import { Button } from "@/components/ui/button";
import { Input } from "@/components/ui/input";
import { Textarea } from "@/components/ui/textarea";
import { Dialog,DialogContent,DialogDescription,DialogFooter,DialogHeader,DialogTitle } from "@/components/ui/dialog";
import { Table,TableBody,TableCell,TableHead,TableHeader,TableRow } from "@/components/ui/table";
import {InspectionPage} from "@/components/inspection-page";

type AnyRow=Record<string,any>;
const nav=[['dashboard','داشبورد',LayoutDashboard],['vehicleTypes','مدل‌های خودرو',GalleryVerticalEnd],['vehicles','خودروها',Car],['drivers','رانندگان',Users],['assignments','تخصیص‌ها',KeyRound],['inspections','بازرسی دوره‌ای',ClipboardPlus],['maintenance','سرویس‌ها',Wrench],['tickets','تیکت‌ها',Ticket],['approvals','تأییدیه‌ها',ShieldCheck],['sms','گزارش پیامک‌ها',MessageSquareText],['users','کاربران و دسترسی',UserCog]] as const;
const statusFa:Record<string,string>={ready:'آماده تخصیص',assigned:'تخصیص‌یافته',inspection_hold:'متوقف بابت نقص بازرسی',pending:'منتظر تأیید',active:'فعال',pending_return:'منتظر تأیید عودت',returned:'عودت شده',scheduled:'برنامه‌ریزی شده',pending_approval:'منتظر تأیید سرویس',completed:'انجام شده',approved:'تأیید شده',rejected:'رد شده',inactive:'غیرفعال',open:'باز',in_progress:'در حال پیگیری',waiting:'منتظر پاسخ',closed:'بسته',unconfigured:'تنظیم‌نشده',sent:'ارسال‌شده',failed:'ناموفق'};
const fields:Record<string,{name:string,label:string,type?:string,required?:boolean}[]>={
 vehicle:[{name:'plate',label:'پلاک',required:true},{name:'vin',label:'شماره شاسی'},{name:'year',label:'سال ساخت',type:'number'},{name:'color',label:'رنگ'},{name:'mileage',label:'کارکرد فعلی (کیلومتر)',type:'number'},{name:'notes',label:'یادداشت'}],
 type:[{name:'brand',label:'برند',required:true},{name:'name',label:'مدل خودرو',required:true},{name:'category',label:'دسته‌بندی'},{name:'imageUrl',label:'آدرس تصویر',required:true}],
 driver:[{name:'fullName',label:'نام و نام خانوادگی',required:true},{name:'nationalId',label:'کد ملی',required:true},{name:'phone',label:'شماره همراه',required:true},{name:'licenseNo',label:'شماره گواهینامه',required:true},{name:'licenseExpiry',label:'تاریخ اعتبار گواهینامه',type:'date'},{name:'notes',label:'یادداشت'}]
};

export default function Home(){
 const [data,setData]=useState<any>({vehicleTypes:[],vehicles:[],drivers:[],assignments:[],vehicleRequests:[],maintenance:[],approvals:[],inspections:[],tickets:[],ticketMessages:[],smsLogs:[]}),[profile,setProfile]=useState<any>(null),[view,setView]=useState('dashboard'),[loading,setLoading]=useState(true),[busy,setBusy]=useState(false),[query,setQuery]=useState(''),[menu,setMenu]=useState(false),[collapsed,setCollapsed]=useState(false),[modal,setModal]=useState<any>(null),[form,setForm]=useState<AnyRow>({}),[error,setError]=useState('');
 async function load(){setLoading(true);try{const r=await fetch('/api/fleet',{cache:'no-store'});const j=await r.json();if(!r.ok)throw Error(j.error);setData(j)}catch(e:any){setError(e.message)}finally{setLoading(false)}}
 useEffect(()=>{fetch('/api/auth',{cache:'no-store'}).then(async r=>{if(!r.ok){location.replace('/login');return}const j=await r.json();setProfile(j.profile);await load()}).catch(()=>location.replace('/login'))},[]);
 const visibleNav=profile?.role==='driver'?nav.filter(([id])=>['dashboard','vehicles','inspections','maintenance','tickets'].includes(id)):profile?.role==='supervisor'?nav.filter(([id])=>!['users','vehicleTypes'].includes(id)):nav;
 async function logout(){await fetch('/api/auth',{method:'POST',headers:{'content-type':'application/json'},body:JSON.stringify({action:'logout'})});location.replace('/login')}
 async function act(payload:AnyRow){setBusy(true);setError('');try{const r=await fetch('/api/fleet',{method:'POST',headers:{'content-type':'application/json'},body:JSON.stringify(payload)});const j=await r.json();if(!r.ok)throw Error(j.error);setModal(null);setForm({});await load()}catch(e:any){setError(e.message)}finally{setBusy(false)}}
 const active=data.assignments.filter((x:AnyRow)=>['active','pending_return'].includes(x.status)),pending=data.approvals.filter((x:AnyRow)=>x.status==='pending');
 const counts=[['کل خودروها',data.vehicles.length,Car,'blue'],['در اختیار راننده',active.length,KeyRound,'green'],['تیکت‌های باز',data.tickets.filter((x:AnyRow)=>x.status!=='closed').length,Ticket,'amber'],['منتظر تأیید',pending.length,ShieldCheck,'violet']] as const;
 const open=(type:string,row:AnyRow={})=>{setError('');setForm(row);setModal({type,row})};
 const filter=(rows:AnyRow[])=>!query?rows:rows.filter(r=>Object.values(r).join(' ').includes(query));
 return <div className={collapsed?'app is-collapsed':'app'} dir="rtl">
  <aside className={`${menu?'side open':'side'} ${collapsed?'collapsed':''}`}><div className="brand"><span><img src="/brand/goharzamin-mark.webp" alt=""/></span><div><b>ناوگان تشریفات</b><small>گهرزمین</small></div><button className="close-side" onClick={()=>setMenu(false)}><X/></button></div><button className="collapse-btn" onClick={()=>setCollapsed(!collapsed)} title={collapsed?'باز کردن منو':'جمع کردن منو'}>{collapsed?<ChevronLeft/>:<ChevronRight/>}</button><nav>{visibleNav.map(([id,label,Icon])=><button key={id} title={label} className={view===id?'active':''} onClick={()=>{setView(id);setMenu(false)}}><Icon/><span>{label}</span>{id==='approvals'&&pending.length>0?<i>{pending.length}</i>:id==='tickets'&&data.tickets.filter((t:AnyRow)=>t.status!=='closed').length?<i>{data.tickets.filter((t:AnyRow)=>t.status!=='closed').length}</i>:null}</button>)}</nav><div className="side-note"><ShieldCheck/><div><b>{profile?.full_name||'کاربر سازمانی'}</b><small>{profile?.role==='general_manager'?'مدیر کل':profile?.role==='supervisor'?'سوپروایزر':'راننده'}</small></div></div></aside>
  <main><header><div className="header-title"><button className="menu" onClick={()=>setMenu(true)}><Menu/></button><div><small>مدیریت ناوگان تشریفات گهرزمین</small><h1>{nav.find(n=>n[0]===view)?.[1]}</h1></div></div><div className="top-actions"><span className="today">۱۵ شهریور ۱۴۰۵</span><label className="search"><Search/><Input value={query} onChange={e=>setQuery(e.target.value)} placeholder="جست‌وجو..."/></label><button className="bell"><Bell/><i></i></button><button className="logout-button" onClick={logout} title="خروج"><LogOut/></button><div className="user-avatar">{profile?.full_name?.slice(0,2)||'گ‌ز'}<span></span></div></div></header>
  {error&&!modal?<div className="error">{error}<button onClick={()=>setError('')}>×</button></div>:null}
  {loading?<div className="loading"><Loader2 className="spin"/>در حال دریافت اطلاعات...</div>:view==='dashboard'?profile?.role==='driver'?<DriverDashboard data={data} onVehicles={()=>setView('vehicles')} onTicket={()=>open('ticket')}/>:<>
   <section className="metrics">{counts.map(([label,value,Icon,color])=><article key={label}><span className={color}><Icon/></span><div><small>{label}</small><strong>{value.toLocaleString('fa-IR')}</strong></div></article>)}</section>
   <section className="split"><Panel title="وضعیت فعلی ناوگان" action={<Button size="sm" onClick={()=>setView('vehicles')}>مشاهده همه</Button>}><VehicleTable rows={filter(data.vehicles).slice(0,5)} active={active} onOpen={r=>open('vehicle.detail',r)}/></Panel><Panel title="نیازمند تأیید"><div className="approval-stack">{pending.slice(0,4).map((p:AnyRow)=><button className="approval" key={p.id} onClick={()=>open('approval',p)}><ShieldCheck/><div><b>{p.title}</b><small>{p.requestedBy}</small></div><span>بررسی</span></button>)}{!pending.length?<Empty text="درخواست معلقی وجود ندارد"/>:null}</div></Panel></section>
   <section className="split"><Panel title="آخرین تخصیص‌ها"><AssignmentTable rows={data.assignments.slice(0,5)} onReturn={r=>open('return',r)}/></Panel><Panel title="تیکت‌های مهم"><TicketCards rows={data.tickets.filter((t:AnyRow)=>t.status!=='closed').slice(0,4)} onOpen={r=>open('ticket.detail',r)}/></Panel></section>
  </>:view==='vehicleTypes'?<Page title="مدل‌های خودرو" desc="فهرست مدل‌هایی که مدیر از قبل همراه تصویر تعریف کرده است" button="تعریف مدل جدید" onAdd={()=>open('type')}><TypeGrid rows={filter(data.vehicleTypes)} onEdit={r=>open('type',r)} onDelete={r=>open('delete.type',r)}/></Page>
  :view==='vehicles'?profile?.role==='driver'?<Page title="خودروها" desc="خودروی فعلی و خودروهای آزاد ناوگان را ببینید و پلاک موردنظر را درخواست کنید" button="درخواست خودرو" onAdd={()=>open('vehicle.request')}><DriverVehicleView vehicles={filter(data.vehicles)} requests={data.vehicleRequests||[]} onRequest={()=>open('vehicle.request')}/></Page>:<Page title="مدیریت خودروها" desc="تعریف خودرو از مدل‌های آماده، ویرایش مشخصات و مشاهده پرونده کامل" button="تعریف خودرو" onAdd={()=>open('vehicle')}><VehicleTable rows={filter(data.vehicles)} active={active} onOpen={r=>open('vehicle.detail',r)} onEdit={r=>open('vehicle',r)} onDelete={r=>open('delete.vehicle',r)}/></Page>
  :view==='drivers'?<Page title="مدیریت رانندگان" desc="اطلاعات هویتی، گواهینامه و تخصیص‌های فعال" button="افزودن راننده" onAdd={()=>open('driver')}><DriverTable rows={filter(data.drivers)} active={active} onOpen={r=>open('driver.detail',r)} onEdit={r=>open('driver',r)} onDelete={r=>open('delete.driver',r)}/></Page>
  :view==='assignments'?<Page title="تاریخچه تخصیص‌ها" desc="گزارش ماه‌به‌ماه تحویل و عودت خودروها با زمان و کارکرد دقیق" button="تخصیص جدید" onAdd={()=>open('assignment')}><AssignmentHistory rows={filter(data.assignments)} onReturn={r=>open('return',r)}/></Page>
  :view==='inspections'?<InspectionPage data={data} role={profile?.role} onRefresh={load}/>
  :view==='maintenance'?<Page title="سرویس و نگهداری" desc="موعدها، هزینه‌ها و تأیید انجام سرویس" button="ثبت سرویس" onAdd={()=>open('maintenance')}><MaintenanceTable rows={filter(data.maintenance)} onComplete={r=>open('complete',r)}/></Page>
  :view==='tickets'?<Page title="تیکتینگ ناوگان" desc="ثبت مستند خرابی، خسارت، مغایرت، تخلف و مکاتبات عملیاتی" button="ثبت تیکت" onAdd={()=>open('ticket')}><TicketTable rows={filter(data.tickets)} onOpen={r=>open('ticket.detail',r)}/></Page>
  :view==='sms'?<Page title="گزارش پیامک‌های کاوه‌نگار" desc="ثبت نتیجه پیامک همه رویدادها و وضعیت اتصال سرویس"><SmsPanel rows={filter(data.smsLogs)} configured={data.smsConfigured}/></Page>
  :view==='users'?<UserManager drivers={data.drivers}/>
  :<Page title="کارتابل سوپروایزر" desc="تأیید یا رد درخواست‌های عودت و انجام سرویس"><ApprovalTable rows={filter(data.approvals)} onOpen={r=>open('approval',r)}/></Page>}
  {profile?.role==='driver'&&data.vehicles.find((v:AnyRow)=>v.currentAssignment?.status==='active')?<Button className="driver-return-fab" variant="outline" onClick={()=>open('return',data.vehicles.find((v:AnyRow)=>v.currentAssignment?.status==='active').currentAssignment)}><RotateCcw/>درخواست عودت خودروی فعلی</Button>:null}
  </main>
  <AppDialog modal={modal} setModal={setModal} form={form} setForm={setForm} error={error} busy={busy} data={data} active={active} act={act}/>
 </div>
}

function Panel({title,action,children}:{title:string,action?:any,children:any}){return <section className="panel"><div className="panel-head"><h2>{title}</h2>{action}</div>{children}</section>}
function Page({title,desc,button,onAdd,children}:{title:string,desc:string,button?:string,onAdd?:()=>void,children:any}){return <><div className="pagebar"><div><h2>{title}</h2><p>{desc}</p></div>{button?<Button onClick={onAdd}><Plus/>{button}</Button>:null}</div><Panel title=""><div className="table-wrap">{children}</div></Panel></>}
function Empty({text}:{text:string}){return <div className="empty"><Clock3/><p>{text}</p></div>}
function Badge({s}:{s:string}){return <span className={'badge '+s}>{statusFa[s]||s}</span>}
function Holder({a}:{a?:AnyRow}){if(!a)return <>—</>;const days=Math.max(1,Math.floor((Date.now()-new Date(a.startAt).getTime())/86400000));return <span className="holder"><b>{a.driver}</b><small>از {new Date(a.startAt).toLocaleDateString('fa-IR')} · {days.toLocaleString('fa-IR')} روز</small>{a.status==='pending_return'?<em>عودت در انتظار تأیید</em>:null}</span>}
function DriverDashboard({data,onVehicles,onTicket}:{data:any,onVehicles:()=>void,onTicket:()=>void}){const current=data.vehicles.filter((v:AnyRow)=>v.status!=='ready'),pendingRequest=(data.vehicleRequests||[]).find((r:AnyRow)=>r.status==='pending');return <div className="driver-home"><section className="driver-welcome"><div><small>پنل شخصی راننده</small><h2>{current.length?'خودروی شما آماده مأموریت است':'برای مأموریت بعدی خودرو درخواست کنید'}</h2><p>{pendingRequest?`درخواست ${pendingRequest.vehicle} با پلاک ${pendingRequest.plate} در انتظار بررسی سوپروایزر است.`:'نوع خودرو و سپس یکی از پلاک‌های آزاد را انتخاب کنید؛ مشخصات کامل پیش از ثبت نمایش داده می‌شود.'}</p><Button onClick={onVehicles}><ClipboardPlus/>{pendingRequest?'مشاهده درخواست':'درخواست خودرو'}</Button></div>{current[0]?<img src={current[0].imageUrl||'/favicon.svg'} alt={current[0].title}/>:<span><Car/></span>}</section><section className="driver-quick"><article><Wrench/><div><small>سرویس‌های مرتبط</small><strong>{data.maintenance.length.toLocaleString('fa-IR')}</strong></div></article><article><Ticket/><div><small>تیکت‌های باز من</small><strong>{data.tickets.filter((t:AnyRow)=>t.status!=='closed').length.toLocaleString('fa-IR')}</strong></div><Button size="sm" variant="outline" onClick={onTicket}>ثبت تیکت</Button></article><article><ShieldCheck/><div><small>وضعیت درخواست خودرو</small><strong>{pendingRequest?'در انتظار تأیید':data.vehicleRequests?.[0]?statusFa[data.vehicleRequests[0].status]:'بدون درخواست'}</strong></div></article></section>{current.length?<Panel title="خودروی در اختیار من"><DriverVehicleView vehicles={current} requests={[]} onRequest={onVehicles}/></Panel>:null}</div>}
function UserManager({drivers}:{drivers:AnyRow[]}){const [rows,setRows]=useState<AnyRow[]>([]),[form,setForm]=useState<AnyRow>({role:'supervisor'}),[busy,setBusy]=useState(false),[message,setMessage]=useState('');const load=()=>fetch('/api/users').then(r=>r.json()).then(j=>setRows(Array.isArray(j)?j:[]));useEffect(()=>{load()},[]);async function submit(e:any){e.preventDefault();setBusy(true);setMessage('');const r=await fetch('/api/users',{method:'POST',headers:{'content-type':'application/json'},body:JSON.stringify({action:'create',...form})});const j=await r.json();setMessage(r.ok?'حساب کاربری با موفقیت ساخته شد.':j.error);if(r.ok){setForm({role:'supervisor'});load()}setBusy(false)}async function toggle(row:AnyRow){await fetch('/api/users',{method:'POST',headers:{'content-type':'application/json'},body:JSON.stringify({action:'toggle',id:row.id,isActive:!row.is_active})});load()}return <Page title="کاربران و سطوح دسترسی" desc="ایجاد حساب سوپروایزر و راننده، اتصال حساب راننده به پرونده و کنترل وضعیت دسترسی"><div className="user-admin"><form className="user-create" onSubmit={submit}><h3>ایجاد حساب جدید</h3><div className="form-grid"><Field label="نام و نام خانوادگی" value={form.fullName} onChange={(v:any)=>setForm({...form,fullName:v})}/><Field label="نام کاربری انگلیسی" value={form.username} onChange={(v:any)=>setForm({...form,username:v})}/><Field label="رمز عبور اولیه" type="password" value={form.password} onChange={(v:any)=>setForm({...form,password:v})}/><Picker label="سطح دسترسی" value={form.role} onChange={(v:any)=>setForm({...form,role:v})} options={[{id:'supervisor',name:'سوپروایزر'},{id:'driver',name:'راننده'}]} text={(x:any)=>x.name}/>{form.role==='driver'?<><Picker optional label="پرونده قبلی راننده (اختیاری)" value={form.driverId} onChange={(v:any)=>setForm({...form,driverId:v})} options={drivers} text={(x:any)=>x.fullName}/><p className="wide user-message">اگر راننده جدید است، این فهرست را خالی بگذارید؛ پرونده اولیه خودکار ساخته می‌شود.</p></>:null}</div>{message?<p className="user-message">{message}</p>:null}<Button disabled={busy||!form.fullName||!form.username||!form.password}>{busy?<Loader2 className="spin"/>:<Plus/>}ایجاد حساب</Button></form><div className="user-list"><h3>حساب‌های فعال سامانه</h3>{rows.map(row=><article key={row.id}><span className="person-avatar">{row.full_name?.slice(0,1)}</span><div><b>{row.full_name}</b><small>@{row.username} · {row.role==='general_manager'?'مدیر کل':row.role==='supervisor'?'سوپروایزر':'راننده'}</small></div><Badge s={row.is_active?'active':'inactive'}/><Button size="sm" variant="outline" onClick={()=>toggle(row)}>{row.is_active?'تعلیق':'فعال‌سازی'}</Button></article>)}</div></div></Page>}
function Actions({open,edit,del}:{open?:()=>void,edit?:()=>void,del?:()=>void}){return <div className="actions">{open?<Button size="icon-sm" variant="outline" onClick={open} title="مشاهده پرونده"><Eye/></Button>:null}{edit?<Button size="icon-sm" variant="outline" onClick={edit} title="ویرایش"><Pencil/></Button>:null}{del?<Button size="icon-sm" variant="destructive" onClick={del} title="حذف"><Trash2/></Button>:null}</div>}
function TypeGrid({rows,onEdit,onDelete}:{rows:AnyRow[],onEdit:(r:AnyRow)=>void,onDelete:(r:AnyRow)=>void}){if(!rows.length)return <Empty text="هنوز مدلی تعریف نشده است"/>;return <div className="type-grid">{rows.map(t=><article className="type-card" key={t.id}><img src={t.imageUrl} alt={`${t.brand} ${t.name}`}/><div><small>{t.category}</small><h3>{t.brand} {t.name}</h3><p>قابل انتخاب هنگام تعریف خودرو</p>{imageSources[t.imageUrl]?<a href={imageSources[t.imageUrl]} target="_blank" rel="noreferrer">منبع تصویر</a>:null}<Actions edit={()=>onEdit(t)} del={()=>onDelete(t)}/></div></article>)}</div>}
function DriverVehicleView({vehicles,requests,onRequest}:{vehicles:AnyRow[],requests:AnyRow[],onRequest:()=>void}){const current=vehicles.filter(v=>v.status!=='ready'),free=vehicles.filter(v=>v.status==='ready');return <div className="driver-vehicles">{current.length?<div className="driver-current"><h3>خودروی در اختیار من</h3>{current.map(v=><article key={v.id}><img src={v.imageUrl||'/favicon.svg'} alt=""/><div><small>خودروی فعال</small><h3>{v.title}</h3><p>{v.plate} · {v.color} · مدل {v.year}</p></div><Badge s={v.status}/></article>)}</div>:null}<div className="request-summary"><div><ClipboardPlus/><span><b>درخواست‌های من</b><small>آخرین وضعیت درخواست‌های ارسال‌شده</small></span></div>{requests.length?requests.slice(0,3).map(r=><article key={r.id}><img src={r.imageUrl||'/favicon.svg'} alt=""/><span><b>{r.vehicle}</b><small>{r.plate} · {new Date(r.requestedAt).toLocaleString('fa-IR')}</small></span><Badge s={r.status}/></article>):<Empty text="هنوز درخواستی ثبت نکرده‌اید"/>}</div><div className="available-fleet"><div><h3>خودروهای آزاد</h3><p>{free.length.toLocaleString('fa-IR')} خودرو برای درخواست موجود است</p></div>{free.length?<div className="available-grid">{free.map(v=><article key={v.id}><img src={v.imageUrl||'/favicon.svg'} alt=""/><div><b>{v.title}</b><small>{v.plate} · {v.color}</small></div><Button size="sm" variant="outline" onClick={onRequest}>درخواست</Button></article>)}</div>:<Empty text="در حال حاضر خودروی آزادی موجود نیست"/>}</div></div>}
function VehicleTable({rows,active,onOpen,onEdit,onDelete}:{rows:AnyRow[],active:AnyRow[],onOpen:(r:AnyRow)=>void,onEdit?:(r:AnyRow)=>void,onDelete?:(r:AnyRow)=>void}){if(!rows.length)return <Empty text="هنوز خودرویی تعریف نشده است"/>;return <><div className="desktop-table"><Table><TableHeader><TableRow><TableHead>خودرو</TableHead><TableHead>پلاک</TableHead><TableHead>تحویل‌گیرنده فعلی</TableHead><TableHead>آخرین بازرسی</TableHead><TableHead>وضعیت</TableHead><TableHead/></TableRow></TableHeader><TableBody>{rows.map(v=>{const a=v.currentAssignment||active.find(x=>x.vehicleId===v.id);return <TableRow key={v.id}><TableCell><div className="vehicle-cell"><img src={v.imageUrl||'/favicon.svg'} alt=""/><div><b>{v.title}</b><small>{v.brand} {v.typeName}</small></div></div></TableCell><TableCell>{v.plate}<small>{Number(v.mileage).toLocaleString('fa-IR')} km</small></TableCell><TableCell><Holder a={a}/></TableCell><TableCell>{v.lastInspection?<span className="holder"><b>{new Date(v.lastInspection.inspectedAt).toLocaleDateString('fa-IR')}</b><small>موعد بعد: {new Date(v.lastInspection.nextDueAt).toLocaleDateString('fa-IR')}</small></span>:'ثبت نشده'}</TableCell><TableCell><Badge s={v.status}/></TableCell><TableCell><Actions open={()=>onOpen(v)} edit={onEdit?()=>onEdit(v):undefined} del={onDelete?()=>onDelete(v):undefined}/></TableCell></TableRow>})}</TableBody></Table></div><div className="mobile-records">{rows.map((v,i)=>{const a=v.currentAssignment||active.find(x=>x.vehicleId===v.id);return <article className="mobile-record vehicle-record" key={v.id} style={{'--delay':`${i*45}ms`} as any}><div className="mobile-record-head"><img src={v.imageUrl||'/favicon.svg'} alt=""/><div><b>{v.title}</b><small>{v.brand} {v.typeName} · {v.plate}</small></div><Badge s={v.status}/></div><div className="mobile-record-grid"><span><small>تحویل‌گیرنده فعلی</small><Holder a={a}/></span><span><small>کارکرد</small><b>{Number(v.mileage).toLocaleString('fa-IR')} کیلومتر</b></span></div><Actions open={()=>onOpen(v)} edit={onEdit?()=>onEdit(v):undefined} del={onDelete?()=>onDelete(v):undefined}/></article>})}</div></>}
function DriverTable({rows,active,onOpen,onEdit,onDelete}:{rows:AnyRow[],active:AnyRow[],onOpen:(r:AnyRow)=>void,onEdit:(r:AnyRow)=>void,onDelete:(r:AnyRow)=>void}){if(!rows.length)return <Empty text="هنوز راننده‌ای ثبت نشده است"/>;return <><div className="desktop-table"><Table><TableHeader><TableRow><TableHead>راننده</TableHead><TableHead>شماره تماس</TableHead><TableHead>گواهینامه</TableHead><TableHead>خودروی فعلی</TableHead><TableHead>وضعیت</TableHead><TableHead/></TableRow></TableHeader><TableBody>{rows.map(d=>{const a=active.find(x=>x.driverId===d.id);return <TableRow key={d.id}><TableCell><b>{d.fullName}</b><small>{d.nationalId}</small></TableCell><TableCell>{d.phone}</TableCell><TableCell>{d.licenseNo}<small>اعتبار: {d.licenseExpiry||'ثبت نشده'}</small></TableCell><TableCell>{a?.vehicle||'—'}</TableCell><TableCell><Badge s={d.status}/></TableCell><TableCell><Actions open={()=>onOpen(d)} edit={()=>onEdit(d)} del={()=>onDelete(d)}/></TableCell></TableRow>})}</TableBody></Table></div><div className="mobile-records">{rows.map((d,i)=>{const a=active.find(x=>x.driverId===d.id);return <article className="mobile-record" key={d.id} style={{'--delay':`${i*45}ms`} as any}><div className="mobile-record-head"><span className="person-avatar">{d.fullName?.slice(0,1)}</span><div><b>{d.fullName}</b><small>{d.phone} · کد ملی {d.nationalId}</small></div><Badge s={d.status}/></div><div className="mobile-record-grid"><span><small>خودروی فعلی</small><b>{a?.vehicle||'بدون خودرو'}</b></span><span><small>گواهینامه</small><b>{d.licenseNo}</b></span></div><Actions open={()=>onOpen(d)} edit={()=>onEdit(d)} del={()=>onDelete(d)}/></article>})}</div></>}
function AssignmentTable({rows,onReturn}:{rows:AnyRow[],onReturn:(r:AnyRow)=>void}){if(!rows.length)return <Empty text="هنوز تخصیصی ثبت نشده است"/>;return <><div className="desktop-table"><Table><TableHeader><TableRow><TableHead>خودرو</TableHead><TableHead>راننده</TableHead><TableHead>مقصد / مأموریت</TableHead><TableHead>شروع</TableHead><TableHead>وضعیت</TableHead><TableHead/></TableRow></TableHeader><TableBody>{rows.map(a=><TableRow key={a.id}><TableCell><b>{a.vehicle}</b><small>{a.plate}</small></TableCell><TableCell>{a.driver}</TableCell><TableCell>{a.destination||a.purpose||'—'}<small>{a.purpose}</small></TableCell><TableCell>{new Date(a.startAt).toLocaleDateString('fa-IR')}</TableCell><TableCell><Badge s={a.status}/></TableCell><TableCell>{a.status==='active'?<Button size="sm" variant="outline" onClick={()=>onReturn(a)}><RotateCcw/>ثبت عودت</Button>:null}</TableCell></TableRow>)}</TableBody></Table></div><div className="mobile-records">{rows.map((a,i)=><article className="mobile-record" key={a.id} style={{'--delay':`${i*45}ms`} as any}><div className="mobile-record-head"><span className="record-icon"><KeyRound/></span><div><b>{a.vehicle}</b><small>{a.plate} · {a.driver}</small></div><Badge s={a.status}/></div><div className="mobile-record-grid"><span><small>مقصد / مأموریت</small><b>{a.destination||a.purpose||'—'}</b></span><span><small>تاریخ شروع</small><b>{new Date(a.startAt).toLocaleDateString('fa-IR')}</b></span></div>{a.status==='active'?<Button className="mobile-primary-action" size="sm" variant="outline" onClick={()=>onReturn(a)}><RotateCcw/>ثبت عودت خودرو</Button>:null}</article>)}</div></>}
const iranDate=(value:string)=>new Intl.DateTimeFormat('fa-IR-u-ca-persian',{timeZone:'Asia/Tehran',weekday:'long',year:'numeric',month:'long',day:'numeric',hour:'2-digit',minute:'2-digit'}).format(new Date(value));
const iranMonth=(value:string)=>new Intl.DateTimeFormat('fa-IR-u-ca-persian',{timeZone:'Asia/Tehran',year:'numeric',month:'long'}).format(new Date(value));
function AssignmentHistory({rows,onReturn,compact=false}:{rows:AnyRow[],onReturn?:(r:AnyRow)=>void,compact?:boolean}){
 const [range,setRange]=useState('all'),[status,setStatus]=useState('all'),[from,setFrom]=useState(''),[to,setTo]=useState('');
 const filtered=useMemo(()=>{const now=Date.now(),days=range==='30d'?30:range==='3m'?92:range==='6m'?184:0;return [...rows].filter(a=>{const time=new Date(a.startAt).getTime();if(status!=='all'&&a.status!==status)return false;if(days&&time<now-days*86400000)return false;if(range==='custom'&&from&&time<new Date(from+'T00:00:00').getTime())return false;if(range==='custom'&&to&&time>new Date(to+'T23:59:59').getTime())return false;return true}).sort((a,b)=>new Date(b.startAt).getTime()-new Date(a.startAt).getTime())},[rows,range,status,from,to]);
 const groups=useMemo(()=>filtered.reduce((all:Record<string,AnyRow[]>,a)=>{const key=iranMonth(a.startAt);(all[key]??=[]).push(a);return all},{}),[filtered]);
 if(compact)return <div className="history-timeline compact">{filtered.map(a=><HistoryItem key={a.id} row={a}/>)}</div>;
 return <div className="assignment-history"><div className="history-toolbar"><div className="history-filter"><span>بازه زمانی</span><select value={range} onChange={e=>setRange(e.target.value)}><option value="all">همه زمان‌ها</option><option value="30d">۳۰ روز اخیر</option><option value="3m">۳ ماه اخیر</option><option value="6m">۶ ماه اخیر</option><option value="custom">بازه دلخواه</option></select></div><div className="history-filter"><span>وضعیت</span><select value={status} onChange={e=>setStatus(e.target.value)}><option value="all">همه وضعیت‌ها</option><option value="active">فعال</option><option value="pending_return">منتظر تأیید عودت</option><option value="returned">عودت شده</option></select></div>{range==='custom'?<><label className="history-date"><span>از تاریخ</span><Input type="date" value={from} onChange={e=>setFrom(e.target.value)}/></label><label className="history-date"><span>تا تاریخ</span><Input type="date" value={to} onChange={e=>setTo(e.target.value)}/></label></>:null}<div className="history-result"><strong>{filtered.length.toLocaleString('fa-IR')}</strong><span>تخصیص</span></div></div>{Object.entries(groups).map(([month,items])=><section className="history-month" key={month}><div className="history-month-head"><div><Clock3/><h3>{month}</h3></div><span>{items.length.toLocaleString('fa-IR')} مأموریت</span></div><div className="history-timeline">{items.map(a=><HistoryItem key={a.id} row={a} onReturn={onReturn}/>)}</div></section>)}{!filtered.length?<Empty text="تخصیصی در این بازه پیدا نشد"/>:null}</div>
}
function HistoryItem({row:a,onReturn}:{row:AnyRow,onReturn?:(r:AnyRow)=>void}){const distance=a.endMileage!=null?Number(a.endMileage)-Number(a.startMileage):null;return <article className="history-item"><div className="timeline-mark"><i></i></div><div className="history-card"><div className="history-card-head"><div><b>{a.vehicle}</b><small>{a.plate} · {a.driver}</small></div><Badge s={a.status}/></div><div className="history-route"><span><small>مبدأ زمانی تحویل</small><b>{iranDate(a.startAt)}</b></span><span><small>زمان عودت</small><b>{a.endAt?iranDate(a.endAt):'هنوز عودت نشده'}</b></span></div><div className="history-details"><span><small>مقصد</small><b>{a.destination||'—'}</b></span><span><small>شرح مأموریت</small><b>{a.purpose||'بدون شرح'}</b></span><span><small>کیلومتر تحویل</small><b>{Number(a.startMileage).toLocaleString('fa-IR')} km</b></span><span><small>کیلومتر عودت</small><b>{a.endMileage!=null?`${Number(a.endMileage).toLocaleString('fa-IR')} km`:'—'}</b></span><span><small>مسافت طی‌شده</small><b>{distance!=null?`${distance.toLocaleString('fa-IR')} km`:'در حال محاسبه'}</b></span></div>{a.status==='active'&&onReturn?<Button size="sm" variant="outline" onClick={()=>onReturn(a)}><RotateCcw/>ثبت عودت خودرو</Button>:null}</div></article>}
function MaintenanceTable({rows,onComplete}:{rows:AnyRow[],onComplete:(r:AnyRow)=>void}){if(!rows.length)return <Empty text="هنوز سرویس دوره‌ای ثبت نشده است"/>;return <><div className="desktop-table"><Table><TableHeader><TableRow><TableHead>خودرو</TableHead><TableHead>عنوان سرویس</TableHead><TableHead>موعد</TableHead><TableHead>هزینه</TableHead><TableHead>وضعیت</TableHead><TableHead/></TableRow></TableHeader><TableBody>{rows.map(m=><TableRow key={m.id}><TableCell><b>{m.vehicle}</b><small>{m.plate}</small></TableCell><TableCell>{m.title}<small>{m.vendor||'تعمیرگاه ثبت نشده'}</small></TableCell><TableCell>{m.dueDate}</TableCell><TableCell>{Number(m.cost).toLocaleString('fa-IR')} تومان</TableCell><TableCell><Badge s={m.status}/></TableCell><TableCell>{m.status==='scheduled'?<Button size="sm" onClick={()=>onComplete(m)}><CheckCircle2/>ثبت انجام</Button>:null}</TableCell></TableRow>)}</TableBody></Table></div><div className="mobile-records">{rows.map((m,i)=><article className="mobile-record" key={m.id} style={{'--delay':`${i*45}ms`} as any}><div className="mobile-record-head"><span className="record-icon"><Wrench/></span><div><b>{m.title}</b><small>{m.vehicle} · {m.plate}</small></div><Badge s={m.status}/></div><div className="mobile-record-grid"><span><small>موعد سرویس</small><b>{m.dueDate}</b></span><span><small>هزینه</small><b>{Number(m.cost).toLocaleString('fa-IR')} تومان</b></span></div>{m.status==='scheduled'?<Button className="mobile-primary-action" size="sm" onClick={()=>onComplete(m)}><CheckCircle2/>ثبت انجام سرویس</Button>:null}</article>)}</div></>}
const approvalType=(type:string)=>type==='return'?'عودت خودرو':type==='vehicle_request'?'درخواست خودرو':'انجام سرویس';
function ApprovalTable({rows,onOpen}:{rows:AnyRow[],onOpen:(r:AnyRow)=>void}){if(!rows.length)return <Empty text="درخواستی وجود ندارد"/>;return <><div className="desktop-table"><Table><TableHeader><TableRow><TableHead>درخواست</TableHead><TableHead>درخواست‌کننده</TableHead><TableHead>تاریخ</TableHead><TableHead>وضعیت</TableHead><TableHead>یادداشت سوپروایزر</TableHead><TableHead/></TableRow></TableHeader><TableBody>{rows.map(p=><TableRow key={p.id}><TableCell><b>{p.title}</b><small>{approvalType(p.type)}</small></TableCell><TableCell>{p.requestedBy}</TableCell><TableCell>{new Date(p.createdAt).toLocaleDateString('fa-IR')}</TableCell><TableCell><Badge s={p.status}/></TableCell><TableCell>{p.supervisorNote||'—'}</TableCell><TableCell>{p.status==='pending'?<Button size="sm" onClick={()=>onOpen(p)}>بررسی</Button>:null}</TableCell></TableRow>)}</TableBody></Table></div><div className="mobile-records">{rows.map((p,i)=><article className="mobile-record" key={p.id} style={{'--delay':`${i*45}ms`} as any}><div className="mobile-record-head"><span className="record-icon"><ShieldCheck/></span><div><b>{p.title}</b><small>{approvalType(p.type)}</small></div><Badge s={p.status}/></div><div className="mobile-record-grid"><span><small>درخواست‌کننده</small><b>{p.requestedBy}</b></span><span><small>تاریخ ثبت</small><b>{new Date(p.createdAt).toLocaleDateString('fa-IR')}</b></span></div>{p.supervisorNote?<p className="record-note">{p.supervisorNote}</p>:null}{p.status==='pending'?<Button className="mobile-primary-action" size="sm" onClick={()=>onOpen(p)}>بررسی درخواست</Button>:null}</article>)}</div></>}
function TicketCards({rows,onOpen}:{rows:AnyRow[],onOpen:(r:AnyRow)=>void}){return <div className="ticket-cards">{rows.map(t=><button key={t.id} onClick={()=>onOpen(t)}><span className={'priority '+t.priority}></span><div><b>{t.subject}</b><small>{t.code} · {t.assignee}</small></div><Badge s={t.status}/></button>)}{!rows.length?<Empty text="تیکت بازی وجود ندارد"/>:null}</div>}
function TicketTable({rows,onOpen}:{rows:AnyRow[],onOpen:(r:AnyRow)=>void}){if(!rows.length)return <Empty text="تیکتی ثبت نشده است"/>;return <><div className="desktop-table"><Table><TableHeader><TableRow><TableHead>شماره / موضوع</TableHead><TableHead>خودرو و راننده</TableHead><TableHead>ثبت‌کننده</TableHead><TableHead>مسئول</TableHead><TableHead>اولویت</TableHead><TableHead>وضعیت</TableHead><TableHead/></TableRow></TableHeader><TableBody>{rows.map(t=><TableRow key={t.id}><TableCell><b>{t.subject}</b><small>{t.code}</small></TableCell><TableCell>{t.vehicle||'عمومی'}<small>{t.driver||'—'}</small></TableCell><TableCell>{t.reporter}</TableCell><TableCell>{t.assignee}</TableCell><TableCell><span className={'priority-text '+t.priority}>{priorityFa[t.priority]||t.priority}</span></TableCell><TableCell><Badge s={t.status}/></TableCell><TableCell><Button size="sm" variant="outline" onClick={()=>onOpen(t)}><Eye/>مشاهده</Button></TableCell></TableRow>)}</TableBody></Table></div><div className="mobile-records">{rows.map((t,i)=><article className="mobile-record" key={t.id} style={{'--delay':`${i*45}ms`} as any}><div className="mobile-record-head"><span className={'record-icon priority-icon '+t.priority}><Ticket/></span><div><b>{t.subject}</b><small>{t.code} · {t.vehicle||'تیکت عمومی'}</small></div><Badge s={t.status}/></div><div className="mobile-record-grid"><span><small>مسئول پیگیری</small><b>{t.assignee}</b></span><span><small>اولویت</small><b className={'priority-text '+t.priority}>{priorityFa[t.priority]||t.priority}</b></span></div><Button className="mobile-primary-action" size="sm" variant="outline" onClick={()=>onOpen(t)}><Eye/>مشاهده پرونده تیکت</Button></article>)}</div></>}
function SmsPanel({rows,configured}:{rows:AnyRow[],configured:boolean}){return <><div className={configured?'integration ok':'integration'}><MessageSquareText/><div><b>اتصال کاوه‌نگار: {configured?'فعال':'در انتظار تنظیم'}</b><p>{configured?'ارسال الگوی پیامک فعال است.':'بعداً کلید API، شماره سوپروایزر و نام الگوها را وارد کنید؛ رویدادها تا آن زمان در این گزارش باقی می‌مانند.'}</p></div></div><div className="desktop-table"><Table><TableHeader><TableRow><TableHead>رویداد</TableHead><TableHead>گیرنده</TableHead><TableHead>الگو</TableHead><TableHead>توکن</TableHead><TableHead>زمان</TableHead><TableHead>وضعیت</TableHead></TableRow></TableHeader><TableBody>{rows.map(s=><TableRow key={s.id}><TableCell>{eventFa[s.event]||s.event}</TableCell><TableCell>{s.receptor}</TableCell><TableCell>{s.template||'تنظیم نشده'}</TableCell><TableCell>{s.token}</TableCell><TableCell>{new Date(s.createdAt).toLocaleString('fa-IR')}</TableCell><TableCell><Badge s={s.status}/><small>{s.responseMessage}</small></TableCell></TableRow>)}</TableBody></Table></div><div className="mobile-records">{rows.map((s,i)=><article className="mobile-record" key={s.id} style={{'--delay':`${i*45}ms`} as any}><div className="mobile-record-head"><span className="record-icon"><MessageSquareText/></span><div><b>{eventFa[s.event]||s.event}</b><small>{new Date(s.createdAt).toLocaleString('fa-IR')}</small></div><Badge s={s.status}/></div><div className="mobile-record-grid"><span><small>گیرنده</small><b>{s.receptor}</b></span><span><small>الگو</small><b>{s.template||'تنظیم نشده'}</b></span></div>{s.responseMessage?<p className="record-note">{s.responseMessage}</p>:null}</article>)}</div></>}

const priorityFa:Record<string,string>={normal:'عادی',high:'مهم',urgent:'فوری'},eventFa:Record<string,string>={assignment:'تخصیص خودرو',ticket_created:'ایجاد تیکت',ticket_message:'پیام جدید تیکت',ticket_status:'تغییر وضعیت',approval:'نتیجه تأیید'};

function AppDialog({modal,setModal,form,setForm,error,busy,data,active,act}:any){if(!modal)return null;const type=modal.type;const update=(k:string,v:any)=>setForm({...form,[k]:v});const submit=(e:any)=>{e.preventDefault();if(['vehicle','driver','type'].includes(type))act({action:type+'.save',...form});else if(type==='assignment')act({action:'assignment.create',...form});else if(type==='maintenance')act({action:'maintenance.create',...form});else if(type==='ticket')act({action:'ticket.create',...form});};
 const vehicleHistory=type==='vehicle.detail'?data.assignments.filter((a:AnyRow)=>a.vehicleId===modal.row.id):[],driverHistory=type==='driver.detail'?data.assignments.filter((a:AnyRow)=>a.driverId===modal.row.id):[],selectedVehicle=data.vehicles.find((v:AnyRow)=>String(v.id)===String(form.vehicleId)),freeByType=data.vehicles.filter((v:AnyRow)=>v.status==='ready'&&String(v.typeId)===String(form.typeId));
 return <Dialog open onOpenChange={o=>!o&&setModal(null)}><DialogContent className="dialog" dir="rtl"><DialogHeader><DialogTitle>{titleFor(type,!!form.id)}</DialogTitle><DialogDescription>{descFor(type)}</DialogDescription></DialogHeader>{error?<div className="error">{error}</div>:null}
 {(['vehicle','driver','type'].includes(type))?<form onSubmit={submit}><div className="form-grid">{type==='vehicle'?<><Picker label="نوع خودرو" value={form.typeId} onChange={(v:any)=>update('typeId',v)} options={data.vehicleTypes.filter((t:AnyRow)=>t.isActive)} text={(x:any)=>`${x.brand} ${x.name}`}/>{form.typeId?<div className="selected-type"><img src={data.vehicleTypes.find((t:AnyRow)=>String(t.id)===String(form.typeId))?.imageUrl} alt=""/><span>{data.vehicleTypes.find((t:AnyRow)=>String(t.id)===String(form.typeId))?.brand} {data.vehicleTypes.find((t:AnyRow)=>String(t.id)===String(form.typeId))?.name}</span></div>:null}</>:null}{fields[type].map(f=><label key={f.name} className={f.name==='notes'?'wide':''}><span>{f.label}{f.required?' *':''}</span>{f.name==='notes'?<Textarea value={form[f.name]||''} onChange={e=>update(f.name,e.target.value)}/>:<Input required={f.required} type={f.type||'text'} value={form[f.name]??''} onChange={e=>update(f.name,e.target.value)}/>}</label>)}</div><DialogFooter><Button type="button" variant="outline" onClick={()=>setModal(null)}>انصراف</Button><Button disabled={busy||(type==='vehicle'&&!form.typeId)}>{busy?<Loader2 className="spin"/>:null}ذخیره اطلاعات</Button></DialogFooter></form>
 :type==='vehicle.request'?<div className="vehicle-request-flow"><div className="request-steps"><span className={form.typeId?'done':'active'}>۱<small>نوع خودرو</small></span><i></i><span className={form.vehicleId?'done':form.typeId?'active':''}>۲<small>انتخاب پلاک</small></span><i></i><span className={form.vehicleId?'active':''}>۳<small>تأیید درخواست</small></span></div><div className="form-grid"><Picker label="نوع خودرو" value={form.typeId} onChange={(v:any)=>setForm({typeId:v})} options={data.vehicleTypes.filter((t:AnyRow)=>data.vehicles.some((v:AnyRow)=>v.status==='ready'&&v.typeId===t.id))} text={(x:any)=>`${x.brand} ${x.name}`}/>{form.typeId?<Picker label="پلاک‌های آزاد این مدل" value={form.vehicleId} onChange={(v:any)=>update('vehicleId',v)} options={freeByType} text={(x:any)=>`${x.plate} — ${x.color} — مدل ${x.year}`}/>:null}<Field label="مقصد" value={form.destination} onChange={(v:any)=>update('destination',v)}/><label className="wide"><span>شرح نیاز / مأموریت</span><Textarea value={form.purpose||''} onChange={e=>update('purpose',e.target.value)} placeholder="برای چه مأموریتی خودرو را نیاز دارید؟"/></label></div>{selectedVehicle?<article className="request-vehicle-preview"><img src={selectedVehicle.imageUrl||'/favicon.svg'} alt=""/><div><small>خودروی انتخاب‌شده</small><h3>{selectedVehicle.title}</h3><p>پلاک {selectedVehicle.plate} · رنگ {selectedVehicle.color} · مدل {selectedVehicle.year}</p><span>کارکرد فعلی: {Number(selectedVehicle.mileage).toLocaleString('fa-IR')} کیلومتر</span></div><Badge s={selectedVehicle.status}/></article>:null}<DialogFooter><Button variant="outline" onClick={()=>setModal(null)}>انصراف</Button><Button disabled={busy||!form.vehicleId} onClick={()=>act({action:'vehicle.request',vehicleId:form.vehicleId,destination:form.destination,purpose:form.purpose})}>{busy?<Loader2 className="spin"/>:<ClipboardPlus/>}تأیید و ارسال درخواست</Button></DialogFooter></div>
 :type==='assignment'?<form onSubmit={submit}><div className="assignment-notice"><KeyRound/><div><b>واگذاری می‌تواند چندماه ادامه داشته باشد</b><small>خودرو تا ثبت درخواست عودت و تأیید قطعی سوپروایزر همچنان به نام همین راننده خواهد بود.</small></div></div><div className="form-grid"><Picker label="خودروی آماده" value={form.vehicleId} onChange={(v:any)=>update('vehicleId',v)} options={data.vehicles.filter((v:AnyRow)=>v.status==='ready')} text={(x:any)=>`${x.title} — ${x.plate}`}/><Picker label="راننده" value={form.driverId} onChange={(v:any)=>update('driverId',v)} options={data.drivers.filter((d:AnyRow)=>d.status==='active'&&!active.some((a:AnyRow)=>a.driverId===d.id))} text={(x:any)=>x.fullName}/><Picker label="نوع واگذاری" value={form.assignmentType||'long_term'} onChange={(v:any)=>update('assignmentType',v)} options={[{id:'long_term',name:'بلندمدت / بدون تاریخ پایان'},{id:'mission',name:'ماموریتی / دارای موعد تقریبی'}]} text={(x:any)=>x.name}/><Field label="زمان تحویل" type="datetime-local" value={form.startAt} onChange={(v:any)=>update('startAt',v)}/>{form.assignmentType==='mission'?<Field label="موعد تقریبی عودت" type="datetime-local" value={form.expectedReturnAt} onChange={(v:any)=>update('expectedReturnAt',v)}/>:null}<Field label="مقصد (اختیاری)" value={form.destination} onChange={(v:any)=>update('destination',v)}/><Field label="شرح واگذاری / مأموریت" value={form.purpose} onChange={(v:any)=>update('purpose',v)}/><Field label="کیلومتر شروع" type="number" value={form.startMileage} onChange={(v:any)=>update('startMileage',v)}/></div><DialogFooter><Button type="button" variant="outline" onClick={()=>setModal(null)}>انصراف</Button><Button disabled={busy||!form.vehicleId||!form.driverId}>ثبت تخصیص بلندمدت</Button></DialogFooter></form>
 :type==='maintenance'?<form onSubmit={submit}><div className="form-grid"><Picker label="خودرو" value={form.vehicleId} onChange={(v:any)=>update('vehicleId',v)} options={data.vehicles} text={(x:any)=>`${x.title} — ${x.plate}`}/><Field label="عنوان سرویس" value={form.title} onChange={(v:any)=>update('title',v)}/><Field label="تاریخ موعد" type="date" value={form.dueDate} onChange={(v:any)=>update('dueDate',v)}/><Field label="کارکرد موعد" type="number" value={form.dueMileage} onChange={(v:any)=>update('dueMileage',v)}/><Field label="تعمیرگاه" value={form.vendor} onChange={(v:any)=>update('vendor',v)}/><Field label="هزینه تخمینی" type="number" value={form.cost} onChange={(v:any)=>update('cost',v)}/></div><DialogFooter><Button type="button" variant="outline" onClick={()=>setModal(null)}>انصراف</Button><Button disabled={busy||!form.vehicleId||!form.title||!form.dueDate}>ثبت سرویس</Button></DialogFooter></form>
 :type==='ticket'?<form onSubmit={submit}><div className="form-grid"><Field label="موضوع تیکت" value={form.subject} onChange={(v:any)=>update('subject',v)}/><Picker label="دسته‌بندی" value={form.category} onChange={(v:any)=>update('category',v)} options={[{id:'defect',name:'خرابی فنی'},{id:'damage',name:'خسارت'},{id:'discrepancy',name:'مغایرت تحویل'},{id:'violation',name:'تخلف'},{id:'maintenance',name:'سرویس'},{id:'general',name:'عمومی'}]} text={(x:any)=>x.name}/><Picker label="اولویت" value={form.priority} onChange={(v:any)=>update('priority',v)} options={[{id:'normal',name:'عادی'},{id:'high',name:'مهم'},{id:'urgent',name:'فوری'}]} text={(x:any)=>x.name}/><Picker optional label="خودرو مرتبط" value={form.vehicleId} onChange={(v:any)=>update('vehicleId',v)} options={data.vehicles} text={(x:any)=>`${x.title} — ${x.plate}`}/><Picker optional label="راننده مرتبط" value={form.driverId} onChange={(v:any)=>update('driverId',v)} options={data.drivers} text={(x:any)=>x.fullName}/><Field label="مسئول پیگیری" value={form.assignee} onChange={(v:any)=>update('assignee',v)}/><label className="wide"><span>شرح مستند موضوع</span><Textarea required value={form.description||''} onChange={e=>update('description',e.target.value)}/></label></div><DialogFooter><Button type="button" variant="outline" onClick={()=>setModal(null)}>انصراف</Button><Button disabled={busy||!form.subject||!form.description}>ثبت و ارسال به سوپروایزر</Button></DialogFooter></form>
 :type==='ticket.detail'?<><div className="ticket-detail-head"><div><span>{modal.row.code}</span><h3>{modal.row.subject}</h3><p>{modal.row.description}</p></div><div><span className={'priority-text '+modal.row.priority}>{priorityFa[modal.row.priority]}</span><Badge s={modal.row.status}/></div></div><div className="ticket-context"><span>خودرو: <b>{modal.row.vehicle||'—'}</b></span><span>راننده: <b>{modal.row.driver||'—'}</b></span><span>مسئول: <b>{modal.row.assignee}</b></span></div><div className="thread">{data.ticketMessages.filter((m:AnyRow)=>m.ticketId===modal.row.id).map((m:AnyRow)=><article key={m.id}><div><b>{m.author}</b><small>{m.authorRole} · {new Date(m.createdAt).toLocaleString('fa-IR')}</small></div><p>{m.body}</p></article>)}</div>{modal.row.status!=='closed'?<><label><span>ثبت پاسخ جدید</span><Textarea value={form.body||''} onChange={e=>update('body',e.target.value)} placeholder="پاسخ، نتیجه بررسی یا مستندات تکمیلی..."/></label><DialogFooter><Button variant="outline" disabled={busy} onClick={()=>act({action:'ticket.status',id:modal.row.id,status:modal.row.status==='in_progress'?'waiting':'in_progress'})}>{modal.row.status==='in_progress'?'منتظر پاسخ':'شروع پیگیری'}</Button><Button variant="destructive" disabled={busy} onClick={()=>act({action:'ticket.status',id:modal.row.id,status:'closed'})}>بستن تیکت</Button><Button disabled={busy||!form.body} onClick={()=>act({action:'ticket.message',ticketId:modal.row.id,body:form.body})}>ثبت پاسخ و پیامک</Button></DialogFooter></>:<Button variant="outline" onClick={()=>act({action:'ticket.status',id:modal.row.id,status:'open'})}>بازگشایی تیکت</Button>}</>
 :type==='return'?<><div className="record"><b>{modal.row.vehicle}</b><span>تحویل‌گیرنده: {modal.row.driver}</span><span>مقصد: {modal.row.destination||'—'}</span></div><Field label="کیلومتر هنگام عودت" type="number" value={form.endMileage} onChange={(v:any)=>update('endMileage',v)}/><DialogFooter><Button variant="outline" onClick={()=>setModal(null)}>انصراف</Button><Button disabled={busy||!form.endMileage} onClick={()=>act({action:'assignment.return',id:modal.row.id,endMileage:form.endMileage})}>ارسال برای تأیید سوپروایزر</Button></DialogFooter></>
 :type==='complete'?<><div className="record"><b>{modal.row.title}</b><span>{modal.row.vehicle} — {modal.row.plate}</span></div><div className="form-grid"><Field label="هزینه نهایی" type="number" value={form.cost??modal.row.cost} onChange={(v:any)=>update('cost',v)}/><Field label="تعمیرگاه" value={form.vendor??modal.row.vendor} onChange={(v:any)=>update('vendor',v)}/></div><DialogFooter><Button variant="outline" onClick={()=>setModal(null)}>انصراف</Button><Button disabled={busy} onClick={()=>act({action:'maintenance.complete',id:modal.row.id,cost:form.cost??modal.row.cost,vendor:form.vendor??modal.row.vendor})}>ارسال برای تأیید</Button></DialogFooter></>
 :type==='approval'?<><div className="record"><b>{modal.row.title}</b><span>درخواست‌کننده: {modal.row.requestedBy}</span><span>نوع: {approvalType(modal.row.type)}</span></div><label><span>یادداشت سوپروایزر</span><Textarea value={form.note||''} onChange={e=>update('note',e.target.value)} placeholder="توضیح اختیاری..."/></label><DialogFooter><Button variant="destructive" disabled={busy} onClick={()=>act({action:'approval.resolve',id:modal.row.id,approved:false,note:form.note})}>رد درخواست</Button><Button disabled={busy} onClick={()=>act({action:'approval.resolve',id:modal.row.id,approved:true,note:form.note})}>تأیید درخواست</Button></DialogFooter></>
 :type.startsWith('delete.')?<><div className="record danger"><b>این عملیات قابل بازگشت نیست.</b><span>«{modal.row.title||modal.row.fullName}» حذف خواهد شد.</span></div><DialogFooter><Button variant="outline" onClick={()=>setModal(null)}>انصراف</Button><Button variant="destructive" disabled={busy} onClick={()=>act({action:type.replace('delete.','')+'.delete',id:modal.row.id})}>حذف قطعی</Button></DialogFooter></>
 :<><div className="record profile-record"><b>{modal.row.title||modal.row.fullName}</b>{Object.entries(modal.row).filter(([k])=>!['id','createdAt','status','title','fullName','notes'].includes(k)).map(([k,v])=><span key={k}>{labelMap[k]||k}: {String(v||'—')}</span>)}{modal.row.notes?<p>{modal.row.notes}</p>:null}</div><h3>تاریخچه کامل تخصیص‌ها</h3>{[...vehicleHistory,...driverHistory].length?<AssignmentHistory rows={[...vehicleHistory,...driverHistory]} compact/>:<Empty text="سابقه‌ای ثبت نشده است"/>}</>}
 </DialogContent></Dialog>}
function Field({label,value,onChange,type='text'}:any){return <label><span>{label}</span><Input type={type} value={value??''} onChange={e=>onChange(e.target.value)}/></label>}
function Picker({label,value,onChange,options,text,optional=false}:any){return <label><span>{label}</span><select required={!optional} value={value||''} onChange={e=>onChange(e.target.value)}><option value="">{optional?'بدون انتخاب':'انتخاب کنید'}</option>{options.map((o:any)=><option key={o.id} value={o.id}>{text(o)}</option>)}</select></label>}
const labelMap:Record<string,string>={model:'مدل',plate:'پلاک',vin:'شماره شاسی',year:'سال ساخت',color:'رنگ',mileage:'کارکرد',phone:'شماره تماس',nationalId:'کد ملی',licenseNo:'شماره گواهینامه',licenseExpiry:'اعتبار گواهینامه'};
const imageSources:Record<string,string>={'/cars/santafe.jpg':'https://commons.wikimedia.org/wiki/File:2024_Hyundai_Santa_Fe_(MX5)_IMG_5295.jpg','/cars/cerato.jpg':'https://commons.wikimedia.org/wiki/File:KIA_FORTE_R_(KIA_FORTE_SEDAN_(TD))_China.jpg','/cars/pars.jpg':'https://commons.wikimedia.org/wiki/File:IMG_peugeot_pars_22.jpg','/cars/rav4.jpg':'https://commons.wikimedia.org/wiki/File:2021_Toyota_RAV4_PHV.jpg','/cars/tara.jpg':'https://commons.wikimedia.org/wiki/File:IKCO_Tara_01_2025-04-11.jpg','/cars/landcruiser.jpg':'https://commons.wikimedia.org/wiki/File:Toyota_Land_Cruiser_in_Mongolia.jpg'};
function titleFor(t:string,edit:boolean){return t==='vehicle.request'?'درخواست خودرو':t==='ticket'?'ثبت تیکت مستند':t==='ticket.detail'?'پرونده تیکت':t==='type'?(edit?'ویرایش مدل خودرو':'تعریف مدل خودرو'):t==='vehicle'?(edit?'ویرایش خودرو':'تعریف خودرو'):t==='driver'?(edit?'ویرایش راننده':'افزودن راننده'):t==='assignment'?'تخصیص خودرو':t==='maintenance'?'ثبت سرویس دوره‌ای':t==='return'?'ثبت عودت خودرو':t==='complete'?'ثبت انجام سرویس':t==='approval'?'بررسی درخواست سوپروایزر':t.startsWith('delete')?'تأیید حذف':'پرونده کامل'}
function descFor(t:string){return t.includes('detail')?'مشخصات و سوابق ثبت‌شده در سامانه':t==='approval'?'پس از بررسی، درخواست را تأیید یا رد کنید.':'اطلاعات خواسته‌شده را کامل و دقیق وارد کنید.'}
