/* global React */
const { useState: useS_a, useEffect: useE_a, useRef: useR_a } = React;

// ────────────────────────────────────────────────────────────
// Login (editorial split — unchanged)
// ────────────────────────────────────────────────────────────
function AdminLogin({ onLogin }) {
  const [u, setU] = useS_a("diana");
  const [p, setP] = useS_a("");
  const { navigate } = useStore();
  return (
    <div className="login-split">
      <aside className="login-brand concrete">
        <div className="login-brand-top">
          <div className="mono caps" style={{fontSize:10,letterSpacing:".32em",color:"var(--gray-2)"}}>SA · Atelier · v1.0</div>
        </div>
        <div className="login-brand-center">
          <Logo variant="lockup" tone="light" className="login-lockup"/>
          <div className="login-divider"></div>
          <div className="login-slogan">Для тех,<br/>кто не просит<br/><em>разрешения.</em></div>
        </div>
        <div className="login-brand-bottom">
          <div>
            <div className="mono" style={{fontSize:10,letterSpacing:".28em",textTransform:"uppercase",color:"var(--gray-2)",marginBottom:4}}>Атéлье</div>
            <div className="mono" style={{fontSize:11,letterSpacing:".2em",textTransform:"uppercase",color:"var(--white)"}}>Россия · 2026</div>
          </div>
          <a href="#home" onClick={(e)=>{e.preventDefault();navigate("home");}}
             className="mono" style={{fontSize:10,letterSpacing:".28em",textTransform:"uppercase",color:"var(--gold)",borderBottom:"1px solid var(--gold)",paddingBottom:3}}>
            ← К сайту
          </a>
        </div>
      </aside>
      <main className="login-form-wrap">
        <form className="login-form" onSubmit={(e)=>{e.preventDefault();onLogin();}}>
          <div className="login-form-head">
            <div className="login-step">01 · Управление</div>
            <h1>Вход в админ-панель</h1>
            <p>Для управления каталогом, заказами, образами и контентом сайта. Доступ только для команды ателье.</p>
          </div>
          <div className="login-field">
            <label htmlFor="login-u">Логин</label>
            <input id="login-u" value={u} onChange={e=>setU(e.target.value)} required autoComplete="username"/>
          </div>
          <div className="login-field">
            <div className="login-field-row">
              <label htmlFor="login-p">Пароль</label>
              <a href="#" onClick={e=>e.preventDefault()} className="login-forgot">Забыли?</a>
            </div>
            <input id="login-p" type="password" value={p} onChange={e=>setP(e.target.value)} placeholder="••••••••" required autoComplete="current-password"/>
          </div>
          <label className="login-check">
            <input type="checkbox" defaultChecked/>
            <span className="login-check-box"></span>
            <span>Запомнить устройство на 30 дней</span>
          </label>
          <button className="login-submit" type="submit">
            <span>Войти</span><span className="arrow">→</span>
          </button>
          <div className="login-demo">
            <span className="login-demo-dot"></span>
            Demo-режим · подойдёт любой пароль
          </div>
        </form>
        <div className="login-foot">
          <span>© 2026 Sandler Atelier</span>
          <span>Защищённое соединение · TLS 1.3</span>
        </div>
      </main>
    </div>
  );
}

// ────────────────────────────────────────────────────────────
// Shared admin pieces
// ────────────────────────────────────────────────────────────
function AdminToast({ msg, onDone }) {
  useE_a(() => { const t = setTimeout(onDone, 2200); return () => clearTimeout(t); }, [onDone]);
  return <div className="admin-toast"><span className="admin-toast-dot"></span>{msg}</div>;
}

function AdminModal({ title, onClose, children, wide=false }) {
  useE_a(() => {
    const onKey = (e) => e.key === "Escape" && onClose();
    document.addEventListener("keydown", onKey);
    document.body.style.overflow = "hidden";
    return () => { document.removeEventListener("keydown", onKey); document.body.style.overflow = ""; };
  }, [onClose]);
  return (
    <div className="admin-modal" onClick={onClose}>
      <div className={`admin-modal-inner ${wide?"wide":""}`} onClick={(e)=>e.stopPropagation()}>
        <div className="admin-modal-head">
          <h2>{title}</h2>
          <button className="admin-modal-close" onClick={onClose} aria-label="Закрыть">×</button>
        </div>
        <div className="admin-modal-body">{children}</div>
      </div>
    </div>
  );
}

function PhotoSlot({ src, onChange, label="+ Загрузить фото" }) {
  const ref = useR_a(null);
  const onFile = (e) => {
    const f = e.target.files[0];
    if (!f) return;
    const r = new FileReader();
    r.onload = (ev) => onChange(ev.target.result);
    r.readAsDataURL(f);
  };
  return (
    <div className="photo-slot" onClick={()=>ref.current && ref.current.click()}>
      <input ref={ref} type="file" accept="image/*" style={{display:"none"}} onChange={onFile}/>
      {src ? (
        <>
          <img src={src} alt=""/>
          <button className="photo-slot-clear" onClick={(e)=>{e.stopPropagation();onChange("");}} aria-label="Удалить">×</button>
        </>
      ) : (
        <span>{label}<br/><small>jpg / png, до 4 MB</small></span>
      )}
    </div>
  );
}

// ────────────────────────────────────────────────────────────
// 1 — DASHBOARD
// ────────────────────────────────────────────────────────────
function AdminDashboard({ goTab }) {
  const { orders, products, looks, collections } = useStore();
  const totalRev = orders.reduce((s,o)=>s+o.total,0);
  const newCount = orders.filter(o=>o.status==="новый").length;
  return (
    <div>
      <h1>Сводка</h1>
      <div className="admin-stats">
        <button className="stat-card stat-link" onClick={()=>goTab("orders")}>
          <div className="n">{orders.length}</div>
          <div className="l">Всего заказов</div>
        </button>
        <button className="stat-card stat-link" onClick={()=>goTab("orders")}>
          <div className="n" style={{color:"#c98800"}}>{newCount}</div>
          <div className="l">Новых</div>
        </button>
        <div className="stat-card">
          <div className="n">{totalRev.toLocaleString("ru-RU")} ₽</div>
          <div className="l">Выручка / месяц</div>
        </div>
        <button className="stat-card stat-link" onClick={()=>goTab("products")}>
          <div className="n">{products.length}</div>
          <div className="l">Товаров</div>
        </button>
        <button className="stat-card stat-link" onClick={()=>goTab("looks")}>
          <div className="n">{looks.length}</div>
          <div className="l">Образов</div>
        </button>
        <button className="stat-card stat-link" onClick={()=>goTab("collections")}>
          <div className="n">{collections.length}</div>
          <div className="l">Коллекций</div>
        </button>
      </div>

      <div className="admin-card">
        <div className="admin-card-head">
          <h2>Последние заказы</h2>
          <button className="admin-btn ghost" onClick={()=>goTab("orders")}>Все заказы →</button>
        </div>
        <table className="table">
          <thead>
            <tr><th>№</th><th>Дата</th><th>Покупатель</th><th>Поз.</th><th>Сумма</th><th>Статус</th></tr>
          </thead>
          <tbody>
            {orders.slice(0,5).map(o => (
              <tr key={o.id}>
                <td style={{fontWeight:700}}>{o.id}</td>
                <td>{o.date}</td>
                <td>{o.customer}</td>
                <td>{Array.isArray(o.items) ? o.items.length : o.items}</td>
                <td style={{fontWeight:600}}>{o.total.toLocaleString("ru-RU")} ₽</td>
                <td><span className={`pill ${pillClass(o.status)}`}>{o.status}</span></td>
              </tr>
            ))}
          </tbody>
        </table>
      </div>
    </div>
  );
}

