const DIYE_RATE_OVERRIDES = { "1400": 4800000000 };

const CompleteDiyaView = () => {
  const [data, setData] = React.useState(null);
  const [year, setYear] = React.useState("1405");
  const [mode, setMode] = React.useState("body");
  const [part, setPart] = React.useState("1");
  const [subtype, setSubtype] = React.useState("1");
  const [fetus, setFetus] = React.useState("1");
  const [deceased, setDeceased] = React.useState("1");
  const [gender, setGender] = React.useState("1");
  const [forbidden, setForbidden] = React.useState(false);
  const [percent, setPercent] = React.useState("");
  const [top, setTop] = React.useState("");
  const [bottom, setBottom] = React.useState("");
  const [bodyPercent, setBodyPercent] = React.useState("");
  const [deceasedPercent, setDeceasedPercent] = React.useState("");

  React.useEffect(() => {
    fetch("legal-data/diye.json?v=31.19").then(r => r.json()).then(setData).catch(() => setData({error:true}));
  }, []);

  if (!data) return <div className="calc-empty"><b>در حال بارگذاری بانک اطلاعات دیه…</b></div>;
  if (data.error) return <div className="calc-empty"><b>بارگذاری داده‌های دیه ناموفق بود.</b></div>;

  const parseRate = (y) => {
    if (DIYE_RATE_OVERRIDES[y]) return DIYE_RATE_OVERRIDES[y];
    const rows = data.years?.[y] || [];
    const text = rows.find(x => x.includes("دیه کامل سال")) || "";
    const matches = text.match(/[0-9][0-9,]+(?=\s*ریال)/g) || [];
    return Number((matches[matches.length - 1] || "0").replace(/,/g,""));
  };
  const rate = parseRate(year);
  const scaleText = (text) => String(text || "").replace(/([0-9][0-9,]+)\s*ریال/g, (_,n) => `${new Intl.NumberFormat("fa-IR").format(Math.round(Number(n.replace(/,/g,"")) * rate / 21000000000))} ریال`).replace(/([0-9][0-9,]+)\s*تومان/g, (_,n) => `${new Intl.NumberFormat("fa-IR").format(Math.round(Number(n.replace(/,/g,"")) * rate / 21000000000))} تومان`);
  const group = data.bodyParts?.[part];
  const item = group?.items?.find(x => x.value === subtype) || group?.items?.[0];
  const fetusItem = data.modes?.fetus?.find(x => x.value === fetus) || data.modes?.fetus?.[0];
  const deceasedItem = data.modes?.deceased?.find(x => x.value === deceased) || data.modes?.deceased?.[0];
  const suicideItem = data.modes?.suicide?.find(x => x.gender === gender && x.forbidden === forbidden) || data.modes?.suicide?.[0];
  const numericValue = mode === "percent" ? (nval(percent)>0 ? rate*nval(percent)/100 : null) : mode === "fraction" ? (nval(top)>0&&nval(bottom)>0 ? rate*nval(top)/nval(bottom) : null) : null;
  const dynamicItem = mode === "body" ? item : mode === "deceased" ? deceasedItem : null;
  const dynamicPercent = mode === "body" ? bodyPercent : deceasedPercent;
  const dynamicReady = dynamicItem?.input === "percent" && nval(dynamicPercent) > 0;
  const dynamicMale = dynamicReady ? rate * Number(dynamicItem.ratioBase || 1) * nval(dynamicPercent) / 100 : 0;
  const dynamicFemale = dynamicMale < rate / 3 ? dynamicMale : dynamicMale / 2;
  const selectedResult = mode === "body" ? item?.result : mode === "fetus" ? fetusItem?.result : mode === "deceased" ? deceasedItem?.result : mode === "suicide" ? suicideItem?.result : [];
  const lines = Array.isArray(selectedResult) ? selectedResult : [];

  return <div className="complete-diye">
    <div className="calc-section-title">محاسبه جامع دیه، ارش، جنین و اعضای بدن</div>
    <div className="calc-fields two">
      <div className="field"><label>سال وقوع جنایت</label><select value={year} onChange={e=>setYear(e.target.value)}>{Object.keys(data.years||{}).sort((a,b)=>Number(b)-Number(a)).map(y=><option key={y}>{y}</option>)}</select></div>
      <div className="field"><label>نوع دیه</label><select value={mode} onChange={e=>setMode(e.target.value)}><option value="percent">درصدی</option><option value="fraction">کسری</option><option value="suicide">قتل نفس</option><option value="fetus">جنین</option><option value="body">اعضای بدن و منافع</option><option value="deceased">جنایت بر میت</option></select></div>
    </div>
    {mode === "percent" && <div className="field"><label>عدد درصد</label><NumericInput value={percent} onValue={setPercent} decimal/></div>}
    {mode === "fraction" && <div className="calc-fields two"><div className="field"><label>صورت کسر</label><NumericInput value={top} onValue={setTop}/></div><div className="field"><label>مخرج کسر</label><NumericInput value={bottom} onValue={setBottom}/></div></div>}
    {mode === "suicide" && <><div className="field"><label>جنسیت مقتول</label><select value={gender} onChange={e=>setGender(e.target.value)}>{[...new Map((data.modes?.suicide||[]).map(x=>[x.gender,x.label])).entries()].map(([v,l])=><option value={v} key={v}>{l}</option>)}</select></div><label className="calc-check"><input type="checkbox" checked={forbidden} onChange={e=>setForbidden(e.target.checked)}/> قتل در ماه حرام یا محدوده مکه مکرمه</label></>}
    {mode === "fetus" && <div className="field"><label>وضعیت جنین</label><select value={fetus} onChange={e=>setFetus(e.target.value)}>{(data.modes?.fetus||[]).map(x=><option value={x.value} key={x.value}>{x.label}</option>)}</select></div>}
    {mode === "deceased" && <div className="field"><label>نوع جنایت بر میت</label><select value={deceased} onChange={e=>{setDeceased(e.target.value);setDeceasedPercent("");}}>{(data.modes?.deceased||[]).map(x=><option value={x.value} key={x.value}>{x.label}</option>)}</select></div>}
    {mode === "body" && <div className="calc-fields two"><div className="field"><label>عضو یا منفعت</label><select value={part} onChange={e=>{setPart(e.target.value);setSubtype("1");setBodyPercent("");}}>{Object.entries(data.bodyParts||{}).map(([id,g])=><option value={id} key={id}>{g.name}</option>)}</select></div><div className="field"><label>حالت آسیب یا نقص</label><select value={subtype} onChange={e=>{setSubtype(e.target.value);setBodyPercent("");}}>{(group?.items||[]).map(x=><option value={x.value} key={x.value}>{x.label}</option>)}</select></div></div>}
    {dynamicItem?.input === "percent" && <div className="field"><label>نسبت جزء به کل به درصد (%)</label><NumericInput value={dynamicPercent} onValue={mode === "body" ? setBodyPercent : setDeceasedPercent} decimal placeholder="برای مثال ۵۰"/></div>}
    <div className="calc-result complete-result">
      <div className="l">نتیجه مستند برای سال {year}</div>
      <div className="breakdown"><div className="li"><span>دیه کامل سال</span><b>{moneyFa(rate)} ریال</b></div>{numericValue !== null && <div className="li"><span>مبلغ محاسبه‌شده</span><b>{moneyFa(numericValue)} ریال</b></div>}{dynamicReady&&dynamicItem.audience==="male"&&<div className="li"><span>دیه مرد</span><b>{moneyFa(dynamicMale)} ریال</b></div>}{dynamicReady&&dynamicItem.audience==="female-only"&&<div className="li"><span>دیه زن</span><b>{moneyFa(dynamicMale)} ریال</b></div>}{dynamicReady&&dynamicItem.audience==="both"&&<><div className="li"><span>دیه زن</span><b>{moneyFa(dynamicFemale)} ریال</b></div><div className="li"><span>دیه مرد</span><b>{moneyFa(dynamicMale)} ریال</b></div></>}</div>
      {lines.map((line,i)=><div className="legal-output" key={i}>{scaleText(line)}</div>)}
      {mode === "body" && item?.label && <div className="selected-damage">{item.label}</div>}
    </div>
    <div className="calc-hint">مبنای سال ۱۴۰۰ با بخشنامه رسمی قوه قضائیه به ۴٬۸۰۰٬۰۰۰٬۰۰۰ ریال اصلاح شده است. ارش و مهرالمثل بدون نظر کارشناس یا دادگاه به عدد تبدیل نمی‌شوند.</div>
  </div>;
};

const ExtractedReferenceView = ({ panel }) => {
  const [all, setAll] = React.useState(null);
  const [primary, setPrimary] = React.useState("");
  const [secondary, setSecondary] = React.useState("");
  React.useEffect(()=>{fetch("legal-data/tools.json?v=31.18").then(r=>r.json()).then(setAll);},[]);
  if(!all) return <div className="calc-empty">در حال بارگذاری تعرفه‌های استخراج‌شده…</div>;
  const p=all.panels?.[panel]||{};
  if(panel==="office") return <CompleteOfficeView data={p}/>;
  if(panel==="court") return <CompleteCourtView data={p}/>;
  if(panel==="arbitration") return <CompleteArbitrationView/>;
  if(panel==="execution") return <CompleteExecutionView/>;
  if(panel==="propertyExpert") return <CompletePropertyExpertView/>;
  if(panel==="expert") return <CompleteExpertView panel="expert"/>;
  return null;
};

const ReferenceResult=({rows=[]})=><div className="calc-result"><div className="l">خروجی مرجع</div>{(rows||[]).map((x,i)=><div className="legal-output" key={i}>{x}</div>)}</div>;

const CompleteExecutionView=()=>{
  const [amount,setAmount]=React.useState(""),[status,setStatus]=React.useState("full");
  const a=nval(amount),small=a>0&&a<=20000,rate=status==="full"?.05:status==="half"?.025:0,fee=small?0:a*rate,ready=a>0;
  const reason=small?"معافیت محکوم‌به بیست‌هزار ریال یا کمتر":status==="timely"?"اجرای مفاد اجراییه در مهلت ده‌روزه":status==="half"?"سازش یا ترتیب اجرای حکم میان طرفین":"حق اجرای کامل پس از انقضای مهلت قانونی";
  return <div className="calc-workspace"><div className="calc-form"><div className="calc-section-title">نیم‌عشر و حق اجرای حکم مدنی</div><div className="field"><label>مبلغ محکوم‌به (ریال)</label><NumericInput value={amount} onValue={setAmount}/></div><div className="field"><label>وضعیت اجرای حکم</label><select value={status} onChange={e=>setStatus(e.target.value)}><option value="full">پس از ده روز؛ حق اجرای کامل</option><option value="half">سازش یا توافق بر ترتیب اجرای حکم؛ نصف حق اجرا</option><option value="timely">اجرای مفاد اجراییه در مهلت ده‌روزه</option></select></div><div className="calc-hint">حق اجرای کامل پنج درصد محکوم‌به است. سازش یا ترتیب اجرای حکم میان طرفین، آن را به نصف کاهش می‌دهد؛ اجرای مفاد اجراییه در مهلت ده‌روزه مشمول حق اجرا نمی‌شود.</div></div><div className="calc-result legal-result"><div className="l">حق اجرا</div><div className="n">{ready?moneyFa(fee):"—"} <small>{ready?"ریال":""}</small></div>{ready&&<div className="breakdown"><div className="li"><span>مبلغ محکوم‌به</span><b>{moneyFa(a)} ریال</b></div><div className="li"><span>نرخ مؤثر</span><b>{(small?0:rate).toLocaleString("fa-IR",{style:"percent",maximumFractionDigits:1})}</b></div><div className="li"><span>علت</span><b>{reason}</b></div></div>}<div className="legal-output">مستند: مواد ۳۴، ۱۵۸ و ۱۶۰ قانون اجرای احکام مدنی؛ حق اجرا پس از اجرا وصول می‌شود و هزینه‌های ضروری اجرای حکم جدا از این مبلغ است.</div></div></div>;
};

