(function () {
  if (!window.React || !window.MODULES || !window.MODULES.aiChat) return;
  const React = window.React;
  const { useEffect, useMemo, useRef, useState } = React;
  const PreviousView = window.MODULES.aiChat.View;

  const CASES = [
    { id: "partnership", title: "قرارداد مشارکت", party: "آریا و توسعه سپهر", children: ["مرور و دسته‌بندی اسناد", "تحلیل ریسک قرارداد", "نسخه اصلاحی قرارداد"] },
    { id: "claim", title: "مطالبه وجه", party: "شرکت باران", children: ["کنترل مدارک و مستندات", "پیش‌نویس دادخواست"] },
    { id: "employment", title: "اختلاف کار و کارفرما", party: "پرونده داخلی شرکت", children: ["خط زمانی رویدادها", "لایحه دفاعیه"] }
  ];
  const HISTORY = [
    { id: "risk", caseId: "partnership", title: "تحلیل ریسک قرارداد", time: "امروز، ۱۰:۴۲", tools: ["case", "contracts", "risk"] },
    { id: "petition", caseId: "claim", title: "تنظیم دادخواست مطالبه وجه", time: "دیروز، ۱۸:۱۰", tools: ["case", "docs", "draft"] },
    { id: "deadline", caseId: "employment", title: "محاسبه مهلت اعتراض", time: "۲ روز پیش", tools: ["case", "clock", "research"] }
  ];
  const TOOLS = {
    case: ["مدیریت پرونده", "سوابق و وضعیت پرونده", "folder"],
    docs: ["اسناد حقوقی", "خواندن و مرتب‌سازی مدارک", "file"],
    contracts: ["قراردادها", "بررسی بندها و تعهدات", "contract"],
    risk: ["تحلیل ریسک", "شناسایی خطر و راه اصلاح", "shield"],
    draft: ["نگارش حقوقی", "ساخت و بازنویسی متن", "pen"],
    calc: ["محاسبات حقوقی", "مبالغ، خسارت و هزینه‌ها", "calc"],
    clock: ["تقویم حقوقی", "مهلت‌ها و زمان‌بندی", "clock"],
    research: ["پژوهش حقوقی", "قانون، رویه و استدلال", "book"]
  };
  const SUGGESTIONS = ["این قرارداد را از نظر ریسک بررسی کن", "برای این پرونده برنامه اقدام بساز", "اسناد را بخوان و نقاط ضعف را بگو", "یک پیش‌نویس دادخواست آماده کن"];
  const PATHS = {
    plus: "M12 5v14M5 12h14", folder: "M3 8h7l2-2h9v13H3z", message: "M4 5h16v12H8l-4 3z", arrow: "m9 18 6-6-6-6",
    scale: "M12 3v18M6 6h12M5 6l-3 6h6zM19 6l-3 6h6zM8 21h8", file: "M6 3h8l4 4v14H6zM14 3v5h5M9 12h6M9 16h6",
    contract: "M7 3h10v18H7zM10 8h4M10 12h4m-4 4 2 2 3-4", shield: "M12 3l8 3v5c0 5-3 8-8 10-5-2-8-5-8-10V6zM9 12l2 2 4-4",
    pen: "m4 20 4-1L19 8l-3-3L5 16zM14 7l3 3", calc: "M5 3h14v18H5zM8 7h8M8 12h2M14 12h2M8 16h2M14 16h2",
    clock: "M12 3a9 9 0 1 0 0 18 9 9 0 0 0 0-18zm0 4v5l3 2", book: "M4 4h11a3 3 0 0 1 3 3v13H7a3 3 0 0 1-3-3zM7 4v13a3 3 0 0 1-3 3M10 9h5M10 13h5",
    clip: "m20 12-8 8a5 5 0 0 1-7-7l9-9a3 3 0 0 1 5 5l-9 9a2 2 0 0 1-3-3l8-8", send: "M4 4l17 8-17 8 3-8zM7 12h14",
    stop: "M6 6h12v12H6z", check: "m5 12 4 4L19 6", activity: "M4 12h4l2-6 4 12 2-6h4", panel: "M3 4h18v16H3zM9 4v16",
    mic: "M12 3a3 3 0 0 0-3 3v6a3 3 0 0 0 6 0V6a3 3 0 0 0-3-3zM5 11a7 7 0 0 0 14 0M12 18v3M8 21h8", lock: "M6 10V7a6 6 0 0 1 12 0v3M5 10h14v11H5zM12 14v3", avatar: "M12 3a4 4 0 1 0 0 8 4 4 0 0 0 0-8zM5 21v-2a7 7 0 0 1 14 0v2M3 12v4M21 12v4", brain: "M9 4a3 3 0 0 0-5 2 3 3 0 0 0 0 5 3 3 0 0 0 2 5v1a3 3 0 0 0 5 2V5a2 2 0 0 0-2-1zM15 4a3 3 0 0 1 5 2 3 3 0 0 1 0 5 3 3 0 0 1-2 5v1a3 3 0 0 1-5 2V5a2 2 0 0 1 2-1z", close: "M6 6l12 12M18 6 6 18", brief: "M3 7h18v13H3zM8 7V4h8v3M3 12h18", output: "M5 4h10l4 4v12H5zM15 4v5h5M9 13h6M9 17h4"
  };
  function Icon({ name, size = 18 }) {
    return <svg width={size} height={size} viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.8" strokeLinecap="round" strokeLinejoin="round" aria-hidden="true"><path d={PATHS[name] || PATHS.activity} /></svg>;
  }
  function localEarth() {
    try { return ["127.0.0.1", "localhost", "::1"].includes(location.hostname) && new URLSearchParams(location.search).get("previewPlan") === "earth"; }
    catch (_) { return false; }
  }
  function paid(props) {
    if (localEarth()) return true;
    const raw = props.session || props.sessionState || (props.auth && props.auth.session) || window.__SHAHDAD_SESSION__;
    const session = raw && raw.state ? raw.state : raw;
    const sub = session && session.subscription;
    if (!session || !sub || session.authState !== "authenticated") return false;
    const id = sub.planId || sub.id || (sub.plan && sub.plan.id);
    return sub.status === "active" && id && id !== "pluto";
  }
  function welcome(caseTitle) {
    return { id: "welcome", role: "assistant", intro: true, text: `من فقط پاسخ نمی‌دهم. کار «${caseTitle}» را از بررسی اطلاعات تا ساخت خروجی جلو می‌برم؛ مدارک را پیدا می‌کنم، تحلیل را انجام می‌دهم و نتیجه قابل استفاده تحویل می‌دهم.` };
  }
  function chooseTools(text) {
    const list = ["case"], add = id => !list.includes(id) && list.push(id);
    if (/سند|مدرک|فایل|پیوست/.test(text)) add("docs");
    if (/قرارداد|بند|تعهد|توافق/.test(text)) { add("contracts"); add("risk"); }
    if (/ریسک|خطر|ضعف|ایراد/.test(text)) add("risk");
    if (/دادخواست|لایحه|اظهارنامه|پیش.?نویس|بازنویسی|تنظیم/.test(text)) add("draft");
    if (/محاسبه|خسارت|مبلغ|هزینه|دیه/.test(text)) add("calc");
    if (/مهلت|موعد|تاریخ/.test(text)) add("clock");
    if (list.length < 3) add("research");
    return list.slice(0, 4);
  }
  function workSteps(text) {
    const contract = /قرارداد|بند|تعهد|توافق/.test(text), draft = /دادخواست|لایحه|اظهارنامه/.test(text);
    return [
      ["شناخت درخواست و تعیین مسیر", "running"],
      ["بازیابی اسناد و سوابق پرونده", "pending"],
      [contract ? "بررسی بندها، تعهدات و ریسک‌ها" : draft ? "تطبیق ادعاها با مدارک" : "تحلیل حقوقی و تعیین اقدامات", "pending"],
      [contract ? "آماده‌سازی گزارش و نسخه اصلاحی" : draft ? "تنظیم و بازبینی پیش‌نویس" : "ساخت و بازبینی خروجی", "pending"]
    ];
  }
  function results(text) {
    if (/قرارداد|ریسک|بند/.test(text)) return [["گزارش ریسک قرارداد", "آماده بررسی", "risk"], ["نسخه اصلاحی پیشنهادی", "پیش‌نویس", "draft"]];
    if (/دادخواست|لایحه|اظهارنامه/.test(text)) return [["پیش‌نویس متن حقوقی", "آماده بررسی", "draft"], ["فهرست مستندات مورد نیاز", "تکمیل شود", "docmgmt"]];
    return [["جمع‌بندی وضعیت پرونده", "آماده بررسی", "case"], ["برنامه اقدام پیشنهادی", "پیش‌نویس", "clock"]];
  }
  function answer(text) {
    if (/قرارداد|ریسک|بند/.test(text)) return "بررسی اولیه انجام شد. تعهدات، نقاط ابهام و بندهای پرریسک را جدا کردم و برای هر مورد راه اصلاح گذاشتم. گزارش ریسک و نسخه اصلاحی پیشنهادی آماده بررسی است.";
    if (/دادخواست|لایحه|اظهارنامه/.test(text)) return "مدارک و ادعاهای اصلی کنار هم قرار گرفت و ساختار متن حقوقی آماده شد. پیش‌نویس و فهرست مستندات ناقص در خروجی‌ها قرار گرفته است.";
    return "درخواست به مراحل قابل اجرا تقسیم شد، سوابق پرونده مرور شد و نتیجه به دو خروجی عملی تبدیل شد. جمع‌بندی وضعیت و برنامه اقدام آماده بررسی است.";
  }

  function AgentWorkspace(props) {
    const [caseId, setCaseId] = useState(CASES[0].id), activeCase = useMemo(() => CASES.find(x => x.id === caseId) || CASES[0], [caseId]);
    const [thread, setThread] = useState("کار جدید"), [messages, setMessages] = useState([welcome(CASES[0].title)]), [input, setInput] = useState("");
    const [request, setRequest] = useState(""), [tools, setTools] = useState(["case", "research"]), [steps, setSteps] = useState([]), [outputs, setOutputs] = useState([]);
    const [status, setStatus] = useState("idle"), [panel, setPanel] = useState(null);
    const [modelDepth, setModelDepth] = useState("high"), [accessScope, setAccessScope] = useState("case"), [avatarOn, setAvatarOn] = useState(false), [listening, setListening] = useState(false), [files, setFiles] = useState([]);
    const timers = useRef([]), run = useRef(0), speechRef = useRef(null), spokenRef = useRef(null), fileRef = useRef(null);
    const clear = () => { timers.current.forEach(clearTimeout); timers.current = []; };
    useEffect(() => () => { clear(); run.current += 1; if (speechRef.current) speechRef.current.stop(); if (window.speechSynthesis) window.speechSynthesis.cancel(); }, []);
    useEffect(() => {
      if (!avatarOn || status !== "done" || !window.speechSynthesis) return;
      const last = messages[messages.length - 1];
      if (!last || last.role !== "assistant" || last.id === "welcome" || spokenRef.current === last.id) return;
      spokenRef.current = last.id;
      const utterance = new SpeechSynthesisUtterance(last.text);
      utterance.lang = "fa-IR";
      utterance.rate = 1;
      window.speechSynthesis.cancel();
      window.speechSynthesis.speak(utterance);
    }, [avatarOn, status, messages]);
    const reset = (item = activeCase) => { clear(); run.current += 1; setThread("کار جدید"); setMessages([welcome(item.title)]); setRequest(""); setTools(["case", "research"]); setSteps([]); setOutputs([]); setStatus("idle"); setPanel(null); };
    const selectCase = item => { setCaseId(item.id); reset(item); };
    const selectTask = (item, title) => { clear(); run.current += 1; setCaseId(item.id); setThread(title); setMessages([welcome(item.title), { id: Date.now(), role: "assistant", text: `کار «${title}» باز شد. ادامه یا تغییر موردنظرت را همین‌جا بگو.` }]); setSteps([]); setOutputs([]); setStatus("idle"); setPanel(null); };
    const history = item => { const c = CASES.find(x => x.id === item.caseId) || CASES[0]; setCaseId(c.id); setThread(item.title); setRequest(item.title); setTools(item.tools); setSteps(workSteps(item.title).map(x => [x[0], "done"])); setOutputs(results(item.title)); setStatus("done"); setMessages([{ id: "u" + item.id, role: "user", text: item.title }, { id: "a" + item.id, role: "assistant", text: answer(item.title), outputs: results(item.title) }]); setPanel(null); };
    const openModule = id => typeof props.onOpen === "function" && props.onOpen(id === "docs" ? "docmgmt" : id === "draft" ? "drafting" : id);
    const start = () => {
      const text = input.trim(); if (!text || status === "running") return;
      clear(); const id = ++run.current, next = workSteps(text), made = results(text);
      setMessages(old => [...old, { id: "u" + Date.now(), role: "user", text, attachments: files.map(file => file.name) }]); setInput(""); setFiles([]); setRequest(text); setThread(text.length > 42 ? text.slice(0, 42) + "..." : text); setTools(chooseTools(text)); setSteps(next); setOutputs([]); setStatus("running");
      for (let i = 1; i < next.length; i++) timers.current.push(setTimeout(() => { if (run.current === id) setSteps(old => old.map((x, n) => [x[0], n < i ? "done" : n === i ? "running" : "pending"])); }, i * 520));
      timers.current.push(setTimeout(() => { if (run.current !== id) return; setSteps(old => old.map(x => [x[0], "done"])); setOutputs(made); setStatus("done"); setMessages(old => [...old, { id: "a" + Date.now(), role: "assistant", text: answer(text), outputs: made }]); }, next.length * 560));
    };
    const stop = () => { if (status !== "running") return; clear(); run.current += 1; setStatus("paused"); setSteps(old => old.map(x => [x[0], x[1] === "running" ? "paused" : x[1]])); setMessages(old => [...old, { id: Date.now(), role: "assistant", text: "اجرای کار متوقف شد. نتیجه‌های تکمیل‌شده حفظ شده‌اند و می‌توانیم از همین نقطه ادامه دهیم." }]); };
    const toggleVoice = () => {
      const Recognition = window.SpeechRecognition || window.webkitSpeechRecognition;
      if (!Recognition) {
        setMessages(old => [...old, { id: "voice-error-" + Date.now(), role: "assistant", text: "ورودی صوتی در این مرورگر در دسترس نیست. می‌توانی درخواست را تایپ کنی." }]);
        return;
      }
      if (listening && speechRef.current) { speechRef.current.stop(); setListening(false); return; }
      const recognition = new Recognition();
      speechRef.current = recognition;
      recognition.lang = "fa-IR";
      recognition.continuous = false;
      recognition.interimResults = true;
      recognition.onresult = event => {
        let finalText = "";
        for (let i = event.resultIndex; i < event.results.length; i += 1) if (event.results[i].isFinal) finalText += event.results[i][0].transcript;
        if (finalText.trim()) setInput(old => (old.trim() ? old.trim() + " " : "") + finalText.trim());
      };
      recognition.onerror = () => setListening(false);
      recognition.onend = () => setListening(false);
      try { recognition.start(); setListening(true); } catch (_) { setListening(false); }
    };
    const label = status === "running" ? "در حال انجام" : status === "done" ? "آماده تحویل" : status === "paused" ? "متوقف شده" : "آماده";
    return <div className="legal-agent" dir="rtl"><div className="la-shell">
      {panel && <button className="la-scrim" aria-label="بستن پنل" onClick={() => setPanel(null)} />}
      <aside className={`la-left ${panel === "left" ? "open" : ""}`}>
        <header className="la-panel-head"><div><span className="la-head-icon"><Icon name="brief" /></span><span><b>فضای کار حقوقی</b><small>پرونده‌ها و گفتگوها</small></span></div><button className="la-mobile-close" onClick={() => setPanel(null)}><Icon name="close" /></button></header>
        <button className="la-new" onClick={() => reset()}><Icon name="plus" />کار حقوقی جدید</button>
        <section className="la-nav"><h3>پرونده‌های من <i>{CASES.length}</i></h3>{CASES.map(c => <div className={`la-case ${c.id === caseId ? "active" : ""}`} key={c.id}><button className="la-case-row" onClick={() => selectCase(c)}><span><Icon name="folder" /></span><span><b>{c.title}</b><small>{c.party}</small></span><Icon name="arrow" /></button>{c.id === caseId && <div className="la-children">{c.children.map(title => <button className={thread === title ? "active" : ""} key={title} onClick={() => selectTask(c, title)}><i />{title}</button>)}</div>}</div>)}</section>
        <section className="la-nav la-history"><h3>گفتگوهای اخیر</h3>{HISTORY.map(h => <button className="la-history-row" key={h.id} onClick={() => history(h)}><span><Icon name="message" /></span><span><b>{h.title}</b><small>{h.time}</small></span></button>)}</section>
      </aside>
      <main className="la-main">
        <header className="la-top"><div className="la-mobile-buttons"><button onClick={() => setPanel("left")}><Icon name="panel" /></button><button onClick={() => setPanel("right")}><Icon name="activity" /></button></div><nav><span>{activeCase.title}</span><Icon name="arrow" /><b>{thread}</b></nav><div className="la-plan"><i />پلن زمین</div></header>
        <section className="la-chat"><div className="la-intro"><small>دستیار اجرایی حقوقی</small><h1>{thread === "کار جدید" ? "چه کار حقوقی را پیش ببریم؟" : thread}</h1><p>درخواست را بگو؛ وکیل هوشمند مسیر را می‌چیند، امکانات لازم را به‌کار می‌گیرد و خروجی قابل استفاده تحویل می‌دهد.</p></div>
          <div className="la-messages" aria-live="polite">{messages.map(m => <article className={`la-msg ${m.role}`} key={m.id}>{m.role === "assistant" && <span className="la-avatar"><Icon name="scale" /></span>}<div><small>{m.role === "assistant" ? "وکیل هوشمند" : "شما"}</small><p>{m.text}</p>{m.attachments && m.attachments.length > 0 && <div className="la-msg-files">{m.attachments.map(name => <span key={name}><Icon name="file" />{name}</span>)}</div>}{m.intro && <section className="la-method"><span><b>۱</b>بررسی می‌کنم</span><span><b>۲</b>انجام می‌دهم</span><span><b>۳</b>تحویل می‌دهم</span></section>}{m.outputs && <div className="la-inline-output">{m.outputs.map((o, i) => <button key={i} onClick={() => openModule(o[2])}><Icon name="output" /><span><b>{o[0]}</b><small>{o[1]}</small></span><Icon name="arrow" /></button>)}</div>}</div></article>)}{status === "running" && <div className="la-working"><Icon name="activity" />در حال انجام مراحل کار...</div>}</div>
          {messages.length === 1 && status === "idle" && <div className="la-suggestions">{SUGGESTIONS.map(s => <button key={s} onClick={() => setInput(s)}>{s}<Icon name="arrow" /></button>)}</div>}
        </section>        <footer className="la-compose-wrap">
          <div className="la-compose">
            <input ref={fileRef} type="file" hidden multiple accept=".pdf,.doc,.docx,.txt,.jpg,.jpeg,.png" onChange={event => { setFiles(Array.from(event.target.files || []).slice(0, 4)); event.target.value = ""; }} />
            <label className="la-sr" htmlFor="lawyer-agent-input">درخواست حقوقی</label>
            <textarea id="lawyer-agent-input" rows="2" value={input} onChange={event => setInput(event.target.value)} onKeyDown={event => { if (event.key === "Enter" && !event.shiftKey && status !== "running") { event.preventDefault(); start(); } }} placeholder="کار را توضیح بده یا سند پرونده را اضافه کن..." />
            <div className="la-compose-actions">
              <div className="la-extra-cluster">
                <button type="button" className="la-upload" onClick={() => fileRef.current && fileRef.current.click()} aria-label="افزودن سند" title="افزودن سند"><Icon name="clip" />{files.length > 0 && <b>{files.length}</b>}</button>
                <label className="la-icon-select" title={"دسترسی: " + ({ ask: "هر بار بپرس", case: "پرونده جاری", workspace: "فضای کاری من" }[accessScope])}><Icon name="lock" /><select value={accessScope} onChange={event => setAccessScope(event.target.value)} aria-label="اجازه دسترسی"><option value="ask">هر بار بپرس</option><option value="case">پرونده جاری</option><option value="workspace">فضای کاری من</option></select></label>
                <label className="la-icon-select" title={"عمق تحلیل: " + ({ low: "پاسخ سریع", mid: "بررسی متعادل", high: "تحلیل دقیق", ultra: "تحلیل موشکافانه" }[modelDepth])}><Icon name="brain" /><select value={modelDepth} onChange={event => setModelDepth(event.target.value)} aria-label="انتخاب عمق تحلیل"><option value="low">پاسخ سریع</option><option value="mid">بررسی متعادل</option><option value="high">تحلیل دقیق</option><option value="ultra">تحلیل موشکافانه</option></select></label>
                <button type="button" className={`la-avatar-toggle ${avatarOn ? "active" : ""}`} onClick={() => setAvatarOn(value => !value)} aria-pressed={avatarOn} aria-label={avatarOn ? "خاموش کردن آواتار زنده" : "فعال کردن آواتار زنده"} title={avatarOn ? "آواتار زنده فعال" : "فعال‌سازی آواتار زنده"}><Icon name="avatar" /></button>
              </div>
              <div className="la-action-cluster">
                <button type="button" className={`la-voice ${listening ? "active" : ""}`} onClick={toggleVoice} aria-pressed={listening} aria-label={listening ? "توقف دریافت صدا" : "گفتن درخواست با صدا"} title="ورودی صوتی فارسی"><Icon name="mic" /></button>
                <button type="button" className={status === "running" ? "stop" : "send"} disabled={status !== "running" && !input.trim()} onClick={status === "running" ? stop : start} aria-label={status === "running" ? "توقف" : "شروع کار"} title={status === "running" ? "توقف کار" : "ارسال درخواست"}><Icon name={status === "running" ? "stop" : "send"} /></button>
              </div>
            </div>
          </div>
        </footer>
      </main>
      <aside className={`la-right ${panel === "right" ? "open" : ""}`}>
        <header className="la-panel-head"><div><span className="la-head-icon"><Icon name="activity" /></span><span><b>وضعیت کار جاری</b><small>فقط همین درخواست</small></span></div><button className="la-mobile-close" onClick={() => setPanel(null)}><Icon name="close" /></button></header>
        <section className="la-card"><header><span><small>روند اجرای همین کار</small><h2>{label}</h2></span><em className={status}>{label}</em></header>{status === "idle" ? <div className="la-empty"><Icon name="activity" /><b>هنوز کاری شروع نشده</b><p>پس از ارسال، مراحل اجرای همان کار به‌صورت زنده اینجا دیده می‌شود.</p></div> : <><p className="la-request">{request}</p><ol className="la-steps">{steps.map((s, i) => <li className={s[1]} key={i}><i>{s[1] === "done" && <Icon name="check" />}{s[1] === "running" && <Icon name="activity" />}</i>{s[0]}</li>)}</ol></>}</section>
        <section className="la-card"><header><span><small>دسترسی‌های همین کار</small><h2>انتخاب خودکار</h2></span></header><p className="la-help">فقط امکانات لازم برای درخواست فعلی به‌کار گرفته می‌شوند.</p><div className="la-tools">{tools.map(id => { const t = TOOLS[id]; return t && <div key={id}><span><Icon name={t[2]} /></span><span><b>{t[0]}</b><small>{t[1]}</small></span><i /></div>; })}</div></section>
        <section className="la-card"><header><span><small>نتیجه کار</small><h2>خروجی‌ها</h2></span>{outputs.length > 0 && <b className="la-count">{outputs.length}</b>}</header>{outputs.length === 0 ? <p className="la-help">خروجی‌های ساخته‌شده برای همین کار اینجا قرار می‌گیرند.</p> : <div className="la-output-list">{outputs.map((o, i) => <button key={i} onClick={() => openModule(o[2])}><Icon name="output" /><span><b>{o[0]}</b><small>{o[1]}</small></span><Icon name="arrow" /></button>)}</div>}</section>
      </aside>
    </div></div>;
  }
  function AgentView(props) { return !paid(props) ? (PreviousView ? <PreviousView {...props} /> : null) : <AgentWorkspace {...props} />; }
  window.MODULES.aiChat = { ...window.MODULES.aiChat, title: "وکیل هوشمند", View: AgentView };
})();