function pillClass(s) {
  return s==="отправлен"?"shipped":s==="выполнен"?"completed":s==="в обработке"?"processed":"";
}

// ────────────────────────────────────────────────────────────
// 2 — ORDERS
// ────────────────────────────────────────────────────────────
function AdminOrders() {
  const { orders, products, setOrderStatus } = useStore();
  const [filter, setFilter] = useS_a("all");
  const [detail, setDetail] = useS_a(null);
  const [invoice, setInvoice] = useS_a(null);
  const [toast, setToast] = useS_a(null);

  const filtered = orders.filter(o => filter === "all" ? true : o.status === filter);

  return (
    <div>
      <h1>Заказы</h1>
      <div style={{display:"flex",gap:8,marginBottom:24,flexWrap:"wrap"}}>
        {[["all","Все"],["новый","Новые"],["в обработке","В обработке"],["отправлен","Отправленные"],["выполнен","Выполненные"]].map(([v,l])=>(
          <button key={v} className={filter===v?"admin-btn":"admin-btn ghost"} style={{padding:"8px 14px",fontSize:10}} onClick={()=>setFilter(v)}>{l}</button>
        ))}
      </div>

      <table className="table">
        <thead><tr><th>№</th><th>Дата</th><th>Покупатель</th><th>Поз.</th><th>Сумма</th><th>Статус</th><th>Действия</th></tr></thead>
        <tbody>
          {filtered.map(o => (
            <tr key={o.id}>
              <td style={{fontWeight:700}}>{o.id}</td>
              <td>{o.date}</td>
              <td>{o.customer}</td>
              <td>{Array.isArray(o.items) ? o.items.length : o.items}</td>
              <td style={{fontWeight:600}}>{o.total.toLocaleString("ru-RU")} ₽</td>
              <td>
                <select value={o.status} onChange={e=>{setOrderStatus(o.id, e.target.value);setToast(`Статус ${o.id} → ${e.target.value}`);}} style={{padding:"6px 10px",fontSize:11}}>
                  <option>новый</option>
                  <option>в обработке</option>
                  <option>отправлен</option>
                  <option>выполнен</option>
                </select>
              </td>
              <td>
                <button className="admin-btn ghost" style={{padding:"6px 10px",fontSize:10,marginRight:6}} onClick={()=>setDetail(o)}>Детали</button>
                <button className="admin-btn ghost" style={{padding:"6px 10px",fontSize:10}} onClick={()=>setInvoice(o)}>Чек</button>
              </td>
            </tr>
          ))}
        </tbody>
      </table>

      {detail && <OrderDetail order={detail} onClose={()=>setDetail(null)} onStatus={(s)=>{setOrderStatus(detail.id, s);setToast(`Статус → ${s}`);setDetail({...detail, status:s});}}/>}
      {invoice && <Invoice order={invoice} onClose={()=>setInvoice(null)}/>}
      {toast && <AdminToast msg={toast} onDone={()=>setToast(null)}/>}
    </div>
  );
}

function OrderDetail({ order, onClose, onStatus }) {
  const { products } = useStore();
  const lines = (Array.isArray(order.items) ? order.items : []);
  return (
    <AdminModal title={`Заказ № ${order.id}`} onClose={onClose} wide>
      <div className="order-detail">
        <div className="order-detail-grid">
          <div>
            <div className="info-label">Покупатель</div>
            <div className="info-val">{order.customer}</div>
            <div className="info-label">Контакты</div>
            <div className="info-val">{order.email}<br/>{order.phone}</div>
            <div className="info-label">Адрес доставки</div>
            <div className="info-val">{order.address}</div>
          </div>
          <div>
            <div className="info-label">Дата</div>
            <div className="info-val">{order.date}</div>
            <div className="info-label">Способ оплаты</div>
            <div className="info-val">СБП · ЮKassa</div>
            <div className="info-label">Доставка</div>
            <div className="info-val">СДЭК · ПВЗ</div>
            <div className="info-label">Статус</div>
            <div>
              <select value={order.status} onChange={e=>onStatus(e.target.value)} style={{padding:"8px 12px",fontSize:12,marginTop:6}}>
                <option>новый</option><option>в обработке</option><option>отправлен</option><option>выполнен</option>
              </select>
            </div>
          </div>
        </div>

        <h3 className="order-detail-h">Позиции</h3>
        <table className="table" style={{marginTop:6}}>
          <thead><tr><th></th><th>Товар</th><th>Размер</th><th>Кол-во</th><th style={{textAlign:"right"}}>Сумма</th></tr></thead>
          <tbody>
            {lines.map((l,i) => {
              const p = products.find(p=>p.id===l.productId);
              if (!p) return null;
              return (
                <tr key={i}>
                  <td style={{width:50}}><img src={p.img[0]} alt="" style={{width:40,height:54,objectFit:"cover"}}/></td>
                  <td style={{fontWeight:700}}>{p.name}</td>
                  <td>{l.size}</td>
                  <td>{l.qty}</td>
                  <td style={{textAlign:"right",fontWeight:600}}>{(p.price*l.qty).toLocaleString("ru-RU")} ₽</td>
                </tr>
              );
            })}
            <tr><td colSpan="4" style={{textAlign:"right",fontWeight:700,fontFamily:"var(--f-display)",letterSpacing:".1em",textTransform:"uppercase",fontSize:13}}>Итого</td><td style={{textAlign:"right",fontWeight:700,fontSize:16,fontFamily:"var(--f-display)"}}>{order.total.toLocaleString("ru-RU")} ₽</td></tr>
          </tbody>
        </table>

        <div style={{display:"flex",gap:10,marginTop:24,paddingTop:18,borderTop:"1px solid #e8e6e3"}}>
          <button className="admin-btn gold" onClick={()=>onStatus("отправлен")}>Пометить отправленным</button>
          <button className="admin-btn ghost" onClick={()=>window.print()}>Печать</button>
          <button className="admin-btn ghost" onClick={()=>navigator.clipboard && navigator.clipboard.writeText(`Заказ ${order.id} · ${order.customer} · ${order.total} ₽`)}>Скопировать</button>
        </div>
      </div>
    </AdminModal>
  );
}