const OFFICE_1405_ITEMS=[
  ["تنظیم و ثبت اظهارنامه","1,181,500 ریال"],
  ["تنظیم و ثبت شکوائیه / اعلام جرم","1,445,500 ریال"],
  ["تنظیم و ثبت دادخواست / درخواست بدوی","1,445,500 ریال"],
  ["تنظیم و ثبت دادخواست / درخواست‌های اعتراضی","1,445,500 ریال"],
  ["تنظیم و ثبت واخواست اسناد تجاری","945,200 ریال"],
  ["ثبت قرارداد و اعطای وکالت","945,200 ریال"],
  ["تنظیم و ثبت لایحه / اعلام نظریه کارشناسی","1,181,500 ریال"],
  ["افزودن اطلاعات افراد ذی‌سمت پرونده و اظهارنامه، وکیل و نماینده (هر نفر)","132,050 ریال"],
  ["افزودن پیوست (هر صفحه)","132,050 ریال"],
  ["تایپ هر صفحه","بر اساس تعرفه اعلامی از نهادهای متولی"],
  ["پرداخت الکترونیکی درآمدهای عمومی و اختصاصی و سپرده‌های قضایی","123,000 ریال"],
  ["چاپ و تحویل هر برگ اوراق قضایی","بر اساس تعرفه اعلامی از نهادهای متولی"],
  ["پیگیری اظهارنامه، شکوائیه و دادخواست","139,000 ریال"],
  ["اطلاع‌رسانی وضعیت پرونده","139,000 ریال"],
  ["ورود به صفحه شخصی در سامانه ابلاغ و رؤیت آن","139,000 ریال"],
  ["تحویل رمز حساب کاربری","104,250 ریال"],
  ["تقاضای گواهی عدم سوءپیشینه","215,450 ریال"],
  ["دریافت هزینه تمدید پروانه وکلا / کارشناسان / مترجمان","139,000 ریال"],
  ["اطلاع‌رسانی فرایند دادرسی از طریق پیامک برای هر فرد","بر اساس تعرفه اعلامی از نهادهای متولی"],
  ["دریافت نوبت مراجعه به واحدهای قضایی","83,400 ریال"],
  ["شرکت در جلسه تحقیق و رسیدگی الکترونیکی","ورودی 278,000 ریال و به ازای هر دقیقه 47,260 ریال"],
  ["تکمیل فرایند احراز هویت","145,950 ریال"],
  ["درخواست گواهی پیشینه محکومیت‌های مالی","222,400 ریال"],
  ["ملاقات از راه دور خانواده زندانیان","ورودی 278,000 ریال و به ازای هر دقیقه 47,260 ریال"],
  ["ارائه خدمات سیار","معادل سه برابر خدمت ارائه‌شده"],
  ["تنظیم استشهادیه الکترونیکی","834,000 ریال"],
  ["ارائه خدمات مشورتی برای طرح و پیگیری امور قضایی (حداکثر ۱۵ دقیقه)","1,841,750 ریال"],
  ["خدمات خودکاربری","معادل ۲۰ درصد خدمت ارائه‌شده"],
  ["ثبت اطلاعات و محاسبه ارزش منطقه‌ای","486,500 ریال"],
  ["خدمات غیرحضوری دفاتر","معادل ۵۰ درصد خدمت ارائه‌شده"],
  ["ثبت درخواست داوری","1,035,550 ریال"],
  ["خدمات شبه‌قضایی","مطابق تعرفه اعلامی نهادهای متقاضی"],
  ["برون‌سپاری اجرای احکام مدنی به دفاتر خدمات الکترونیک قضایی","1,181,500 ریال"],
  ["تکمیل فرایند ثبت اطلاعات و ارائه شناسه قضایی","187,650 ریال"],
  ["درخواست عفو، تخفیف و تبدیل مجازات","1,445,500 ریال"],
  ["دادخواست ورود ثالث / جلب ثالث / اعاده دادرسی / تقابل شورای حل اختلاف","1,445,500 ریال"],
  ["ثبت دعاوی مراجع اختصاصی اداری و شبه‌قضایی","1,445,500 ریال"],
  ["ثبت اعتراض به آرای دادسرا، تجدیدنظرخواهی و اعاده دادرسی از آرای دادگاه‌های نظامی","1,445,500 ریال"],
  ["صدور گواهی انحصار وراثت","1,445,500 ریال"],
  ["ثبت مفقودی چک، اشخاص، اشیا، مدارک و اموال منقول","1,445,500 ریال"],
  ["دریافت گواهی فوت از سازمان پزشکی قانونی","284,950 ریال"],
  ["درخواست اعتبارسنجی افراد","284,950 ریال"],
  ["ثبت و ارسال درخواست به سامانه مسیر","700,000 ریال"],
  ["اعتراض به گزارش کروکی تصادف","150,000 ریال"],
  ["ثبت اعتراض به رأی هیئت حل اختلاف سازمان ثبت احوال موضوع بند ث ماده ۱۱۳ قانون برنامه هفتم پیشرفت","700,000 ریال"],
  ["کارمزد خدمات ارزش افزوده برخط","90,000 ریال"]
].map(([label,result],i)=>({year:"1405",label,value:String(i+1),result:[`نتیجه\n${result}`]}));

const CompleteOfficeView=({data})=>{
  const items=[...(data?.items||[]),...OFFICE_1405_ITEMS],years=[...new Set(items.map(x=>String(x.year)))].sort((a,b)=>Number(a)-Number(b));
  const [year,setYear]=React.useState(years[years.length-1]||"1404"),[service,setService]=React.useState("1"),[quantity,setQuantity]=React.useState(""),[minutes,setMinutes]=React.useState(""),[baseAmount,setBaseAmount]=React.useState("");
  const services=items.filter(x=>String(x.year)===String(year)),selected=services.find(x=>String(x.value)===String(service))||services[0];
  const id=String(selected?.value||""),text=(selected?.result||[]).join(" "),numbers=(text.match(/[0-9][0-9,]*/g)||[]).map(x=>Number(x.replace(/,/g,""))).filter(Number.isFinite);
  const unitRate=numbers[numbers.length-1]||0,quantityIds=new Set(year==="1405"?["8","9"]:["7","8","9","11"]),minuteIds=new Set(["21","24"]),multiplier={"25":3,"28":.2,"30":.5}[id];
  const needsQuantity=quantityIds.has(id),needsMinutes=minuteIds.has(id),needsBase=Boolean(multiplier);
  const q=Math.floor(nval(quantity)),m=Math.max(0,nval(minutes)),base=nval(baseAmount),minuteEntry=year==="1403"?150000:year==="1405"?278000:200000,minuteRate=year==="1403"?25000:year==="1405"?47260:34000;
  let total=unitRate;if(needsQuantity)total=q>0?unitRate*q:0;if(needsMinutes)total=m>0?minuteEntry+minuteRate*m:0;if(needsBase)total=base>0?base*multiplier:0;
  const numeric=unitRate>0||needsMinutes||needsBase,ready=(!needsQuantity||q>0)&&(!needsMinutes||m>0)&&(!needsBase||base>0);
  React.useEffect(()=>{if(!services.some(x=>String(x.value)===String(service)))setService(String(services[0]?.value||"1"));},[year]);
  return <div className="calc-workspace"><div className="calc-form"><div className="calc-section-title">هزینه دفتر خدمات الکترونیک قضایی</div><div className="calc-fields two"><div className="field"><label>تعرفه سال</label><select value={year} onChange={e=>setYear(e.target.value)}>{years.map(y=><option key={y}>{y}</option>)}</select></div><div className="field"><label>موضوع خدمت</label><select value={String(selected?.value||"")} onChange={e=>setService(e.target.value)}>{services.map(x=><option value={String(x.value)} key={x.value}>{x.label}</option>)}</select></div></div>
    {needsQuantity&&<div className="field"><label>تعداد {(year==="1405"&&id==="8")||(year!=="1405"&&id==="7")?"نفر":"صفحه یا برگ"}</label><NumericInput value={quantity} onValue={setQuantity}/></div>}
    {needsMinutes&&<div className="field"><label>مدت جلسه یا ملاقات (دقیقه)</label><NumericInput value={minutes} onValue={setMinutes}/></div>}
    {needsBase&&<div className="field"><label>تعرفه خدمت مبنا (ریال)</label><NumericInput value={baseAmount} onValue={setBaseAmount}/></div>}
    <div className="calc-hint">تعرفه انتخاب‌شده بدون حدس از جدول سال مربوط خوانده می‌شود؛ خدمات صفحه‌ای، دقیقه‌ای و درصدی با ورودی واقعی محاسبه می‌شوند.</div>
  </div><div className="calc-result legal-result"><div className="l">هزینه خدمت</div>{numeric?<><div className="n">{ready?moneyFa(total):"—"} <small>{ready?"ریال":""}</small></div>{ready&&<div className="breakdown">{needsQuantity&&<><div className="li"><span>نرخ هر واحد</span><b>{moneyFa(unitRate)} ریال</b></div><div className="li"><span>تعداد</span><b>{q.toLocaleString("fa-IR")}</b></div></>}{needsMinutes&&<><div className="li"><span>ورودی ثابت</span><b>{moneyFa(minuteEntry)} ریال</b></div><div className="li"><span>هزینه هر دقیقه</span><b>{moneyFa(minuteRate)} ریال</b></div></>}{needsBase&&<><div className="li"><span>تعرفه مبنا</span><b>{moneyFa(base)} ریال</b></div><div className="li"><span>ضریب خدمت</span><b>{multiplier.toLocaleString("fa-IR",{style:"percent"})}</b></div></>}</div>}</>:<div className="n">طبق اعلام مرجع خدمت</div>}
    <div className="legal-output">{text}</div><div className="legal-output">مبنای مبلغ: ردیف «{selected?.label||"خدمت انتخابی"}» در جدول تعرفه خدمات دفاتر خدمات الکترونیک قضایی سال {year} استخراج‌شده از پنل مرجع.</div><div className="legal-output">مبنای حقوقی فعالیت دفاتر: آیین‌نامه اجرایی دفاتر و کانون خدمات الکترونیک قضایی مصوب ۱۴۰۱/۰۵/۲۳؛ از جمله معافیت اشخاص موضوع ماده ۱۴. مبلغ نهایی صورتحساب دفتر باید با ابلاغیه همان سال کنترل شود.</div>
  </div></div>;
};

const CompletePropertyExpertView=()=>{
  const [kind,setKind]=React.useState("building"),[area,setArea]=React.useState(""),[annualIncrease,setAnnualIncrease]=React.useState("");const a=nval(area);
  const excessHectares=Math.max(0,Math.ceil((a-10000)/10000));
  const baseFee=kind==="land"?Math.min(8000000,1000000*(1+excessHectares*.15)):a<=200?600000:a<=500?800000:a<=1000?1000000:Math.min(18000000,1000000+(a-1000)*800);
  const increasePercent=nval(annualIncrease),fee=baseFee*(1+increasePercent/100),adjusted=increasePercent>0;
  return <div className="calc-workspace"><div className="calc-form"><div className="calc-section-title">کارشناسی قانون تعیین تکلیف املاک فاقد سند رسمی</div><div className="field"><label>نوع ملک</label><select value={kind} onChange={e=>setKind(e.target.value)}><option value="building">ساختمان و تأسیسات تجاری و اداری</option><option value="land">زمین کشاورزی و نسق زراعی</option></select></div><div className="field"><label>مساحت (مترمربع)</label><NumericInput value={area} onValue={setArea} placeholder="مساحت را وارد کنید"/></div><div className="field"><label>درصد افزایش تجمیعی ابلاغی پس از اصلاحیه ۱۴۰۰ (اختیاری)</label><NumericInput value={annualIncrease} onValue={setAnnualIncrease} decimal placeholder="برای مثال ۱۲۰"/></div><div className="calc-hint">مبالغ پایه اصلاحیه ۱۴۰۰: ساختمان ۶۰۰ هزار، ۸۰۰ هزار و یک میلیون ریال تا ۱۰۰۰ متر و سپس متری ۸۰۰ ریال تا سقف ۱۸ میلیون ریال؛ زمین تا یک هکتار یک میلیون ریال و برای هر هکتار مازاد ۱۵٪ بیشتر، تا سقف ۸ میلیون ریال.</div></div><div className="calc-result legal-result"><div className="l">{adjusted?"دستمزد با افزایش ابلاغی":"دستمزد پایه اصلاحیه ۱۴۰۰"}</div><div className="n">{a?moneyFa(fee):"—"} <small>{a?"ریال":""}</small></div>{a>0&&<div className="breakdown"><div className="li"><span>مساحت</span><b>{a.toLocaleString("fa-IR")} مترمربع</b></div>{kind==="land"&&<div className="li"><span>هکتار مازاد محاسبه‌شده</span><b>{excessHectares.toLocaleString("fa-IR")}</b></div>}<div className="li"><span>مبلغ پایه اصلاحیه ۱۴۰۰</span><b>{moneyFa(baseFee)} ریال</b></div>{adjusted&&<div className="li"><span>افزایش تجمیعی واردشده</span><b>{increasePercent.toLocaleString("fa-IR",{maximumFractionDigits:3})}٪</b></div>}<div className="li"><span>معادل تومان</span><b>{moneyFa(fee/10)} تومان</b></div></div>}<div className="legal-output">مستند: بندهای الف و ب ماده ۱۷ آیین‌نامه اجرایی قانون تعیین تکلیف وضعیت ثبتی اراضی و ساختمان‌های فاقد سند رسمی، اصلاحی ۱۴۰۰/۰۵/۲۳.</div><div className="legal-output">تبصره ۳ ماده ۲۰ افزایش سالانه متناسب با نرخ رسمی تورم توسط سازمان ثبت را مقرر کرده است؛ تا وقتی درصد تجمیعی ابلاغی وارد نشود، خروجی صرفاً مبلغ پایه اصلاحیه ۱۴۰۰ است و مبلغ روز تلقی نمی‌شود.</div></div></div>;
};

const CompleteArbitrationView=()=>{
  const [kind,setKind]=React.useState("financial"),[amount,setAmount]=React.useState(""),[arbitrators,setArbitrators]=React.useState("1");
  const a=nval(amount),count=Math.max(1,Math.floor(nval(arbitrators)||1));
  const fee=Math.min(1500000000,Math.min(a,10000000000)*.02+Math.min(Math.max(a-10000000000,0),40000000000)*.01+Math.min(Math.max(a-50000000000,0),50000000000)*.005+Math.max(a-100000000000,0)*.0025);
  return <div className="calc-workspace"><div className="calc-form"><div className="calc-section-title">حق‌الزحمه داوری</div><div className="field"><label>نوع خواسته</label><select value={kind} onChange={e=>setKind(e.target.value)}><option value="financial">مالی</option><option value="nonfinancial">غیرمالی یا غیرقابل تقویم</option></select></div>{kind==="financial"&&<div className="field"><label>مبلغ خواسته (ریال)</label><NumericInput value={amount} onValue={setAmount}/></div>}<div className="field"><label>تعداد داوران</label><NumericInput value={arbitrators} onValue={setArbitrators} placeholder="تعداد داوران"/></div><div className="calc-hint">در نبود توافق جداگانه، تعرفه آیین‌نامه مصوب ۱۴۰۱ اعمال می‌شود و در تعدد داوران مبلغ کل به تساوی تقسیم می‌گردد.</div></div><div className="calc-result legal-result"><div className="l">حق‌الزحمه کل داوری</div>{kind==="financial"?<><div className="n">{a?moneyFa(fee):"—"} <small>{a?"ریال":""}</small></div>{a>0&&<div className="breakdown"><div className="li"><span>سهم هر داور</span><b>{moneyFa(fee/count)} ریال</b></div><div className="li"><span>سقف قانونی</span><b>۱٬۵۰۰٬۰۰۰٬۰۰۰ ریال</b></div></div>}</>:<><div className="n">۵٬۰۰۰٬۰۰۰ تا ۳۰٬۰۰۰٬۰۰۰ <small>ریال برای هر داور</small></div><div className="legal-output">مبلغ دقیق با توجه به پیچیدگی موضوع و میزان تلاش داور تعیین می‌شود.</div></>}<div className="legal-output">مستند: ماده ۲ و تبصره‌های آن از آیین‌نامه حق‌الزحمه داوری مصوب ۱۴۰۱/۰۶/۰۵، موضوع ماده ۴۹۸ قانون آیین دادرسی مدنی.</div></div></div>;
};

const CompleteCourtView=({data})=>{
  const types=data?.types||[],[type,setType]=React.useState("1"),[subtype,setSubtype]=React.useState("1"),[amount,setAmount]=React.useState(""),[coins,setCoins]=React.useState(""),[coinPrice,setCoinPrice]=React.useState("");
  const selectedType=types.find(x=>x.value===type)||types[0],cases=selectedType?.cases||[],selectedCase=cases.find(x=>x.value===subtype)||cases[0],a=nval(amount);
  const financial=type==="1",coinMahr=type==="4",claimValue=financial?a:coinMahr?nval(coins)*nval(coinPrice):0,calculated=financial||coinMahr;
  const firstInstanceRate=claimValue<=200000000?.025:.035;
  const fees=calculated?[["مرحله بدوی",claimValue*firstInstanceRate],["واخواهی",claimValue*.045],["تجدیدنظر",claimValue*.045],["اعاده دادرسی",claimValue*.055],["فرجام‌خواهی",claimValue*.055],["اعتراض ثالث",claimValue*.055]]:[];
  return <div className="calc-workspace"><div className="calc-form"><div className="calc-section-title">هزینه دادرسی و خدمات قضایی</div><div className="field"><label>نوع دعوا یا خدمت</label><select value={type} onChange={e=>{setType(e.target.value);setSubtype("1");setAmount("");setCoins("");setCoinPrice("");}}>{types.map(x=><option value={x.value} key={x.value}>{x.label}</option>)}</select></div>{cases.length>1&&<div className="field"><label>عنوان دقیق</label><select value={selectedCase?.value||"1"} onChange={e=>setSubtype(e.target.value)}>{cases.map((x,i)=><option value={x.value||String(i+1)} key={x.value||i}>{x.label||"حالت عمومی"}</option>)}</select></div>}{financial&&<div className="field"><label>بهای خواسته یا محکوم‌به (ریال)</label><NumericInput value={amount} onValue={setAmount}/></div>}{coinMahr&&<div className="calc-fields two"><div className="field"><label>تعداد سکه</label><NumericInput value={coins} onValue={setCoins} placeholder="تعداد را وارد کنید"/></div><div className="field"><label>قیمت روز هر سکه (ریال)</label><NumericInput value={coinPrice} onValue={setCoinPrice}/></div></div>}<div className="calc-hint">بدوی تا ۲۰۰ میلیون ریال ۲٫۵٪ و بیش از آن ۳٫۵٪؛ واخواهی و تجدیدنظر ۴٫۵٪؛ فرجام، اعاده دادرسی و اعتراض ثالث ۵٫۵٪ است. در مهریه سکه، بهای خواسته از تعداد سکه × قیمت روز هر سکه به‌دست می‌آید.</div></div><div className="calc-result legal-result"><div className="l">هزینه‌های قابل محاسبه</div>{calculated?(claimValue>0?<><div className="breakdown">{coinMahr&&<div className="li"><span>بهای خواسته مهریه</span><b>{moneyFa(claimValue)} ریال</b></div>}{fees.map(([label,value])=><div className="li" key={label}><span>{label}</span><b>{moneyFa(value)} ریال</b></div>)}</div></>:<div className="n">—</div>):<>{(selectedCase?.result||[]).map((x,i)=><div className="legal-output" key={i}>{x}</div>)}</>}<div className="legal-output">مستند نرخ‌های مالی: جدول شماره ۱۶ قانون بودجه سال ۱۴۰۳ و اصلاحیه بخشنامه یکنواخت‌سازی اخذ هزینه دادرسی شماره ۹۰۰۰/۲۰۶۴۱/۱۰۰ مورخ ۱۳۹۵/۰۵/۱۲؛ ارجاع قانونی هزینه‌ها در مواد ۵۰۲ و ۵۰۳ قانون آیین دادرسی مدنی.</div>{!calculated&&<div className="legal-output">عنوان انتخابی: {selectedCase?.label||selectedType?.label}. مبالغ بالا عین ردیف‌های استخراج‌شده از جدول پنل مرجع هستند.</div>}</div></div>;
};