function Invoice({ order, onClose }) {
  const { products } = useStore();
  const lines = (Array.isArray(order.items) ? order.items : []);
  return (
    <AdminModal title={`Чек / Накладная · ${order.id}`} onClose={onClose}>
      <div className="invoice">
        <div className="invoice-head">
          <div>
            <div style={{fontFamily:"var(--f-display)",fontWeight:700,fontSize:18,letterSpacing:".24em",textTransform:"uppercase"}}>Sandler Atelier</div>
            <div style={{fontSize:11,color:"#666",marginTop:4}}>ИП Сандлер Д.Б. · ИНН 770000000000</div>
          </div>
          <div style={{textAlign:"right"}}>
            <div style={{fontSize:11,color:"#666"}}>Дата</div>
            <div style={{fontWeight:700,marginTop:2}}>{order.date}</div>
          </div>
        </div>
        <div className="invoice-row">
          <div><span className="info-label">Получатель</span><div>{order.customer}</div></div>
          <div><span className="info-label">Адрес</span><div>{order.address}</div></div>
        </div>
        <table className="table" style={{marginTop:12}}>
          <thead><tr><th>Товар</th><th>Размер</th><th>Кол-во</th><th style={{textAlign:"right"}}>Цена</th><th style={{textAlign:"right"}}>Сумма</th></tr></thead>
          <tbody>
            {lines.map((l,i) => {
              const p = products.find(p=>p.id===l.productId);
              if (!p) return null;
              return (
                <tr key={i}>
                  <td style={{fontWeight:700}}>{p.name}</td>
                  <td>{l.size}</td>
                  <td>{l.qty}</td>
                  <td style={{textAlign:"right"}}>{p.price.toLocaleString("ru-RU")} ₽</td>
                  <td style={{textAlign:"right",fontWeight:700}}>{(p.price*l.qty).toLocaleString("ru-RU")} ₽</td>
                </tr>
              );
            })}
            <tr><td colSpan="4" style={{textAlign:"right",fontSize:13,textTransform:"uppercase",letterSpacing:".18em"}}>Доставка</td><td style={{textAlign:"right"}}>350 ₽</td></tr>
            <tr><td colSpan="4" style={{textAlign:"right",fontWeight:700,fontFamily:"var(--f-display)",letterSpacing:".18em",textTransform:"uppercase"}}>Итого</td><td style={{textAlign:"right",fontWeight:700,fontSize:16,fontFamily:"var(--f-display)"}}>{order.total.toLocaleString("ru-RU")} ₽</td></tr>
          </tbody>
        </table>
        <div style={{display:"flex",gap:10,marginTop:24,paddingTop:18,borderTop:"1px solid #e8e6e3"}}>
          <button className="admin-btn gold" onClick={()=>window.print()}>Распечатать</button>
          <button className="admin-btn ghost" onClick={onClose}>Закрыть</button>
        </div>
      </div>
    </AdminModal>
  );
}

// ────────────────────────────────────────────────────────────
// 3 — PRODUCTS
// ────────────────────────────────────────────────────────────
function AdminProducts() {
  const { products, upsertProduct, removeProduct } = useStore();
  const [editing, setEditing] = useS_a(null);
  const [confirmDel, setConfirmDel] = useS_a(null);
  const [toast, setToast] = useS_a(null);

  if (editing) return <ProductEditor product={editing} onSave={(p)=>{upsertProduct(p);setEditing(null);setToast("Товар сохранён");}} onCancel={()=>setEditing(null)}/>;

  return (
    <div>
      <div className="admin-h-row">
        <h1>Товары</h1>
        <button className="admin-btn gold" onClick={()=>setEditing({ id:"", name:"", nameEn:"", price:0, sizes:["S","M"], category:"tops", img:["",""], gallery:[], desc:"", composition:"", care:"", tag:null })}>
          + Добавить товар
        </button>
      </div>

      <table className="table">
        <thead><tr><th></th><th>Название</th><th>Категория</th><th>Размеры</th><th>Цена</th><th>Тег</th><th></th></tr></thead>
        <tbody>
          {products.map(p => (
            <tr key={p.id}>
              <td style={{width:54}}><img src={p.img[0]} alt="" style={{width:42,height:56,objectFit:"cover",background:"#eee"}}/></td>
              <td style={{fontWeight:700}}>{p.name} <span style={{color:"#999",fontWeight:400,marginLeft:6,fontSize:11}}>{p.nameEn}</span></td>
              <td>{p.category === "tops" ? "Верх" : p.category === "bottoms" ? "Низ" : p.category}</td>
              <td>{p.sizes.join(" / ")}</td>
              <td style={{fontWeight:600}}>{p.price.toLocaleString("ru-RU")} ₽</td>
              <td>{p.tag && <span className="pill">{p.tag}</span>}</td>
              <td style={{whiteSpace:"nowrap"}}>
                <button className="admin-btn ghost" style={{padding:"6px 10px",fontSize:10,marginRight:6}} onClick={()=>setEditing({...p})}>Редакт.</button>
                <button className="admin-btn ghost" style={{padding:"6px 10px",fontSize:10,color:"#a00",borderColor:"#a00"}} onClick={()=>setConfirmDel(p)}>Удалить</button>
              </td>
            </tr>
          ))}
        </tbody>
      </table>

      {confirmDel && (
        <AdminModal title="Удалить товар?" onClose={()=>setConfirmDel(null)}>
          <p style={{fontSize:14,marginBottom:20}}>Товар <b>«{confirmDel.name}»</b> будет удалён из каталога. Это действие нельзя отменить.</p>
          <div style={{display:"flex",gap:10}}>
            <button className="admin-btn" style={{background:"#a00",borderColor:"#a00"}} onClick={()=>{removeProduct(confirmDel.id);setConfirmDel(null);setToast("Товар удалён");}}>Удалить</button>
            <button className="admin-btn ghost" onClick={()=>setConfirmDel(null)}>Отмена</button>
          </div>
        </AdminModal>
      )}
      {toast && <AdminToast msg={toast} onDone={()=>setToast(null)}/>}
    </div>
  );
}

function ProductEditor({ product, onSave, onCancel }) {
  const [p, setP] = useS_a({ ...product, gallery: product.gallery || [] });
  const set = (k, v) => setP(s => ({...s, [k]: v}));
  const setImg = (i, v) => setP(s => { const img = [...s.img]; img[i] = v; return {...s, img}; });
  const toggleSize = (s) => set("sizes", p.sizes.includes(s) ? p.sizes.filter(x=>x!==s) : [...p.sizes, s]);

  const submit = () => {
    if (!p.name) { alert("Укажите название"); return; }
    if (!p.id) p.id = "p-" + Date.now();
    onSave(p);
  };

  return (
    <div>
      <div className="admin-h-row">
        <h1>{product.id ? "Редактирование" : "Новый товар"}</h1>
        <button className="admin-btn ghost" onClick={onCancel}>← Назад</button>
      </div>

      <div style={{display:"grid",gridTemplateColumns:"1fr 1fr",gap:30,marginBottom:24}}>
        <div>
          <div className="field"><label>Название (RU)</label>
            <input value={p.name} onChange={e=>set("name",e.target.value)} placeholder="ТОП"/></div>
          <div className="field"><label>Название (EN)</label>
            <input value={p.nameEn} onChange={e=>set("nameEn",e.target.value)} placeholder="TOP"/></div>
          <div className="row" style={{gap:16}}>
            <div className="field" style={{flex:1}}><label>Цена (₽)</label>
              <input type="number" value={p.price} onChange={e=>set("price",Number(e.target.value))}/></div>
            <div className="field" style={{flex:1}}><label>Категория</label>
              <select value={p.category} onChange={e=>set("category",e.target.value)}>
                <option value="tops">Верх</option>
                <option value="bottoms">Низ</option>
                <option value="dresses">Платья</option>
              </select></div>
          </div>
          <div className="field"><label>Размеры</label>
            <div style={{display:"flex",gap:6,flexWrap:"wrap"}}>
              {["XS","S","M","XS-S","S-M"].map(s => (
                <button key={s} type="button" onClick={()=>toggleSize(s)}
                  className={p.sizes.includes(s) ? "admin-btn" : "admin-btn ghost"}
                  style={{padding:"8px 14px",fontSize:10}}>{s}</button>
              ))}
            </div>
          </div>
          <div className="field"><label>Тег (опционально)</label>
            <select value={p.tag || ""} onChange={e=>set("tag",e.target.value || null)}>
              <option value="">Без тега</option>
              <option value="NEW">NEW</option>
              <option value="BASE">BASE</option>
              <option value="SALE">SALE</option>
            </select>
          </div>
        </div>

        <div>
          <div className="field"><label>Описание</label>
            <textarea rows="4" value={p.desc} onChange={e=>set("desc",e.target.value)}/></div>
          <div className="field"><label>Состав</label>
            <input value={p.composition} onChange={e=>set("composition",e.target.value)}/></div>
          <div className="field"><label>Уход</label>
            <input value={p.care} onChange={e=>set("care",e.target.value)}/></div>

          <div className="field"><label>Фото · Основное / Hover</label>
            <div style={{display:"flex",gap:10,marginTop:8}}>
              <PhotoSlot src={p.img[0]} onChange={(v)=>setImg(0, v)} label="+ Основное"/>
              <PhotoSlot src={p.img[1]} onChange={(v)=>setImg(1, v)} label="+ Hover"/>
            </div>
          </div>
        </div>
      </div>

      <div style={{display:"flex",gap:10,paddingTop:24,borderTop:"1px solid #e8e6e3"}}>
        <button className="admin-btn gold" onClick={submit}>Сохранить</button>
        <button className="admin-btn ghost" onClick={onCancel}>Отмена</button>
      </div>
    </div>
  );
}

// ────────────────────────────────────────────────────────────
// 4 — LOOKS (NEW)
// ────────────────────────────────────────────────────────────
function AdminLooks() {
  const { looks, products, upsertLook, removeLook } = useStore();
  const [editing, setEditing] = useS_a(null);
  const [confirmDel, setConfirmDel] = useS_a(null);
  const [toast, setToast] = useS_a(null);

  if (editing) return <LookEditor look={editing} onSave={(l)=>{upsertLook(l);setEditing(null);setToast("Образ сохранён");}} onCancel={()=>setEditing(null)}/>;

  return (
    <div>
      <div className="admin-h-row">
        <h1>Образы</h1>
        <button className="admin-btn gold" onClick={()=>setEditing({ id: Date.now(), src:"", title:"", products:[] })}>
          + Добавить образ
        </button>
      </div>

      <p style={{fontSize:13,color:"#666",marginBottom:24,maxWidth:680}}>
        Образы появляются на главной странице (3 избранных) и на странице «Образы». Каждый образ ведёт к списку входящих вещей с выбором размеров — клиент может купить весь образ одним нажатием.
      </p>

      <div className="admin-look-grid">
        {looks.map(l => (
          <div className="admin-look-card" key={l.id}>
            <div className="admin-look-img" style={{backgroundImage:`url(${l.src})`}}>
              <span className="admin-look-num">Look {String(l.id).padStart(2,"0")}</span>
            </div>
            <div className="admin-look-body">
              <div className="admin-look-title">{l.title || "Без названия"}</div>
              <div className="admin-look-products">
                {l.products.map(pid => {
                  const p = products.find(x=>x.id===pid);
                  return <span key={pid} className="admin-chip">{p ? p.name : pid}</span>;
                })}
              </div>
              <div className="admin-look-actions">
                <button className="admin-btn ghost" style={{padding:"6px 10px",fontSize:10}} onClick={()=>setEditing({...l})}>Редакт.</button>
                <button className="admin-btn ghost" style={{padding:"6px 10px",fontSize:10,color:"#a00",borderColor:"#a00"}} onClick={()=>setConfirmDel(l)}>Удалить</button>
              </div>
            </div>
          </div>
        ))}
      </div>

      {confirmDel && (
        <AdminModal title="Удалить образ?" onClose={()=>setConfirmDel(null)}>
          <p style={{fontSize:14,marginBottom:20}}>Образ <b>«{confirmDel.title}»</b> будет удалён.</p>
          <div style={{display:"flex",gap:10}}>
            <button className="admin-btn" style={{background:"#a00",borderColor:"#a00"}} onClick={()=>{removeLook(confirmDel.id);setConfirmDel(null);setToast("Образ удалён");}}>Удалить</button>
            <button className="admin-btn ghost" onClick={()=>setConfirmDel(null)}>Отмена</button>
          </div>
        </AdminModal>
      )}
      {toast && <AdminToast msg={toast} onDone={()=>setToast(null)}/>}
    </div>
  );
}

function LookEditor({ look, onSave, onCancel }) {
  const { products } = useStore();
  const [l, setL] = useS_a({ ...look, gallery: look.gallery || [] });
  const set = (k, v) => setL(s => ({...s, [k]: v}));
  const toggleProduct = (pid) => set("products", l.products.includes(pid) ? l.products.filter(x=>x!==pid) : [...l.products, pid]);

  const setGalleryItem = (idx, v) => setL(s => {
    const g = [...(s.gallery || [])];
    if (v) g[idx] = v; else g.splice(idx, 1);
    return {...s, gallery: g};
  });
  const addGallerySlot = () => setL(s => ({...s, gallery: [...(s.gallery||[]), ""]}));

  const submit = () => {
    if (!l.src) { alert("Загрузите главное фото образа"); return; }
    if (l.products.length === 0) { alert("Добавьте хотя бы один товар"); return; }
    onSave({...l, gallery: (l.gallery||[]).filter(Boolean)});
  };

  return (
    <div>
      <div className="admin-h-row">
        <h1>{typeof look.id === "number" && look.title ? "Редактирование образа" : "Новый образ"}</h1>
        <button className="admin-btn ghost" onClick={onCancel}>← Назад</button>
      </div>

      <div style={{display:"grid",gridTemplateColumns:"380px 1fr",gap:40,marginBottom:24}}>
        <div>
          <div className="field"><label>Главное фото</label>
            <PhotoSlot src={l.src} onChange={(v)=>set("src", v)} label="+ Главное фото"/>
          </div>

          <div className="field">
            <label style={{display:"flex",justifyContent:"space-between",alignItems:"center"}}>
              <span>Дополнительные фото ({(l.gallery||[]).filter(Boolean).length})</span>
              <button type="button" className="admin-btn ghost" style={{padding:"6px 10px",fontSize:10}} onClick={addGallerySlot}>+ Слот</button>
            </label>
            <div className="look-gallery-grid">
              {(l.gallery || []).map((src, idx) => (
                <PhotoSlot key={idx} src={src} onChange={(v)=>setGalleryItem(idx, v)} label="+ Фото"/>
              ))}
              {(!l.gallery || l.gallery.length === 0) && (
                <button type="button" className="admin-btn ghost" style={{padding:14,fontSize:10}} onClick={addGallerySlot}>+ Добавить первое</button>
              )}
            </div>
            <small style={{display:"block",color:"#999",marginTop:8,fontSize:11,letterSpacing:".05em"}}>Появятся как карусель в карточке образа на витрине</small>
          </div>
        </div>

        <div>
          <div className="field"><label>Название образа</label>
            <input value={l.title} onChange={e=>set("title",e.target.value)} placeholder="Soft Architecture"/></div>

          <div className="field"><label>Товары в образе ({l.products.length})</label>
            <div className="admin-product-pick">
              {products.map(p => (
                <button key={p.id} type="button"
                  className={`admin-product-pick-item ${l.products.includes(p.id)?"on":""}`}
                  onClick={()=>toggleProduct(p.id)}>
                  <img src={p.img[0]} alt=""/>
                  <div>
                    <div className="admin-product-pick-name">{p.name}</div>
                    <div className="admin-product-pick-price">{p.price.toLocaleString("ru-RU")} ₽</div>
                  </div>
                  <div className={`admin-product-pick-check ${l.products.includes(p.id)?"on":""}`}>{l.products.includes(p.id) ? "✓" : "+"}</div>
                </button>
              ))}
            </div>
          </div>
        </div>
      </div>

      <div style={{display:"flex",gap:10,paddingTop:24,borderTop:"1px solid #e8e6e3"}}>
        <button className="admin-btn gold" onClick={submit}>Сохранить</button>
        <button className="admin-btn ghost" onClick={onCancel}>Отмена</button>
      </div>
    </div>
  );
}