const EXPERT_GROUPS=[
  {id:"1",label:"ارزیابی و قیمت‌گذاری طبق ماده ۱۱",sections:[{id:"1",label:"ارزیابی",items:[{id:"1",label:"ارزیابی و قیمت‌گذاری",calc:"eval",input:"amount",article:"ماده ۱۱"}]}]},
  {id:"2",label:"تعیین اجاره‌بها و اجرت‌المثل",sections:[{id:"1",label:"اجاره‌بها",items:[{id:"1",label:"تعیین اجاره‌بهای ماهانه",calc:"rent",input:"amount",inputLabel:"اجاره‌بهای ماهانه (ریال)",article:"ماده ۱۳"}]}]},
  {id:"3",label:"مهندسی آب، فلزات و معادن",sections:[
    {id:"1",label:"مهندسی آب",items:[
      {id:"1",label:"اندازه‌گیری آب و حقابه‌ها",calc:"waterFlow",input:"quantity",inputLabel:"آبدهی (لیتر در ثانیه)",article:"ماده ۱۵"},
      {id:"2",label:"تعیین کیفیت شیمیایی و آلودگی آب",calc:"fixed",old:3000000,article:"ماده ۱۶"},
      {id:"3",label:"بررسی مشخصات سفره‌های سطحی و زیرزمینی",calc:"fixed",old:8000000,article:"ماده ۱۷"},
      {id:"4",label:"ارزیابی قنوات، چاه‌ها و شبکه‌های آب و فاضلاب",calc:"eval",input:"amount",article:"ماده ۱۸"},
      {id:"5",label:"بررسی کیفیت حفاری چاه، قنات و بهسازی چشمه",calc:"fixed",old:7000000,article:"ماده ۱۹"},
      {id:"6",label:"رسیدگی به حریم و بستر رودخانه، کانال و انهار",calc:"waterBoundary",input:"quantity",inputLabel:"طول مورد رسیدگی (کیلومتر)",variants:[{id:"narrow",label:"عرض بستر تا ۱۲ متر"},{id:"wide",label:"عرض بستر بیش از ۱۲ متر"}],article:"ماده ۲۰"},
      {id:"7",label:"رسیدگی به بار آلودگی پساب",calc:"fixed",old:5000000,article:"ماده ۲۱"},
      {id:"8",label:"تعیین میزان حقابه هر فرد",calc:"fixedCurrent",current:15000000,only1402:true,article:"تبصره الحاقی ماده ۱۸"},
      {id:"9",label:"تعیین قدمت منابع آبی",calc:"fixedCurrent",current:10000000,only1402:true,article:"تبصره الحاقی ماده ۱۸"}
    ]},
    {id:"2",label:"فلزات و معادن",items:[
      {id:"1",label:"ارزیابی فلزات",calc:"eval",input:"amount",article:"ماده ۲۲ بند ۱"},
      {id:"2",label:"تشخیص ملاک و مشخصات کیفی و عملکردی",calc:"range",oldMin:10000000,oldMax:25000000,article:"ماده ۲۲ بند ۱"},
      {id:"3",label:"ارزیابی ذخایر معدنی",calc:"mine",input:"amount",article:"ماده ۲۲ بند ۲"}
    ]}
  ]},
  {id:"4",label:"اموال منقول، آثار نفیس و لوازم",sections:[{id:"1",label:"اموال منقول",items:[
    {id:"1",label:"آثار هنری، اشیای نفیس و کتب خطی",calc:"eval",input:"amount",article:"ماده ۲۳"},
    {id:"2",label:"اشیای عتیقه و احجار کریمه",calc:"eval",input:"amount",article:"ماده ۲۳"},
    {id:"3",label:"ساعت و جواهرات",calc:"eval",input:"amount",article:"ماده ۲۳"},
    {id:"4",label:"فرش",calc:"eval",input:"amount",article:"ماده ۲۳"},
    {id:"5",label:"لوازم خانگی و اداری",calc:"evalMultiplier",multiplier:1.2,input:"amount",article:"ماده ۲۳"}
  ]}]},
  {id:"5",label:"امور پزشکی، دارویی و غذایی",sections:[{id:"1",label:"پزشکی و غذایی",items:[
    {id:"1",label:"کارشناسی پزشکی، دارویی، سم‌شناسی و مواد غذایی",calc:"range",oldMin:3000000,oldMax:30000000,article:"ماده ۲۴"},
    {id:"2",label:"ارزیابی پزشکی",calc:"eval",input:"amount",article:"ماده ۲۴"},
    {id:"3",label:"ارزیابی داروسازی و سم‌شناسی",calc:"eval",input:"amount",article:"ماده ۲۴"},
    {id:"4",label:"ارزیابی مواد غذایی و مسمومیت‌ها",calc:"eval",input:"amount",article:"ماده ۲۴"}
  ]}]},
  {id:"6",label:"حسابداری، بازرگانی، نفقه، بیمه و آمار",sections:[
    {id:"1",label:"حسابداری و حسابرسی",items:[
      {id:"1",label:"حسابرسی نسبت به جمع ارقام حساب‌ها",calc:"evalMultiplier",multiplier:1.5,input:"amount",article:"ماده ۲۵"},
      {id:"2",label:"ارزش سهام و سهم‌الشرکه",calc:"eval",input:"amount",article:"ماده ۲۶ بند ۱"},
      {id:"3",label:"رسیدگی به ترازنامه، سود و زیان و ورشکستگی",calc:"eval",input:"amount",article:"ماده ۲۶ بند ۲"},
      {id:"4",label:"تعیین قیمت تمام‌شده کالا",calc:"eval",input:"amount",article:"ماده ۲۶ بند ۳"}
    ]},
    {id:"2",label:"امور بازرگانی",items:[{id:"1",label:"ارزیابی بازرگانی",calc:"eval",input:"amount",article:"ماده ۲۷"},{id:"2",label:"سایر امور بازرگانی",calc:"range",oldMin:3000000,oldMax:40000000,article:"ماده ۲۷"}]},
    {id:"3",label:"تعیین نفقه",items:[{id:"1",label:"نفقه، اجرت‌المثل، نحله و مهرالمثل",calc:"support",input:"amount",article:"ماده ۲۸"}]},
    {id:"4",label:"سرمایه‌گذاری پولی، اعتباری و بیمه",items:[{id:"1",label:"ارزیابی",calc:"eval",input:"amount",article:"ماده ۲۹"},{id:"2",label:"سایر موارد",calc:"range",oldMin:3000000,oldMax:40000000,article:"ماده ۲۹"}]},
    {id:"5",label:"آمار",items:[{id:"1",label:"کارشناسی رشته آمار",calc:"range",oldMin:3000000,oldMax:20000000,article:"ماده ۳۰"}]}
  ]},
  {id:"7",label:"وسایط نقلیه و حمل‌ونقل",sections:[
    {id:"1",label:"وسایط نقلیه موتوری زمینی",items:[{id:"1",label:"رسیدگی به اصالت خودرو",calc:"fixed",old:2500000,article:"ماده ۳۱ بند ۱"},{id:"2",label:"رسیدگی به تصادفات",calc:"fixed",old:3000000,article:"ماده ۳۱ بند ۲"},{id:"3",label:"اظهارنظر فنی، تعیین تناژ و مدل",calc:"fixed",old:3000000,article:"ماده ۳۱ بند ۳"},{id:"4",label:"ارزیابی وسیله نقلیه زمینی",calc:"eval",input:"amount",article:"ماده ۳۱ بند ۴"}]},
    {id:"2",label:"دریایی، غواصی و حمل‌ونقل",items:[{id:"1",label:"دعاوی حمل‌ونقل و اسناد حمل",calc:"eval",input:"amount",article:"ماده ۳۲ بند ۱"},{id:"2",label:"تعیین ارزش وسیله نقلیه آبی",calc:"eval",input:"amount",article:"ماده ۳۲ بند ۲"},{id:"3",label:"تعیین علت تصادم دریایی یا آب‌های داخلی",calc:"collision",variants:[{id:"boat",label:"قایق تفریحی یا مسافربری در آب‌های داخلی"},{id:"under500",label:"شناور دریایی با ظرفیت کمتر از ۵۰۰ GT"},{id:"over500",label:"شناور دریایی با ظرفیت ۵۰۰ GT یا بیشتر"}],article:"ماده ۳۲ بند ۳"},{id:"4",label:"غواصی و عملیات زیرآبی",calc:"minimum",old:3000000,article:"ماده ۳۲ بند ۴ و ماده ۹"},{id:"5",label:"ارزیابی وسایط هوایی، ریلی و زمینی",calc:"eval",input:"amount",article:"تبصره ماده ۳۲"}]}
  ]},
  {id:"8",label:"راه، ساختمان، نقشه‌برداری و شهرسازی",sections:[
    {id:"1",label:"راه و ساختمان",items:[{id:"1",label:"ارزیابی اراضی غیرمزروعی، ابنیه و سرقفلی",calc:"eval",input:"amount",article:"ماده ۳۳"},{id:"2",label:"معماری داخلی و تزئینات",calc:"minimum",old:3000000,article:"مواد ۹ و ۳۳"},{id:"3",label:"تطبیق نقشه معماری یا سازه با بنا",calc:"areaRate",input:"quantity",inputLabel:"مساحت زیربنا (مترمربع)",oldRate:5000,oldMin:4000000,oldMax:40000000,article:"ماده ۳۴"},{id:"4",label:"تطبیق مشخصات قراردادی ساختمان با بنا",calc:"areaRate",input:"quantity",inputLabel:"مساحت زیربنا (مترمربع)",oldRate:10000,oldMin:4000000,oldMax:40000000,article:"ماده ۳۵"},{id:"5",label:"تهیه نقشه معماری کلی",calc:"areaRate",input:"quantity",inputLabel:"مساحت زیربنا (مترمربع)",oldRate:8000,oldMin:4000000,oldMax:60000000,article:"ماده ۳۶ بند ۱"},{id:"6",label:"تهیه نقشه سازه",calc:"areaRate",input:"quantity",inputLabel:"مساحت زیربنا (مترمربع)",oldRate:10000,oldMin:4000000,oldMax:80000000,article:"ماده ۳۶ بند ۲"},{id:"7",label:"گزارش فنی استحکام بنا",calc:"areaRate",input:"quantity",inputLabel:"مساحت زیربنا (مترمربع)",oldRate:8000,oldMin:4000000,oldMax:60000000,article:"ماده ۳۶ بند ۳"},{id:"8",label:"افراز املاک و تقسیم ترکه",calc:"evalMultiplier",multiplier:1.2,input:"amount",article:"ماده ۳۷"},{id:"9",label:"تشخیص زمین مسبوق به احیا",calc:"revivedLand",input:"quantity",inputLabel:"مساحت (مترمربع)",article:"ماده ۳۸"}]},
    {id:"2",label:"نقشه‌برداری و امور ثبتی",items:[{id:"1",label:"پیاده‌کردن محدوده پلاک در نقشه و عکس هوایی",calc:"surveyParcel",input:"quantity",inputLabel:"مساحت (مترمربع)",geoPoints:true,variants:[{id:"known",label:"گذربند مشخص است"},{id:"unknown",label:"گذربند مشخص نیست"}],article:"ماده ۳۹"},{id:"2",label:"نقشه‌برداری اراضی و تهیه پروفیل",calc:"surveyUnknown",input:"quantity",inputLabel:"مساحت (مترمربع)",article:"ماده ۴۰"},{id:"3",label:"مطالعه پرونده ثبتی و تعیین محل پلاک",calc:"registrationFile",input:"quantity",inputLabel:"مساحت (مترمربع)",outsideBoundary:true,article:"ماده ۴۱"},{id:"4",label:"تشخیص حدود ثبتی و رسیدگی به اختلاف املاک",calc:"registrationBoundary",input:"quantity",inputLabel:"مساحت (مترمربع)",aerialMap:true,article:"ماده ۴۳"},{id:"5",label:"نقشه موقعیت قنوات، انهار و رودخانه‌ها",calc:"minimum",old:5000000,article:"ماده ۴۲ و ماده ۹"}]},
    {id:"3",label:"شهرسازی",items:[{id:"1",label:"انطباق طرح تفکیک اراضی شهری",calc:"city",input:"quantity",inputLabel:"تعداد قطعات",cityKind:"split",article:"ماده ۴۴ بند ۱"},{id:"2",label:"انطباق کاربری اراضی با طرح توسعه شهری",calc:"city",input:"quantity",inputLabel:"تعداد قطعات مجاور",cityKind:"use",article:"ماده ۴۴ بند ۲"},{id:"3",label:"انطباق شهری ساختمان با ضوابط شهرسازی",calc:"city",input:"quantity",inputLabel:"تعداد واحدها",cityKind:"building",article:"ماده ۴۴ بند ۳"}]},
    {id:"4",label:"سایر رشته‌های گروه",items:[{id:"1",label:"سایر موارد تخصصی گروه",calc:"minimum",old:3000000,article:"تبصره ماده ۴۴ و ماده ۹"}]}
  ]},
  {id:"9",label:"صنعت، فناوری و رایانه",sections:[{id:"1",label:"صنعت و فن",items:[{id:"1",label:"کارشناسی نرم‌افزار رایانه",calc:"evalMultiplier",multiplier:1.5,input:"amount",article:"تبصره ۲ ماده ۴۵"},{id:"2",label:"مشخصات فنی، استهلاک و عمر مفید ماشین‌آلات",calc:"evalMultiplier",multiplier:.4,input:"amount",article:"تبصره ۱ ماده ۴۵"},{id:"3",label:"کارشناسی و ارزیابی سایر رشته‌های گروه",calc:"eval",input:"amount",article:"ماده ۴۵"},{id:"4",label:"اصالت اسناد دیجیتال و امنیت شبکه",calc:"minimum",old:5000000,only1402:true,article:"تبصره ۳ ماده ۴۵"}]}]},
  {id:"10",label:"فنون هنری، خط، امضا، فیلم و ورزش",sections:[{id:"1",label:"فنون هنری",items:[{id:"1",label:"پرونده مالی رشته‌های هنری",calc:"evalCap",oldCap:50000000,input:"amount",article:"تبصره ماده ۴۶"},{id:"2",label:"اصالت خط، امضا و اثر انگشت در پرونده غیرمالی",calc:"range",oldMin:4000000,oldMax:30000000,article:"ماده ۴۶"},{id:"3",label:"مسائل فنی عکس و فیلم",calc:"range",oldMin:4000000,oldMax:40000000,article:"ماده ۴۷ بند الف"},{id:"4",label:"برنامه کوتاه یا مستند و انیمیشن",calc:"minimum",old:5000000,article:"ماده ۴۷ بند ب جزء ۱"},{id:"5",label:"برنامه بلندمدت سینمایی بیش از یک ساعت",calc:"maximum",oldMax:40000000,article:"ماده ۴۷ بند ب جزء ۲"},{id:"6",label:"ارزیابی فیلم و تجهیزات عکاسی و سینما",calc:"eval",input:"amount",article:"ماده ۴۷ بند پ"},{id:"7",label:"آزمایشگاه، مونتاژ و دستگاه نمایش",calc:"minimum",old:3000000,article:"ماده ۴۷ بند ت و ماده ۹"},{id:"8",label:"امور ورزشی بدون جرح یا فوت",calc:"fixed",old:5000000,article:"ماده ۴۷ بند ث"},{id:"9",label:"امور ورزشی همراه جرح یا فوت",calc:"maximum",oldMax:40000000,article:"ماده ۴۷ بند ث"},{id:"10",label:"چاپ و چاپخانه ـ پرونده غیرمالی",calc:"range",oldMin:4000000,oldMax:30000000,article:"ماده ۴۷ بند ج"},{id:"11",label:"چاپ و چاپخانه ـ اختلاف مالی",calc:"minimum",old:3000000,article:"ماده ۴۷ بند ج و ماده ۹"},{id:"12",label:"طراحی و گرافیک ـ بررسی غیرمالی",calc:"minimum",old:4000000,article:"ماده ۴۷ بند چ"},{id:"13",label:"طراحی و گرافیک ـ پرونده مالی",calc:"eval",input:"amount",article:"ماده ۴۷ بند چ و ماده ۱۱"},{id:"14",label:"طراحی و گرافیک ـ سایر موارد",calc:"minimum",old:3000000,article:"ماده ۴۷ بند چ و ماده ۹"}]}]},
  {id:"11",label:"کشاورزی و منابع طبیعی",sections:[{id:"1",label:"کشاورزی و منابع طبیعی",items:[{id:"1",label:"ارزیابی رشته‌های کشاورزی و منابع طبیعی",calc:"eval",input:"amount",article:"ماده ۴۸"},{id:"2",label:"حق ریشه، نسق زارعانه، آبادانی و حق غارسی",calc:"eval",input:"amount",article:"ماده ۴۹"},{id:"3",label:"نمونه‌برداری و تعیین کیفیت محصولات",calc:"minimum",old:3000000,article:"مواد ۹ و ۵۰"},{id:"4",label:"تشخیص اراضی دایر، بایر، موات و منابع ملی",calc:"agriLand",input:"quantity",inputLabel:"مساحت (مترمربع)",article:"ماده ۵۱"},{id:"5",label:"افراز املاک کشاورزی",calc:"evalMultiplier",multiplier:1.2,input:"amount",article:"ماده ۵۲"},{id:"6",label:"ارزیابی تجهیزات و محصولات کشاورزی در انبار",calc:"eval",input:"amount",article:"ماده ۵۳"}]}]},
  {id:"12",label:"خدمات اداری و عمومی",sections:[{id:"1",label:"خدمات اداری و عمومی",items:[{id:"1",label:"کارشناسی عمومی اداری، آموزشی، گمرکی و ثبت شرکت‌ها",calc:"minimum",old:4000000,article:"ماده ۵۴"},{id:"2",label:"ارزیابی و تعیین خسارت",calc:"eval",input:"amount",article:"ماده ۵۴"}]}]},
  {id:"13",label:"ایمنی و حوادث",sections:[{id:"1",label:"ایمنی و حوادث",items:[{id:"1",label:"آتش‌سوزی، اسلحه، امنیت، حوادث کار و مواد منفجره",calc:"minimum",old:5000000,article:"ماده ۵۵ و ماده ۹"}]}]},
  {id:"14",label:"بیو و نانوتکنولوژی",sections:[{id:"1",label:"بیو و نانوتکنولوژی",items:[{id:"1",label:"کارشناسی بیو و نانوتکنولوژی",calc:"minimum",old:3000000,article:"تبصره گروه ۱۲ و ماده ۹"}]}]},
  {id:"15",label:"اختلاف کارفرما، پیمانکار و کنترل صورت‌وضعیت",sections:[{id:"1",label:"قرارداد",items:[{id:"1",label:"کل قرارداد و صورت‌وضعیت",calc:"evalMultiplier",multiplier:2,input:"amount",article:"تبصره ۳ ماده ۱۱"}]}]},
  {id:"16",label:"تعیین سبب، علت و میزان خسارت",sections:[{id:"1",label:"خسارت",items:[{id:"1",label:"تعیین سبب، علت و خسارت",calc:"evalMultiplier",multiplier:1.5,input:"amount",article:"تبصره ۴ ماده ۱۱"}]}]},
  {id:"17",label:"تخلف یا تأخیر در بخشی از قرارداد",sections:[{id:"1",label:"قرارداد",items:[{id:"1",label:"بررسی بخشی از قرارداد",calc:"evalMultiplier",multiplier:1.5,input:"amount",article:"تبصره ۳ ماده ۱۱"}]}]},
  {id:"18",label:"قطعات یدکی، کالای مستعمل و ضایعات",sections:[{id:"1",label:"قطعات و کالا",items:[{id:"1",label:"ارزیابی مستقل قطعات، کالا و ضایعات",calc:"evalMultiplier",multiplier:1.5,input:"amount",article:"تبصره ۵ ماده ۱۱"}]}]}
];