// ────────────────────────────────────────────────────────────
// 5 — COLLECTIONS
// ────────────────────────────────────────────────────────────
function AdminCollections() {
  const { collections, products, upsertCollection, removeCollection } = useStore();
  const [editing, setEditing] = useS_a(null);
  const [confirmDel, setConfirmDel] = useS_a(null);
  const [toast, setToast] = useS_a(null);

  if (editing) return <CollectionEditor collection={editing} onSave={(c)=>{upsertCollection(c);setEditing(null);setToast("Коллекция сохранена");}} onCancel={()=>setEditing(null)}/>;

  return (
    <div>
      <div className="admin-h-row">
        <h1>Коллекции</h1>
        <button className="admin-btn gold" onClick={()=>setEditing({ id:"c-"+Date.now(), name:"", subtitle:"", productIds:[], active:false })}>
          + Создать коллекцию
        </button>
      </div>

      <table className="table">
        <thead><tr><th>Название</th><th>Описание</th><th>Товаров</th><th>Видимость</th><th></th></tr></thead>
        <tbody>
          {collections.map(c => (
            <tr key={c.id}>
              <td style={{fontWeight:700,fontFamily:"var(--f-display)",letterSpacing:".1em",textTransform:"uppercase"}}>{c.name}</td>
              <td style={{color:"#666"}}>{c.subtitle}</td>
              <td>{c.productIds.length}</td>
              <td>
                <label style={{display:"inline-flex",alignItems:"center",gap:8,cursor:"pointer"}}>
                  <input type="checkbox" checked={c.active} onChange={()=>upsertCollection({...c, active:!c.active})} style={{width:"auto"}}/>
                  <span style={{fontSize:11,letterSpacing:".18em",textTransform:"uppercase"}}>{c.active?"опубликована":"скрыта"}</span>
                </label>
              </td>
              <td style={{whiteSpace:"nowrap"}}>
                <button className="admin-btn ghost" style={{padding:"6px 10px",fontSize:10,marginRight:6}} onClick={()=>setEditing({...c})}>Редакт.</button>
                <button className="admin-btn ghost" style={{padding:"6px 10px",fontSize:10,color:"#a00",borderColor:"#a00"}} onClick={()=>setConfirmDel(c)}>Удалить</button>
              </td>
            </tr>
          ))}
        </tbody>
      </table>

      {confirmDel && (
        <AdminModal title="Удалить коллекцию?" onClose={()=>setConfirmDel(null)}>
          <p style={{fontSize:14,marginBottom:20}}>Коллекция <b>«{confirmDel.name}»</b> будет удалена. Товары останутся в каталоге.</p>
          <div style={{display:"flex",gap:10}}>
            <button className="admin-btn" style={{background:"#a00",borderColor:"#a00"}} onClick={()=>{removeCollection(confirmDel.id);setConfirmDel(null);setToast("Коллекция удалена");}}>Удалить</button>
            <button className="admin-btn ghost" onClick={()=>setConfirmDel(null)}>Отмена</button>
          </div>
        </AdminModal>
      )}
      {toast && <AdminToast msg={toast} onDone={()=>setToast(null)}/>}
    </div>
  );
}

function CollectionEditor({ collection, onSave, onCancel }) {
  const { products } = useStore();
  const [c, setC] = useS_a({ ...collection });
  const set = (k, v) => setC(s => ({...s, [k]: v}));
  const toggleP = (pid) => set("productIds", c.productIds.includes(pid) ? c.productIds.filter(x=>x!==pid) : [...c.productIds, pid]);

  return (
    <div>
      <div className="admin-h-row">
        <h1>{collection.name ? "Редактирование коллекции" : "Новая коллекция"}</h1>
        <button className="admin-btn ghost" onClick={onCancel}>← Назад</button>
      </div>

      <div style={{display:"grid",gridTemplateColumns:"1fr 1fr",gap:30,marginBottom:24}}>
        <div>
          <div className="field"><label>Название</label>
            <input value={c.name} onChange={e=>set("name",e.target.value)} placeholder="БАЗА"/></div>
          <div className="field"><label>Описание / дроп</label>
            <input value={c.subtitle} onChange={e=>set("subtitle",e.target.value)} placeholder="Дроп 02 · AW 2026"/></div>
          <label className="login-check" style={{margin:"6px 0 0",color:"#444"}}>
            <input type="checkbox" checked={c.active} onChange={e=>set("active", e.target.checked)}/>
            <span className="login-check-box" style={{background:c.active?"#0b0b0b":"#fff",borderColor:c.active?"#0b0b0b":"#b5b0a6"}}></span>
            <span>Опубликована</span>
          </label>
        </div>

        <div>
          <div className="field"><label>Товары в коллекции ({c.productIds.length})</label>
            <div className="admin-product-pick" style={{maxHeight:380,overflowY:"auto"}}>
              {products.map(p => (
                <button key={p.id} type="button"
                  className={`admin-product-pick-item ${c.productIds.includes(p.id)?"on":""}`}
                  onClick={()=>toggleP(p.id)}>
                  <img src={p.img[0]} alt=""/>
                  <div>
                    <div className="admin-product-pick-name">{p.name}</div>
                    <div className="admin-product-pick-price">{p.price.toLocaleString("ru-RU")} ₽</div>
                  </div>
                  <div className={`admin-product-pick-check ${c.productIds.includes(p.id)?"on":""}`}>{c.productIds.includes(p.id) ? "✓" : "+"}</div>
                </button>
              ))}
            </div>
          </div>
        </div>
      </div>

      <div style={{display:"flex",gap:10,paddingTop:24,borderTop:"1px solid #e8e6e3"}}>
        <button className="admin-btn gold" onClick={()=>onSave(c)}>Сохранить</button>
        <button className="admin-btn ghost" onClick={onCancel}>Отмена</button>
      </div>
    </div>
  );
}