const CompleteExpertView=()=>{
  const [year,setYear]=React.useState("1402"),[type,setType]=React.useState("1"),[sectionId,setSectionId]=React.useState("1"),[itemId,setItemId]=React.useState("1");
  const [amount,setAmount]=React.useState(""),[quantity,setQuantity]=React.useState(""),[variant,setVariant]=React.useState(""),[underground,setUnderground]=React.useState(false),[team,setTeam]=React.useState(false),[pastRent,setPastRent]=React.useState(false);
  const [geoPoints,setGeoPoints]=React.useState(""),[outsidePercent,setOutsidePercent]=React.useState(""),[aerialMap,setAerialMap]=React.useState(false);
  const group=EXPERT_GROUPS.find(x=>x.id===type)||EXPERT_GROUPS[0],sections=group.sections||[],section=sections.find(x=>x.id===sectionId)||sections[0],items=(section?.items||[]).filter(x=>!x.only1402||year==="1402"),rule=items.find(x=>x.id===itemId)||items[0];
  const resetExtras=()=>{setGeoPoints("");setOutsidePercent("");setAerialMap(false);};
  const resetDetail=()=>{setSectionId("1");setItemId("1");setAmount("");setQuantity("");setVariant("");setUnderground(false);setPastRent(false);resetExtras();};
  const evaluation1398=(v)=>{const tiers=[[150000000,.005],[250000000,.004],[1000000000,.003],[10000000000,.00125],[150000000000,.0006],[500000000000,.0003],[650000000000,.00025],[1000000000000,.00015],[3000000000000,.00012]];let fee=3000000,prev=50000000;for(const [limit,rate] of tiers){if(v>prev)fee+=Math.min(v-prev,limit-prev)*rate;prev=limit;}if(v>prev)fee+=(v-prev)*.0001;return fee;};
  const evaluation1402=(v)=>{const tiers=[[1000000000,.0045],[5000000000,.003],[30000000000,.0015],[150000000000,.0009],[500000000000,.0007],[1000000000000,.0003],[2000000000000,.00022],[4000000000000,.00018],[50000000000000,.00012]];let fee=6000000,prev=250000000;for(const [limit,rate] of tiers){if(v>prev)fee+=Math.min(v-prev,limit-prev)*rate;prev=limit;}return fee;};
  const a=nval(amount),q=nval(quantity),points=Math.floor(nval(geoPoints)),outside=Math.min(20,nval(outsidePercent)),legalCap=year==="1402"?1180000000:590000000,evalFee=(v)=>year==="1402"?evaluation1402(v):evaluation1398(v),twice=(v)=>year==="1402"?v*2:v;
  const range=(min,max)=>({kind:"range",min:team?min*.7:min,max:team?max*.7:max});
  const amountResult=(value,base)=>({kind:"amount",value:Math.min(legalCap,team?value*.7:value),base:base==null?base:Math.min(legalCap,base)});
  const minResult=(value)=>({kind:"minimum",min:team?value*.7:value});
  const maxResult=(value)=>({kind:"maximum",max:team?value*.7:value});
  const calc=()=>{
    if(!rule)return {kind:"empty"};
    const effectiveInput=rule.calc==="support"&&year==="1398"?null:rule.input;
    const need=effectiveInput==="amount"?a:effectiveInput==="quantity"?q:1;if(effectiveInput&&!need)return {kind:"empty"};
    const base=evalFee(a),v=variant||(rule.variants?.[0]?.id||"");
    if(rule.calc==="eval")return amountResult(base,base);
    if(rule.calc==="evalMultiplier")return amountResult(base*rule.multiplier,base);
    if(rule.calc==="evalCap")return amountResult(Math.min(twice(rule.oldCap),base),base);
    if(rule.calc==="mine")return amountResult(base*(underground?1.35:1),base);
    if(rule.calc==="fixed")return amountResult(twice(rule.old));
    if(rule.calc==="fixedCurrent")return amountResult(rule.current);
    if(rule.calc==="range")return range(twice(rule.oldMin),twice(rule.oldMax));
    if(rule.calc==="minimum")return minResult(twice(rule.old));
    if(rule.calc==="maximum")return maxResult(twice(rule.oldMax));
    if(rule.calc==="rent"){
      const fee=year==="1402"?Math.min(600000000,6000000+Math.max(0,Math.min(a,50000000)-15000000)*.2+Math.max(0,Math.min(a,100000000)-50000000)*.1+Math.max(0,a-100000000)*.04):Math.min(300000000,(3000000+Math.max(0,Math.min(a,30000000)-4000000)*.1+Math.max(0,a-30000000)*.02)*(pastRent?1.25:1));
      return amountResult(fee);
    }
    if(rule.calc==="support")return year==="1402"?amountResult(base,base):range(4000000,30000000);
    if(rule.calc==="waterFlow"){const k=year==="1402"?2:1,fee=Math.min(35000000*k,3000000*k+Math.max(0,Math.min(q,1000)-50)*2000*k+Math.max(0,q-1000)*800*k);return amountResult(fee);}
    if(rule.calc==="waterBoundary"){const k=year==="1402"?2:1,fee=v==="wide"?Math.min(50000000*k,q*4000000*k):Math.min(30000000*k,Math.max(3000000*k,q*3000000*k));return amountResult(fee);}
    if(rule.calc==="collision"){const old={boat:5000000,under500:10000000,over500:20000000}[v]||5000000;return amountResult(twice(old));}
    if(rule.calc==="areaRate")return amountResult(Math.min(twice(rule.oldMax),Math.max(twice(rule.oldMin),q*twice(rule.oldRate))));
    if(rule.calc==="revivedLand"){const k=year==="1402"?2:1;return amountResult(3000000*k+Math.max(0,q-1000)/1000*1000000*k);}
    if(rule.calc==="surveyParcel"||rule.calc==="surveyUnknown"){const k=year==="1402"?2:1,isUnknown=rule.calc==="surveyUnknown"||v==="unknown",initial=(isUnknown?10000000:4000000)*k,cap=(isUnknown?100000000:80000000)*k,fee=initial+Math.max(0,Math.min(q,100000)-1000)*400*k+Math.max(0,q-100000)*200*k,pointFee=year==="1402"&&rule.geoPoints?points*1000000:0;return amountResult(Math.min(cap,fee)+pointFee);}
    if(rule.calc==="registrationFile"){const k=year==="1402"?2:1,fee=3000000*k+Math.max(0,Math.min(q,5000)-1000)*1500*k+Math.max(0,Math.min(q,50000)-5000)*800*k+Math.max(0,q-50000)*400*k,baseFee=Math.min(60000000*k,fee),outsideFee=year==="1402"&&rule.outsideBoundary?(baseFee-3000000*k)*outside/100:0;return amountResult(baseFee+outsideFee);}
    if(rule.calc==="registrationBoundary"){const k=year==="1402"?2:1,fee=4000000*k*(1+Math.max(0,q-10000)/10000*.2),mapFee=year==="1402"&&rule.aerialMap&&aerialMap?10000000:0;return amountResult(Math.min(20000000*k,fee)+mapFee);}
    if(rule.calc==="city"){const n=Math.max(1,q),k=year==="1402"?1:.5,base=(rule.cityKind==="split"?30000000:20000000)*k,mid=(rule.cityKind==="split"?4000000:3000000)*k,high=1200000*k;return amountResult(base+Math.max(0,Math.min(n,10)-2)*mid+Math.max(0,n-10)*high);}
    if(rule.calc==="agriLand"){const base=year==="1402"?8000000:4000000,upper=year==="1402"?.05:.03,fee=base*(1+Math.max(0,Math.min(q,10000)-1000)/1000*.1+Math.max(0,q-10000)/1000*upper);return amountResult(fee);}
    return {kind:"empty"};
  };
  const result=calc(),ready=result.kind!=="empty",highCouncil=year==="1402"&&a>=50000000000000&&["eval","evalMultiplier","evalCap","mine","support"].includes(rule?.calc),variantValue=variant||(rule?.variants?.[0]?.id||"");
  const resultTitle=result.kind==="range"?`${moneyFa(result.min)} تا ${moneyFa(result.max)}`:result.kind==="minimum"?`حداقل ${moneyFa(result.min)}`:result.kind==="maximum"?`حداکثر ${moneyFa(result.max)}`:ready?moneyFa(result.value):"—";
  const legalExplanation=()=>{
    if(!ready)return "";
    if(rule.calc==="eval")return `${rule.article}: دستمزد این ارزیابی مستقیماً از پلکان ارزش موضوع در ماده ۱۱ محاسبه می‌شود.`;
    if(rule.calc==="evalMultiplier"||rule.calc==="mine")return `${rule.article}: ابتدا دستمزد پایه ماده ۱۱ محاسبه و سپس ضریب اختصاصی این موضوع اعمال می‌شود.`;
    if(rule.calc==="evalCap")return `${rule.article}: دستمزد طبق ماده ۱۱ محاسبه می‌شود، اما سقف اختصاصی این ردیف نیز باید رعایت شود.`;
    if(rule.calc==="range")return `${rule.article}: تعرفه برای این موضوع حداقل و حداکثر تعیین کرده و انتخاب مبلغ داخل بازه را به کمیت و کیفیت کار و نظر مرجع ارجاع‌کننده سپرده است.`;
    if(rule.calc==="minimum")return `${rule.article}: مبلغ نمایش‌داده‌شده حداقل تعرفه است و تعیین مبلغ بالاتر تابع ماده ۹ و تأیید مرجع ارجاع‌کننده است.`;
    if(rule.calc==="maximum")return `${rule.article}: تعرفه فقط سقف مبلغ را تعیین کرده و مبلغ دقیق تا این سقف با توجه به مدت، کمیت و کیفیت کار و نظر مرجع ارجاع‌کننده مشخص می‌شود.`;
    if(rule.calc==="rent")return `${rule.article}: حق‌الزحمه از اجاره‌بهای ماهانه هر واحد یا مجموعه مستقل و طبق طبقات درصدی تعرفه محاسبه می‌شود.`;
    if(rule.calc==="waterFlow")return `${rule.article}: تا ۵۰ لیتر در ثانیه مبلغ مقطوع و برای مازاد، نرخ پلکانی تا سقف قانونی اعمال می‌شود.`;
    if(rule.calc==="waterBoundary")return `${rule.article}: نرخ هر کیلومتر بر اساس عرض بستر تا ۱۲ متر یا بیش از ۱۲ متر، با حداقل و حداکثر اختصاصی محاسبه می‌شود.`;
    if(rule.calc==="collision")return `${rule.article}: مبلغ ثابت بر اساس نوع و ظرفیت شناور درگیر در تصادم تعیین می‌شود.`;
    if(["areaRate","revivedLand","surveyParcel","surveyUnknown","registrationFile","registrationBoundary","city","agriLand"].includes(rule.calc))return `${rule.article}: مقدار واردشده در نرخ، کف، سقف و پله‌های مساحت یا تعداد مقرر در همین ماده اعمال شده است.`;
    if(rule.calc==="support")return `${rule.article}: ${year==="1402"?"اصلاحیه ۱۴۰۲ این ردیف را تابع پلکان ماده ۱۱ کرده است.":"متن مصوب ۱۳۹۸ برای این ردیف بازه حداقل و حداکثر مقرر کرده است."}`;
    return `${rule.article}: نتیجه بر اساس مبلغ یا ضابطه صریح همین ماده محاسبه شده است.`;
  };
  return <div className="calc-workspace"><div className="calc-form"><div className="calc-section-title">دستمزد جامع کارشناسی رسمی دادگستری</div>
    <div className="calc-fields two"><div className="field"><label>آیین‌نامه</label><select value={year} onChange={e=>{setYear(e.target.value);setItemId("1");setAmount("");setQuantity("");resetExtras();}}><option value="1398">مصوب ۱۳۹۸</option><option value="1402">اصلاحیه ۱۴۰۲</option></select></div><div className="field"><label>گروه کارشناسی</label><select value={type} onChange={e=>{setType(e.target.value);resetDetail();}}>{EXPERT_GROUPS.map(x=><option value={x.id} key={x.id}>{x.label}</option>)}</select></div></div>
    {sections.length>1&&<div className="field"><label>رشته کارشناسی</label><select value={section?.id||"1"} onChange={e=>{setSectionId(e.target.value);setItemId("1");setAmount("");setQuantity("");setVariant("");resetExtras();}}>{sections.map(x=><option value={x.id} key={x.id}>{x.label}</option>)}</select></div>}
    {items.length>1&&<div className="field"><label>موضوع دقیق کارشناسی</label><select value={rule?.id||"1"} onChange={e=>{setItemId(e.target.value);setAmount("");setQuantity("");setVariant("");setUnderground(false);resetExtras();}}>{items.map(x=><option value={x.id} key={x.id}>{x.label}</option>)}</select></div>}
    {rule?.variants&&<div className="field"><label>حالت محاسبه</label><select value={variantValue} onChange={e=>setVariant(e.target.value)}>{rule.variants.map(x=><option value={x.id} key={x.id}>{x.label}</option>)}</select></div>}
    {rule?.input==="amount"&&!(rule.calc==="support"&&year==="1398")&&<div className="field"><label>{rule.inputLabel||"ارزش یا مبلغ مبنای کارشناسی (ریال)"}</label><NumericInput value={amount} onValue={setAmount}/></div>}
    {rule?.input==="quantity"&&<div className="field"><label>{rule.inputLabel||"مقدار"}</label><NumericInput value={quantity} onValue={setQuantity} decimal/></div>}
    {rule?.geoPoints&&year==="1402"&&<div className="field"><label>تعداد نقاط مشخصات جغرافیایی</label><NumericInput value={geoPoints} onValue={setGeoPoints} placeholder="تعداد نقاط را وارد کنید"/></div>}
    {rule?.outsideBoundary&&year==="1402"&&<div className="field"><label>درصد افزایش پلاک خارج از محدوده (حداکثر ۲۰٪)</label><NumericInput value={outsidePercent} onValue={setOutsidePercent} decimal placeholder="درصد را وارد کنید"/></div>}
    {rule?.aerialMap&&year==="1402"&&<label className="calc-check"><input type="checkbox" checked={aerialMap} onChange={e=>setAerialMap(e.target.checked)}/> انجام کارشناسی با استفاده از نقشه هوایی؛ ۱۰٬۰۰۰٬۰۰۰ ریال افزوده</label>}
    {rule?.calc==="mine"&&<label className="calc-check"><input type="checkbox" checked={underground} onChange={e=>setUnderground(e.target.checked)}/> معدن زیرزمینی؛ ۳۵٪ افزایش تعرفه</label>}
    {rule?.calc==="rent"&&year==="1398"&&<label className="calc-check"><input type="checkbox" checked={pastRent} onChange={e=>setPastRent(e.target.checked)}/> اجرت‌المثل یا اجور گذشته؛ ۲۵٪ افزایش مطابق متن ۱۳۹۸</label>}
    <label className="calc-check"><input type="checkbox" checked={team} onChange={e=>setTeam(e.target.checked)}/> هیأت چندنفره از یک رشته؛ کسر ۳۰٪ از سهم هر کارشناس</label>
    <div className="calc-hint">گزینه‌ها بر پایه ساختار کامل پنل مرجع و مواد اختصاصی ۱۵ تا ۵۵ تعرفه تفکیک شده‌اند. در مواردی که مبلغ با نظر مقام ارجاع‌کننده تعیین می‌شود، بازه یا حداقل قانونی نمایش داده می‌شود و عدد قطعی ساخته نمی‌شود.</div>
  </div><div className="calc-result legal-result"><div className="l">دستمزد کارشناسی</div><div className="n">{resultTitle} <small>{ready?"ریال":""}</small></div>
    {ready&&<div className="breakdown">{(rule?.input==="amount"&&a>0)&&<div className="li"><span>مبلغ مبنا</span><b>{moneyFa(a)} ریال</b></div>}{(rule?.input==="quantity"&&q>0)&&<div className="li"><span>مقدار مبنا</span><b>{q.toLocaleString("fa-IR")}</b></div>}{rule?.geoPoints&&points>0&&<div className="li"><span>نقاط مشخصات جغرافیایی</span><b>{points.toLocaleString("fa-IR")} نقطه × ۱٬۰۰۰٬۰۰۰ ریال</b></div>}{rule?.outsideBoundary&&outside>0&&<div className="li"><span>افزایش پلاک خارج از محدوده</span><b>{outside.toLocaleString("fa-IR")}٪ از مبلغ مازاد</b></div>}{rule?.aerialMap&&aerialMap&&<div className="li"><span>افزوده نقشه هوایی</span><b>۱۰٬۰۰۰٬۰۰۰ ریال</b></div>}{result.base&&<div className="li"><span>دستمزد پایه ماده ۱۱</span><b>{moneyFa(result.base)} ریال</b></div>}{team&&<div className="li"><span>کسر هیأت هم‌رشته</span><b>۳۰٪</b></div>}<div className="li"><span>مستند محاسبه</span><b>{rule?.article}</b></div></div>}
    {result.kind==="range"&&<div className="legal-output">مبلغ دقیق داخل این بازه با توجه به اهمیت، حساسیت، پیچیدگی، کمیت و کیفیت کار و موافقت مرجع ارجاع‌کننده تعیین می‌شود.</div>}
    {result.kind==="minimum"&&<div className="legal-output">این مبلغ حداقل قانونی است؛ مازاد آن طبق ماده ۹ با پیشنهاد کارشناس و تأیید مقام ارجاع‌کننده تعیین می‌شود.</div>}
    {result.kind==="maximum"&&<div className="legal-output">این مبلغ سقف قانونی است؛ مبلغ دقیق تا این سقف با توجه به مدت، کمیت و کیفیت کار و نظر مرجع ارجاع‌کننده تعیین می‌شود.</div>}
    {ready&&<div className="legal-output"><b>خلاصه حکم قانونی:</b> {legalExplanation()}</div>}
    {highCouncil&&<div className="legal-output">هشدار تبصره ۱ ماده ۱۱: چون ارزش موضوع ۵۰٬۰۰۰ میلیارد ریال یا بیشتر است، انتخاب هیأت، میزان دستمزد و روش پرداخت باید حسب مورد توسط شورای عالی کارشناسان یا مرکز تعیین شود؛ عدد بالا فقط محاسبه پلکان است و مبلغ قطعی نیست.</div>}
    {ready&&<div className="legal-output">مستند کل: تعرفه دستمزد کارشناسان رسمی دادگستری مصوب ۱۳۹۸/۱۲/۲۵ با اصلاحات ۱۴۰۲/۰۸/۲۰؛ {rule?.article}.</div>}
  </div></div>;
};

const CompleteMahrView=()=>{
  const [table,setTable]=React.useState(null),[mode,setMode]=React.useState("cash"),[marriage,setMarriage]=React.useState("1390"),[receive,setReceive]=React.useState("1405"),[dead,setDead]=React.useState(false),[amount,setAmount]=React.useState(""),[coins,setCoins]=React.useState(""),[coinPrice,setCoinPrice]=React.useState("");
  React.useEffect(()=>{fetch("legal-data/mahr-annual-ratios.json?v=31.18").then(r=>r.json()).then(setTable);},[]);
  if(!table)return <div className="calc-empty">در حال بارگذاری جدول شاخص مهریه…</div>;
  const ratios=table.ratioTo1404||{},indexYears=Object.keys(ratios).sort((a,b)=>Number(a)-Number(b)),lastIndexYear=indexYears.at(-1);
  const receiveYears=dead?indexYears:[...indexYears.slice(1),String(Number(lastIndexYear)+1)];
  const targetYear=dead?receive:String(Number(receive)-1),factor=(ratios[marriage]&&ratios[targetYear])?ratios[marriage]/ratios[targetYear]:0;
  const validDates=Number(marriage)<=Number(targetYear),cashReady=nval(amount)>0&&factor>0&&validDates,coinReady=nval(coins)>0&&nval(coinPrice)>0,ready=mode==="coin"?coinReady:cashReady;
  const value=mode==="coin"?nval(coins)*nval(coinPrice):nval(amount)*factor;
  const toggleDead=(checked)=>{setDead(checked);if(checked&&!ratios[receive])setReceive(lastIndexYear);};
  return <div className="calc-workspace"><div className="calc-form"><div className="calc-section-title">مهریه به نرخ روز</div><div className="field"><label>روش محاسبه</label><select value={mode} onChange={e=>setMode(e.target.value)}><option value="cash">بر اساس ارزش پول</option><option value="coin">بر اساس قیمت سکه</option></select></div>{mode==="cash"?<><div className="calc-fields two"><div className="field"><label>سال عقد</label><select value={marriage} onChange={e=>setMarriage(e.target.value)}>{indexYears.map(y=><option key={y}>{y}</option>)}</select></div><div className="field"><label>{dead?"سال فوت همسر":"سال اخذ مهریه"}</label><select value={receive} onChange={e=>setReceive(e.target.value)}>{receiveYears.map(y=><option key={y}>{y}</option>)}</select></div></div><div className="field"><label>مبلغ مندرج در عقدنامه (ریال)</label><NumericInput value={amount} onValue={setAmount}/></div><label className="calc-check"><input type="checkbox" checked={dead} onChange={e=>toggleDead(e.target.checked)}/> محاسبه مهریه از ترکه همسر متوفی</label>{!validDates&&<div className="legal-output">سال شاخص پرداخت نمی‌تواند پیش از سال وقوع عقد باشد.</div>}</>:<div className="calc-fields two"><div className="field"><label>تعداد سکه</label><NumericInput value={coins} onValue={setCoins}/></div><div className="field"><label>قیمت روز هر سکه (ریال)</label><NumericInput value={coinPrice} onValue={setCoinPrice}/></div></div>}<div className="calc-hint">مطابق ماده ۱۰۸۲ قانون مدنی و مواد ۲ و ۳ آیین‌نامه اجرایی آن؛ در مطالبه عادی متوسط شاخص سال قبل از پرداخت و در فوت زوج شاخص سال فوت ملاک است. پوشش شاخص سالانه: ۱۳۱۵ تا ۱۴۰۴.</div></div><div className="calc-result legal-result"><div className="l">ارزش مهریه</div><div className="n">{ready?moneyFa(value):"—"} <small>{ready?"ریال":""}</small></div>{mode==="cash"&&cashReady&&<div className="breakdown"><div className="li"><span>سال شاخص پرداخت</span><b>{targetYear}</b></div><div className="li"><span>نسبت شاخص</span><b>{factor.toLocaleString("fa-IR",{maximumFractionDigits:9})}</b></div><div className="li"><span>مبلغ مندرج در عقدنامه</span><b>{moneyFa(nval(amount))} ریال</b></div></div>}<div className="legal-output">فرمول مهریه وجه رایج: مبلغ مندرج در عقدنامه × متوسط شاخص سال هدف ÷ متوسط شاخص سال عقد.</div></div></div>;
};