// ────────────────────────────────────────────────────────────
// 6 — PAGES (visibility + SEO + edit)
// ────────────────────────────────────────────────────────────
function AdminPages() {
  const { navigate, pages, updatePage } = useStore();
  const [editing, setEditing] = useS_a(null);
  const [toast, setToast] = useS_a(null);

  const stats = {
    total: pages.length,
    visible: pages.filter(p=>p.visible).length,
    hidden: pages.filter(p=>!p.visible).length,
    inNav: pages.filter(p=>p.inNav).length,
  };

  return (
    <div>
      <div className="admin-h-row">
        <h1>Страницы сайта</h1>
        <div style={{display:"flex",gap:10,fontFamily:"var(--f-mono)",fontSize:11,letterSpacing:".18em",textTransform:"uppercase",color:"#666"}}>
          <span>{stats.visible} опубликовано</span>
          <span>·</span>
          <span style={{color:stats.hidden?"#a00":"#666"}}>{stats.hidden} скрыто</span>
          <span>·</span>
          <span>{stats.inNav} в меню</span>
        </div>
      </div>

      <p style={{fontSize:13,color:"#666",marginBottom:24,maxWidth:780}}>
        Управление видимостью страниц на сайте, размещением в навигации и футере, SEO-мета-данными.
        Скрытая страница недоступна по прямой ссылке (возвращает 404). Контент главной правится в разделе <b>«Бренд»</b>.
      </p>

      <table className="table">
        <thead>
          <tr>
            <th>Страница</th>
            <th>URL</th>
            <th style={{textAlign:"center"}}>Видна</th>
            <th style={{textAlign:"center"}}>В меню</th>
            <th style={{textAlign:"center"}}>В футере</th>
            <th>Обновлено</th>
            <th>Действия</th>
          </tr>
        </thead>
        <tbody>
          {pages.map(p => (
            <tr key={p.id} style={!p.visible ? {opacity:.55} : null}>
              <td>
                <div style={{fontWeight:700}}>{p.title}</div>
                <div style={{color:"#999",fontSize:11,marginTop:4,maxWidth:240}}>{p.desc}</div>
              </td>
              <td style={{color:"#666",fontFamily:"var(--f-mono)",fontSize:12}}>/{p.route === "home" ? "" : p.route}</td>
              <td style={{textAlign:"center"}}>
                <button className={`admin-toggle ${p.visible?"on":""}`}
                  onClick={()=>{updatePage(p.id, {visible:!p.visible}); setToast(`${p.title} ${p.visible?"скрыта":"опубликована"}`);}}
                  aria-label="visibility">
                  <span></span>
                </button>
              </td>
              <td style={{textAlign:"center"}}>
                <button className={`admin-toggle ${p.inNav?"on":""}`}
                  onClick={()=>{updatePage(p.id, {inNav:!p.inNav});setToast(`${p.title} ${p.inNav?"убрана из меню":"добавлена в меню"}`);}}
                  aria-label="nav">
                  <span></span>
                </button>
              </td>
              <td style={{textAlign:"center"}}>
                <button className={`admin-toggle ${p.inFooter?"on":""}`}
                  onClick={()=>{updatePage(p.id, {inFooter:!p.inFooter});setToast(`${p.title} ${p.inFooter?"убрана из футера":"добавлена в футер"}`);}}
                  aria-label="footer">
                  <span></span>
                </button>
              </td>
              <td style={{color:"#999",fontFamily:"var(--f-mono)",fontSize:11}}>{p.updatedAt}</td>
              <td style={{whiteSpace:"nowrap"}}>
                <button className="admin-btn ghost" style={{padding:"6px 10px",fontSize:10,marginRight:6}} onClick={()=>setEditing(p)}>SEO</button>
                <button className="admin-btn ghost" style={{padding:"6px 10px",fontSize:10}} onClick={()=>navigate(p.route)}>Открыть →</button>
              </td>
            </tr>
          ))}
        </tbody>
      </table>

      {editing && (
        <PageSeoEditor page={editing}
          onSave={(patch)=>{updatePage(editing.id, patch);setEditing(null);setToast(`SEO ${editing.title} сохранены`);}}
          onClose={()=>setEditing(null)}/>
      )}
      {toast && <AdminToast msg={toast} onDone={()=>setToast(null)}/>}
    </div>
  );
}

function PageSeoEditor({ page, onSave, onClose }) {
  const [t, setT] = useS_a(page.metaTitle || "");
  const [d, setD] = useS_a(page.metaDesc || "");
  return (
    <AdminModal title={`SEO · ${page.title}`} onClose={onClose}>
      <div style={{padding:"12px 14px",background:"#fafaf9",borderLeft:"2px solid #0b0b0b",marginBottom:18}}>
        <div style={{fontFamily:"var(--f-mono)",fontSize:10,letterSpacing:".24em",textTransform:"uppercase",color:"#666",marginBottom:8}}>Превью в Google / Yandex</div>
        <div style={{color:"#1a0dab",fontSize:18,lineHeight:1.2,marginBottom:4}}>{t || "—"}</div>
        <div style={{color:"#006621",fontSize:13,marginBottom:6,fontFamily:"var(--f-mono)"}}>sandler.atelier/{page.route === "home" ? "" : page.route}</div>
        <div style={{color:"#545454",fontSize:13,lineHeight:1.4}}>{d || "Описание не задано — поисковики возьмут первый абзац страницы."}</div>
      </div>

      <div className="field"><label>Title (до 60 символов) — <span style={{color:t.length>60?"#a00":"#999"}}>{t.length}/60</span></label>
        <input value={t} onChange={e=>setT(e.target.value)} placeholder="Например: Каталог · SANDLER ATELIER"/></div>
      <div className="field"><label>Description (до 160 символов) — <span style={{color:d.length>160?"#a00":"#999"}}>{d.length}/160</span></label>
        <textarea rows="3" value={d} onChange={e=>setD(e.target.value)} placeholder="Краткое описание для поисковой выдачи"/></div>

      <div style={{display:"flex",gap:10,paddingTop:16,borderTop:"1px solid #e8e6e3"}}>
        <button className="admin-btn gold" onClick={()=>onSave({metaTitle:t, metaDesc:d})}>Сохранить</button>
        <button className="admin-btn ghost" onClick={onClose}>Отмена</button>
      </div>
    </AdminModal>
  );
}