const CompleteInheritanceView=()=>{
  const [estate,setEstate]=React.useState(""),[spouse,setSpouse]=React.useState("2"),[sons,setSons]=React.useState(""),[daughters,setDaughters]=React.useState(""),[father,setFather]=React.useState(false),[mother,setMother]=React.useState(false);
  const total=nval(estate),s=Math.floor(nval(sons)),d=Math.floor(nval(daughters)),hasChildren=s+d>0;let shares=[];let spouseRate=spouse==="1"?(hasChildren?1/4:1/2):spouse==="2"?(hasChildren?1/8:1/4):0;
  if(spouseRate)shares.push([spouse==="1"?"سهم زوج":"سهم زوجه",total*spouseRate]);let used=spouseRate;
  if(hasChildren){if(father){shares.push(["سهم پدر",total/6]);used+=1/6;}if(mother){shares.push(["سهم مادر",total/6]);used+=1/6;}const rem=Math.max(0,total*(1-used));const units=s*2+d;if(s)shares.push(["سهم هر پسر",rem*2/units]);if(d)shares.push(["سهم هر دختر",rem/units]);}
  else {const rem=total*(1-used);if(father&&mother){shares.push(["سهم مادر",total/3]);shares.push(["سهم پدر",Math.max(0,rem-total/3)]);}else if(father)shares.push(["سهم پدر",rem]);else if(mother)shares.push(["سهم مادر",rem]);else if(spouse==="1")shares[0][1]=total;else if(spouse==="2")shares.push(["باقیمانده بلاوارث (ماده ۸۶۶)",total*(1-spouseRate)]);}
  return <div className="calc-workspace"><div className="calc-form"><div className="calc-section-title">محاسبه سهم‌الارث طبقه اول</div><div className="field"><label>وضعیت متوفی</label><select value={spouse} onChange={e=>setSpouse(e.target.value)}><option value="1">شوهر دارد</option><option value="2">زن دارد</option><option value="3">مجرد است</option></select></div><div className="calc-fields two"><div className="field"><label>تعداد فرزند پسر</label><NumericInput value={sons} onValue={setSons}/></div><div className="field"><label>تعداد فرزند دختر</label><NumericInput value={daughters} onValue={setDaughters}/></div></div><div className="calc-fields two"><label className="calc-check"><input type="checkbox" checked={father} onChange={e=>setFather(e.target.checked)}/> پدر</label><label className="calc-check"><input type="checkbox" checked={mother} onChange={e=>setMother(e.target.checked)}/> مادر</label></div><div className="field"><label>خالص ترکه پس از دیون و وصایا (ریال)</label><NumericInput value={estate} onValue={setEstate}/></div><div className="calc-hint">پیش از تقسیم، هزینه کفن‌ودفن، دیون، مهریه و وصیت معتبر تا ثلث باید از ترکه کسر شود.</div></div><div className="calc-result legal-result"><div className="l">تقسیم ترکه</div><div className="n">{total?moneyFa(total):"—"} <small>{total?"ریال":""}</small></div>{total>0&&<div className="breakdown">{shares.map(([label,value])=><div className="li" key={label}><span>{label}</span><b>{moneyFa(value)} ریال</b></div>)}</div>}<div className="legal-output">مستند: مواد ۸۶۱، ۸۶۲، ۸۶۶، ۹۰۶ تا ۹۱۵ و ۹۴۰ تا ۹۴۹ قانون مدنی.</div></div></div>;
};

const CompleteAttorneyView=()=>{
  const [subject,setSubject]=React.useState("fee"),[caseType,setCaseType]=React.useState("financial"),[amount,setAmount]=React.useState(""),[basis,setBasis]=React.useState("tariff"),[contractKind,setContractKind]=React.useState("legal"),[outcome,setOutcome]=React.useState("0"),[certificate,setCertificate]=React.useState("2"),[accept,setAccept]=React.useState(false),[appointed,setAppointed]=React.useState(false),[inside,setInside]=React.useState(""),[outside,setOutside]=React.useState(""),[familyTitle,setFamilyTitle]=React.useState("1"),[tariffLevel,setTariffLevel]=React.useState("1"),[criminalCourt,setCriminalCourt]=React.useState("1"),[criminalGrade,setCriminalGrade]=React.useState("1"),[extraCharges,setExtraCharges]=React.useState(""),[finalFirstInstance,setFinalFirstInstance]=React.useState(false),[otherType,setOtherType]=React.useState("1");
  const a=nval(amount);
  const progressiveFinancialFee=Math.min(a,500000000)*.08+Math.min(Math.max(a-500000000,0),1500000000)*.07+Math.min(Math.max(a-2000000000,0),8000000000)*.05+Math.min(Math.max(a-10000000000,0),20000000000)*.04+Math.max(a-30000000000,0)*.03;
  const financialFee=finalFirstInstance?a*.10:progressiveFinancialFee;
  const familyRanges={"1":[5000000,200000000],"2":[4000000,300000000]};
  const criminalRanges={"1":{"1":[50000000,2000000000],"2":[30000000,1000000000],"3":[10000000,500000000]},"2":{"1":[10000000,500000000],"2":[5000000,300000000],"3":[2000000,200000000]},"3":{"1":[1000000,150000000]},"4":{"1":[2000000,200000000]},"5":{"1":[50000000,500000000]}};
  const otherRanges={"1":[0,20000000],"2":[4000000,500000000],"3":[4000000,200000000],"4":[1000000,100000000],"6":[4000000,150000000],"7":[10000000,250000000]};
  const rangeValue=(range)=>range?.[tariffLevel==="2"?1:0]||0;
  let base=financialFee,minBase=financialFee;
  if(caseType==="family"){const r=familyRanges[familyTitle];base=rangeValue(r);minBase=r?.[0]||0;}
  if(caseType==="criminal"){const r=criminalRanges[criminalCourt]?.[criminalGrade]||criminalRanges[criminalCourt]?.["1"];base=rangeValue(r);minBase=r?.[0]||0;}
  if(caseType==="other"){const r=otherRanges[otherType];base=otherType==="5"?(tariffLevel==="2"?Math.max(4000000,a*.02):4000000):rangeValue(r);minBase=otherType==="5"?4000000:(r?.[0]||0);}
  const outcomeFactors={"0":1,"1":.15,"2":.30,"3":.10,"4":.20,"5":1,"6":1,"7":1};
  const addedCharges=caseType==="criminal"?Math.max(0,Math.floor(nval(extraCharges))):0;
  let fee=base*(1+addedCharges*.2)*(outcomeFactors[outcome]??1);if(certificate==="1")fee*=1.1;if(accept)fee*=.5;if(appointed)fee=minBase*2;
  const mission=nval(inside)*1500000+nval(outside)*3000000;
  const stampBase=basis==="contract"?a:fee;
  const stampRate=subject==="barstamp"?.0875:subject==="centerstamp"?.01:0;
  const result=subject==="fee"?fee+mission:stampBase*stampRate;
  const tariffNeeded=caseType!=="financial";
  const amountNeeded=caseType==="financial"||(caseType==="other"&&otherType==="5")||(subject!=="fee"&&basis==="contract"),resultReady=!amountNeeded||a>0;
  const criminalGrades=criminalCourt==="1"?[["1","سلب حیات، قطع عضو، حبس ابد یا تعزیری درجه یک"],["2","تعزیری درجه ۲ و ۳"],["3","سایر جرایم"]]:criminalCourt==="2"?[["1","حدود، دیات و تعزیری درجه ۴ و ۵"],["2","تعزیری درجه ۶"],["3","سایر جرایم"]]:[["1",criminalCourt==="3"?"اعتراض به قرار دادسرا":criminalCourt==="4"?"فرجام‌خواهی، اعاده دادرسی یا ماده ۴۷۷":"دعاوی ویژه وکلای تبصره ماده ۴۸ آیین دادرسی کیفری"]];
  const stageRows=caseType==="financial"&&finalFirstInstance?[["مرحله بدوی قطعی (۱۰۰٪)",fee]]:caseType==="criminal"&&outcome==="0"?[["تحقیقات دادسرا (۵۰٪)",fee*.5],["دادگاه بدوی (۳۰٪)",fee*.3],["تجدیدنظر (۲۰٪)",fee*.2]]:[["مرحله بدوی (۶۰٪)",fee*.6],["تجدیدنظر (۴۰٪)",fee*.4]];
  const contractStageRows=contractKind==="criminal"?[["تحقیقات دادسرا (۵۰٪)",a*.5],["دادگاه بدوی (۳۰٪)",a*.3],["تجدیدنظر (۲۰٪)",a*.2]]:[["مرحله بدوی (۶۰٪)",a*.6],["تجدیدنظر (۴۰٪)",a*.4]];
  const stampStageRows=(basis==="contract"?contractStageRows:stageRows).map(([label,value])=>[label,value*stampRate]);
  const article=caseType==="financial"?"ماده ۹":caseType==="family"?"ماده ۱۳":caseType==="criminal"?"ماده ۱۴ و تبصره‌های آن":otherType==="4"?"بند ج ماده ۱۲":otherType==="1"?"ماده ۱۹":otherType==="2"||otherType==="3"?"ماده ۲۰":otherType==="5"||otherType==="6"?"ماده ۲۵":"ماده ۲۸";
  return <div className="calc-workspace"><div className="calc-form"><div className="calc-section-title">حق‌الوکاله و تمبر مالیاتی وکیل</div>
    <div className="field"><label>موضوع</label><select value={subject} onChange={e=>setSubject(e.target.value)}><option value="fee">حق‌الوکاله</option><option value="barstamp">تمبر مالیاتی کانون وکلای دادگستری</option><option value="centerstamp">تمبر مالیاتی مرکز وکلا، کارشناسان رسمی و مشاوران خانواده قوه قضاییه</option></select></div>
    {subject!=="fee"&&<div className="field"><label>محاسبه بر اساس</label><select value={basis} onChange={e=>setBasis(e.target.value)}><option value="tariff">تعرفه قانونی</option><option value="contract">مبلغ حق‌الوکاله قراردادی</option></select></div>}
    {subject!=="fee"&&basis==="contract"&&<div className="field"><label>نوع پرونده قراردادی</label><select value={contractKind} onChange={e=>setContractKind(e.target.value)}><option value="legal">حقوقی و سایر دعاوی</option><option value="criminal">کیفری</option></select></div>}
    {(subject==="fee"||basis==="tariff")&&<><div className="field"><label>نوع دعوا</label><select value={caseType} onChange={e=>setCaseType(e.target.value)}><option value="financial">مالی</option><option value="family">امور حسبی، خانوادگی و غیرمالی</option><option value="criminal">کیفری</option><option value="other">سایر</option></select></div>
    {caseType==="financial"&&<label className="calc-check"><input type="checkbox" checked={finalFirstInstance} onChange={e=>setFinalFirstInstance(e.target.checked)}/> حکم دادگاه بدوی از حیث بهای خواسته قطعی است؛ تعرفه ۱۰٪</label>}
    {caseType==="family"&&<div className="field"><label>عنوان دعوا</label><select value={familyTitle} onChange={e=>setFamilyTitle(e.target.value)}><option value="1">دعاوی خانوادگی، مالی ناشی از زوجیت و امور حسبی</option><option value="2">دعاوی غیرمالی یا بدون لزوم تعیین بهای خواسته</option></select></div>}
    {caseType==="criminal"&&<><div className="field"><label>مرجع و نوع رسیدگی کیفری</label><select value={criminalCourt} onChange={e=>{setCriminalCourt(e.target.value);setCriminalGrade("1");}}><option value="1">کیفری یک، نظامی یک و دادگاه انقلاب</option><option value="2">کیفری دو، نظامی دو و اطفال و نوجوانان</option><option value="3">اعتراض به قرارهای قابل اعتراض دادسرا</option><option value="4">فرجام‌خواهی کیفری، اعاده دادرسی و ماده ۴۷۷</option><option value="5">دعاوی ویژه وکلای تبصره ماده ۴۸ آیین دادرسی کیفری</option></select></div><div className="field"><label>عنوان مجازات یا درخواست</label><select value={criminalGrade} onChange={e=>setCriminalGrade(e.target.value)}>{criminalGrades.map(([v,l])=><option value={v} key={v}>{l}</option>)}</select></div><div className="field"><label>تعداد اتهام‌های اضافی غیر از جرم اشد</label><NumericInput value={extraCharges} onValue={setExtraCharges} placeholder="در صورت وجود وارد کنید"/></div></>}
    {caseType==="other"&&<div className="field"><label>نوع مرجع یا خدمت</label><select value={otherType} onChange={e=>setOtherType(e.target.value)}><option value="1">دادسرا و دادگاه عالی انتظامی قضات و سایر مراجع انتظامی</option><option value="2">دیوان عدالت اداری و سازمان تعزیرات حکومتی</option><option value="3">مراجع غیرقضایی مانند هیأت‌های قانون کار</option><option value="4">اعتراض به قرارهای حقوقی قابل اعتراض</option><option value="5">امور اجرایی دادگستری و اجرای اسناد رسمی</option><option value="6">سایر امور اجرایی</option><option value="7">سایر موارد تعیین‌تکلیف‌نشده در آیین‌نامه</option></select></div>}
    {tariffNeeded&&<div className="field"><label>میزان تعرفه</label><select value={tariffLevel} onChange={e=>setTariffLevel(e.target.value)}><option value="1">حداقل تعرفه</option><option value="2">حداکثر تعرفه</option></select></div>}</>}
    {amountNeeded&&<div className="field"><label>{subject!=="fee"&&basis==="contract"?"مبلغ حق‌الوکاله قراردادی (ریال)":caseType==="other"?"مبلغ محکوم‌به یا مورد اجرا (ریال)":"بهای خواسته یا محکوم‌به (ریال)"}</label><NumericInput value={amount} onValue={setAmount}/></div>}
    {(subject==="fee"||basis==="tariff")&&<><div className="field"><label>نتیجه ختم دعوا</label><select value={outcome} onChange={e=>setOutcome(e.target.value)}><option value="0">بدون حالت خاص</option><option value="1">ابطال دادخواست پیش از دفاع</option><option value="2">رد دادخواست پس از دفاع</option><option value="3">سقوط دعوای تجدیدنظر پیش از دفاع</option><option value="4">سقوط دعوای تجدیدنظر پس از دفاع</option><option value="5">رد یا عدم استماع به علت مرور زمان</option><option value="6">رد تقاضای اعاده دادرسی</option><option value="7">رد به علت اعتبار امر مختومه</option></select></div><div className="field"><label>گواهی وکالت تخصصی</label><select value={certificate} onChange={e=>setCertificate(e.target.value)}><option value="1">دارای گواهی تخصصی مرتبط (۱۰٪ افزوده)</option><option value="2">بدون گواهی تخصصی</option></select></div><div className="calc-fields two"><div className="field"><label>روز مأموریت داخل استان</label><NumericInput value={inside} onValue={setInside}/></div><div className="field"><label>روز مأموریت خارج استان</label><NumericInput value={outside} onValue={setOutside}/></div></div><label className="calc-check"><input type="checkbox" checked={accept} onChange={e=>setAccept(e.target.checked)}/> قبول وکالت پس از نقض رأی (نصف تعرفه)</label><label className="calc-check"><input type="checkbox" checked={appointed} onChange={e=>setAppointed(e.target.checked)}/> وکیل تسخیری یا معاضدتی (دو برابر حداقل تعرفه)</label></>}
  </div><div className="calc-result legal-result"><div className="l">{subject==="fee"?"حق‌الوکاله قابل محاسبه":subject==="barstamp"?"جمع تمبر، سهم صندوق و کانون":"سهم مرکز وکلا"}</div><div className="n">{(amountNeeded&&!a)||(subject!=="fee"&&basis==="contract"&&!a)?"—":moneyFa(result)} <small>{((amountNeeded&&a)||(subject==="fee"&&!amountNeeded)||(subject!=="fee"&&basis==="tariff"))?"ریال":""}</small></div>
    {subject==="fee"&&resultReady&&<div className="breakdown">{addedCharges>0&&<div className="li"><span>افزایش اتهام‌های اضافی</span><b>{(addedCharges*20).toLocaleString("fa-IR")}٪</b></div>}{stageRows.map(([label,value])=><div className="li" key={label}><span>{label}</span><b>{moneyFa(value)} ریال</b></div>)}<div className="li"><span>هزینه مأموریت</span><b>{moneyFa(mission)} ریال</b></div></div>}
    {subject!=="fee"&&resultReady&&<div className="breakdown"><div className="li"><span>{basis==="contract"?"حق‌الوکاله قراردادی":"حق‌الوکاله طبق تعرفه"}</span><b>{moneyFa(stampBase)} ریال</b></div><div className="li"><span>{subject==="barstamp"?"نرخ تجمیعی تمبر، صندوق و کانون":"نرخ سهم مرکز وکلا"}</span><b>{(stampRate*100).toLocaleString("fa-IR",{maximumFractionDigits:2})}٪</b></div>{stampStageRows.map(([label,value])=><div className="li" key={label}><span>{label}</span><b>{moneyFa(value)} ریال</b></div>)}</div>}
    <div className="legal-output">مستند محاسبه تعرفه: {article} آیین‌نامه تعرفه حق‌الوکاله مصوب ۱۳۹۸{caseType!=="criminal"&&"؛ تقسیم مراحل طبق ماده ۲۱"}{appointed&&"؛ حق‌الوکاله تسخیری یا معاضدتی طبق ماده ۸ دقیقاً دو برابر حداقل تعرفه است"}. {subject==="barstamp"&&"خروجی کانون، جمع کسورات قابل پرداخت شامل تمبر مالیاتی موضوع ماده ۱۰۳ قانون مالیات‌های مستقیم و سهم صندوق و کانون است."}{subject==="centerstamp"&&"خروجی مرکز وکلا، سهم مرکز را مطابق روش محاسباتی پنل مرجع نشان می‌دهد؛ تمبر مالیاتی ماده ۱۰۳ در فرآیند مالیاتی وکیل جداگانه کنترل می‌شود."}</div>
  </div></div>;
};