// ────────────────────────────────────────────────────────────
// 7 — BRAND (site copy + contacts)
// ────────────────────────────────────────────────────────────
function AdminBrand() {
  const { site, updateSite } = useStore();
  const [draft, setDraft] = useS_a(site);
  const [toast, setToast] = useS_a(null);
  const dirty = JSON.stringify(draft) !== JSON.stringify(site);

  const set = (k, v) => setDraft(d => ({...d, [k]: v}));
  const save = () => { updateSite(draft); setToast("Изменения опубликованы"); };
  const reset = () => setDraft(site);

  return (
    <div>
      <div className="admin-h-row">
        <h1>Бренд · Контент сайта</h1>
        {dirty && (
          <div style={{display:"flex",gap:10}}>
            <button className="admin-btn gold" onClick={save}>Опубликовать</button>
            <button className="admin-btn ghost" onClick={reset}>Отменить</button>
          </div>
        )}
      </div>

      <div style={{display:"grid",gridTemplateColumns:"1fr 1fr",gap:30,marginBottom:30}}>
        <div className="admin-card">
          <h3 className="admin-card-h">Главная страница</h3>
          <div className="field"><label>Слоган в hero</label>
            <input value={draft.slogan} onChange={e=>set("slogan",e.target.value)}/></div>
          <div className="field"><label>Заголовок коллекции</label>
            <input value={draft.collectionName} onChange={e=>set("collectionName",e.target.value)}/></div>
          <div className="field"><label>Описание дропа</label>
            <input value={draft.collectionEyebrow} onChange={e=>set("collectionEyebrow",e.target.value)}/></div>
        </div>

        <div className="admin-card">
          <h3 className="admin-card-h">Манифест</h3>
          <div className="field"><label>Первая строка</label>
            <input value={draft.manifestoHead} onChange={e=>set("manifestoHead",e.target.value)}/></div>
          <div className="field"><label>Основной текст</label>
            <textarea rows="4" value={draft.manifestoBody} onChange={e=>set("manifestoBody",e.target.value)}/></div>
        </div>

        <div className="admin-card">
          <h3 className="admin-card-h">Тизер новой коллекции</h3>
          <div className="field"><label>Бейдж</label>
            <input value={draft.newCollEyebrow} onChange={e=>set("newCollEyebrow",e.target.value)}/></div>
          <div className="field"><label>Заголовок (\n = перенос)</label>
            <textarea rows="2" value={draft.newCollHead} onChange={e=>set("newCollHead",e.target.value)}/></div>
          <div className="field"><label>Текст</label>
            <textarea rows="3" value={draft.newCollBody} onChange={e=>set("newCollBody",e.target.value)}/></div>
        </div>

        <div className="admin-card">
          <h3 className="admin-card-h">Контакты</h3>
          <div className="field"><label>E-mail</label>
            <input value={draft.contactEmail} onChange={e=>set("contactEmail",e.target.value)}/></div>
          <div className="field"><label>Город / год в футере</label>
            <input value={draft.contactCity} onChange={e=>set("contactCity",e.target.value)}/></div>
        </div>
      </div>

      {toast && <AdminToast msg={toast} onDone={()=>setToast(null)}/>}
    </div>
  );
}

// ────────────────────────────────────────────────────────────
// 8 — TEAM (staff & permissions)
// ────────────────────────────────────────────────────────────
function AdminTeam() {
  const { staff, ROLES, upsertStaff, removeStaff, currentStaff } = useStore();
  const [editing, setEditing] = useS_a(null);
  const [pwd, setPwd] = useS_a(null);
  const [confirmDel, setConfirmDel] = useS_a(null);
  const [toast, setToast] = useS_a(null);

  return (
    <div>
      <div className="admin-h-row">
        <h1>Команда · Права доступа</h1>
        <button className="admin-btn gold" onClick={()=>setEditing({ id:"u-"+Date.now(), name:"", email:"", role:"manager", password:"", active:true })}>
          + Создать ЛК сотрудника
        </button>
      </div>

      <p style={{fontSize:13,color:"#666",marginBottom:24,maxWidth:780}}>
        Каждый сотрудник видит только те разделы админки, которые соответствуют его роли.
        Сменить роль или пароль можно в любой момент. Деактивированные ЛК не могут войти.
      </p>

      <div className="admin-roles-grid">
        {Object.entries(ROLES).map(([key, r]) => (
          <div key={key} className="admin-role-card">
            <div className="admin-role-name">{r.label}</div>
            <p>{r.desc}</p>
            <div className="admin-role-perms">
              {r.perms.map(p => <span key={p} className="admin-chip">{permLabel(p)}</span>)}
            </div>
          </div>
        ))}
      </div>

      <h2 style={{marginBottom:14,marginTop:8}}>Сотрудники ({staff.length})</h2>
      <table className="table">
        <thead><tr><th>Имя</th><th>E-mail</th><th>Роль</th><th>Статус</th><th>Действия</th></tr></thead>
        <tbody>
          {staff.map(s => (
            <tr key={s.id} style={s.id === currentStaff.id ? {background:"#fffceb"} : null}>
              <td style={{fontWeight:700}}>
                {s.name}
                {s.id === currentStaff.id && <span style={{marginLeft:8,fontSize:9,letterSpacing:".22em",padding:"3px 7px",background:"var(--gold)",color:"#0b0b0b",fontWeight:700}}>ВЫ</span>}
              </td>
              <td style={{color:"#666",fontFamily:"var(--f-mono)",fontSize:12}}>{s.email}</td>
              <td>
                <select value={s.role} onChange={e=>{upsertStaff({...s, role:e.target.value});setToast(`Роль ${s.name} → ${ROLES[e.target.value].label}`);}} style={{padding:"6px 10px",fontSize:11,minWidth:140}}>
                  {Object.entries(ROLES).map(([k,r])=>(
                    <option key={k} value={k}>{r.label}</option>
                  ))}
                </select>
              </td>
              <td>
                <label style={{display:"inline-flex",alignItems:"center",gap:8,cursor:"pointer"}}>
                  <input type="checkbox" checked={s.active} onChange={()=>upsertStaff({...s, active:!s.active})} style={{width:"auto"}}/>
                  <span style={{fontSize:11,letterSpacing:".18em",textTransform:"uppercase",color:s.active?"#1f5e26":"#a00"}}>{s.active?"активен":"отключён"}</span>
                </label>
              </td>
              <td style={{whiteSpace:"nowrap"}}>
                <button className="admin-btn ghost" style={{padding:"6px 10px",fontSize:10,marginRight:6}} onClick={()=>setEditing({...s})}>Редакт.</button>
                <button className="admin-btn ghost" style={{padding:"6px 10px",fontSize:10,marginRight:6}} onClick={()=>setPwd(s)}>Сменить пароль</button>
                <button className="admin-btn ghost" style={{padding:"6px 10px",fontSize:10,color:"#a00",borderColor:"#a00"}} onClick={()=>setConfirmDel(s)} disabled={s.role==="owner"}>Удалить</button>
              </td>
            </tr>
          ))}
        </tbody>
      </table>

      {editing && <StaffEditor staff={editing} onSave={(s)=>{upsertStaff(s);setEditing(null);setToast("Сотрудник сохранён");}} onCancel={()=>setEditing(null)}/>}
      {pwd && <PasswordModal staff={pwd} onSave={(np)=>{upsertStaff({...pwd, password:np});setPwd(null);setToast(`Пароль для ${pwd.name} обновлён`);}} onClose={()=>setPwd(null)}/>}
      {confirmDel && (
        <AdminModal title="Удалить сотрудника?" onClose={()=>setConfirmDel(null)}>
          <p style={{fontSize:14,marginBottom:20}}>ЛК <b>{confirmDel.name}</b> ({confirmDel.email}) будет удалён.</p>
          <div style={{display:"flex",gap:10}}>
            <button className="admin-btn" style={{background:"#a00",borderColor:"#a00"}} onClick={()=>{removeStaff(confirmDel.id);setConfirmDel(null);setToast("Сотрудник удалён");}}>Удалить</button>
            <button className="admin-btn ghost" onClick={()=>setConfirmDel(null)}>Отмена</button>
          </div>
        </AdminModal>
      )}
      {toast && <AdminToast msg={toast} onDone={()=>setToast(null)}/>}
    </div>
  );
}

function permLabel(k) {
  return ({
    dashboard:"Сводка", orders:"Заказы", products:"Товары", looks:"Образы",
    collections:"Коллекции", pages:"Страницы", brand:"Бренд", team:"Команда"
  })[k] || k;
}

function StaffEditor({ staff, onSave, onCancel }) {
  const { ROLES } = useStore();
  const [s, setS] = useS_a({ ...staff });
  const set = (k, v) => setS(x => ({...x, [k]: v}));
  const submit = () => {
    if (!s.name || !s.email) { alert("Имя и e-mail обязательны"); return; }
    if (!s.id) s.id = "u-" + Date.now();
    onSave(s);
  };
  return (
    <AdminModal title={staff.name ? "Редактирование сотрудника" : "Новый сотрудник"} onClose={onCancel}>
      <div className="field"><label>Имя и фамилия</label>
        <input value={s.name} onChange={e=>set("name",e.target.value)} placeholder="Анна Соколова"/></div>
      <div className="field"><label>E-mail (логин)</label>
        <input type="email" value={s.email} onChange={e=>set("email",e.target.value)} placeholder="anna@sandler.atelier"/></div>
      <div className="field"><label>Роль</label>
        <select value={s.role} onChange={e=>set("role",e.target.value)}>
          {Object.entries(ROLES).map(([k,r])=>(<option key={k} value={k}>{r.label} — {r.desc}</option>))}
        </select></div>
      {!staff.name && (
        <div className="field"><label>Временный пароль</label>
          <input type="text" value={s.password} onChange={e=>set("password",e.target.value)} placeholder="мин. 8 символов"/>
          <small style={{fontSize:11,color:"#999"}}>Сотрудник сможет сменить пароль после первого входа.</small></div>
      )}
      <label className="login-check" style={{margin:"0 0 24px",color:"#444"}}>
        <input type="checkbox" checked={s.active} onChange={e=>set("active", e.target.checked)}/>
        <span className="login-check-box" style={{background:s.active?"#0b0b0b":"#fff",borderColor:s.active?"#0b0b0b":"#b5b0a6"}}></span>
        <span>Активен · может входить в админку</span>
      </label>
      <div style={{display:"flex",gap:10,paddingTop:16,borderTop:"1px solid #e8e6e3"}}>
        <button className="admin-btn gold" onClick={submit}>Сохранить</button>
        <button className="admin-btn ghost" onClick={onCancel}>Отмена</button>
      </div>
    </AdminModal>
  );
}

function PasswordModal({ staff, onSave, onClose }) {
  const [p1, setP1] = useS_a("");
  const [p2, setP2] = useS_a("");
  const submit = () => {
    if (p1.length < 6) { alert("Пароль слишком короткий"); return; }
    if (p1 !== p2) { alert("Пароли не совпадают"); return; }
    onSave(p1);
  };
  return (
    <AdminModal title={`Смена пароля · ${staff.name}`} onClose={onClose}>
      <div className="field"><label>Новый пароль</label>
        <input type="password" value={p1} onChange={e=>setP1(e.target.value)} placeholder="мин. 6 символов" autoFocus/></div>
      <div className="field"><label>Повторите</label>
        <input type="password" value={p2} onChange={e=>setP2(e.target.value)}/></div>
      <div style={{padding:"12px 14px",background:"#fff5cc",borderLeft:"2px solid var(--gold)",fontSize:12,color:"#7a5a00",marginBottom:18}}>
        Сотруднику будет отправлено письмо на <b>{staff.email}</b> с уведомлением о смене пароля.
      </div>
      <div style={{display:"flex",gap:10,paddingTop:16,borderTop:"1px solid #e8e6e3"}}>
        <button className="admin-btn gold" onClick={submit}>Сменить пароль</button>
        <button className="admin-btn ghost" onClick={onClose}>Отмена</button>
      </div>
    </AdminModal>
  );
}

// ────────────────────────────────────────────────────────────
// Shell
// ────────────────────────────────────────────────────────────
function Admin() {
  const [logged, setLogged] = useS_a(false);
  const [tab, setTab] = useS_a("dashboard");
  const { navigate, currentStaff, staff, can, setCurrentStaffId, ROLES } = useStore();

  if (!logged) return <AdminLogin onLogin={()=>setLogged(true)}/>;

  const ALL_TABS = [
    ["dashboard",   "Сводка",     "dashboard"],
    ["orders",      "Заказы",     "orders"],
    ["products",    "Товары",     "products"],
    ["looks",       "Образы",     "looks"],
    ["collections", "Коллекции",  "collections"],
    ["pages",       "Страницы",   "pages"],
    ["brand",       "Бренд",      "brand"],
    ["team",        "Команда",    "team"],
  ];
  const visibleTabs = ALL_TABS.filter(([,,perm]) => can(perm));
  const activeTab = visibleTabs.find(t => t[0] === tab) ? tab : (visibleTabs[0]?.[0] || "dashboard");

  return (
    <div className="admin">
      <aside className="admin-side">
        <div className="admin-side-head">
          <span className="admin-side-eyebrow">SA · Управление</span>
        </div>

        <nav>
          {visibleTabs.map(([v,l])=>(
            <button key={v} className={activeTab===v?"active":""} onClick={()=>setTab(v)}>{l}</button>
          ))}
        </nav>

        <div className="admin-side-foot">
          <div className="admin-user">
            <div className="admin-user-name">{currentStaff?.name || "—"}</div>
            <div className="admin-user-role">{ROLES[currentStaff?.role]?.label || "Сотрудник"}</div>
          </div>

          {/* View-as switcher (demo) */}
          <div className="admin-view-as">
            <label>Просмотр как · demo</label>
            <select value={currentStaff?.id || ""} onChange={e=>{setCurrentStaffId(e.target.value);setTab("dashboard");}}>
              {staff.filter(s=>s.active).map(s => (
                <option key={s.id} value={s.id}>{s.name} · {ROLES[s.role].label}</option>
              ))}
            </select>
          </div>

          <button className="admin-btn ghost" style={{width:"100%",padding:"10px",marginTop:14}} onClick={()=>navigate("home")}>← К сайту</button>
          <button className="admin-btn ghost" style={{width:"100%",padding:"10px",marginTop:6,color:"#a00",borderColor:"#a00"}} onClick={()=>setLogged(false)}>Выйти</button>
        </div>
      </aside>
      <main className="admin-main">
        {activeTab === "dashboard"   && <AdminDashboard goTab={setTab}/>}
        {activeTab === "orders"      && <AdminOrders/>}
        {activeTab === "products"    && <AdminProducts/>}
        {activeTab === "looks"       && <AdminLooks/>}
        {activeTab === "collections" && <AdminCollections/>}
        {activeTab === "pages"       && <AdminPages/>}
        {activeTab === "brand"       && <AdminBrand/>}
        {activeTab === "team"        && <AdminTeam/>}
      </main>
    </div>
  );
}

window.Admin = Admin;
