"use client";

import { useRouter } from "next/navigation";
import { Pencil, Plus, Trash2, X } from "lucide-react";
import { useEffect, useState } from "react";
import { reachGoal } from "@/lib/analytics";
import { checkoutDisabled, deliveryQuoteKey, parseDeliveryQuote, type DeliveryQuote } from "@/lib/checkout-state";
import { useCart, useCartTotals } from "./cart-provider";

type Info = { hours?: { orders?: { start?: string; end?: string; note?: string } }; delivery?: { enabled?: boolean }; pickup?: { enabled?: boolean } } | null;
type SavedAddress = { id: number; label?: string | null; address: string; apartment?: string | null; floor?: string | null; intercom?: string | null; courierComment?: string | null; isDefault: boolean };
type AddressDraft = { id?: number; label: string; address: string; apartment: string; floor: string; intercom: string; courierComment: string; isDefault: boolean };
const emptyAddress: AddressDraft = { label: "", address: "", apartment: "", floor: "", intercom: "", courierComment: "", isDefault: false };

const CHECKOUT_ERRORS: Record<string, string> = {
  min_sum: "Сумма заказа меньше минимальной. Добавьте позиции или выберите самовывоз.",
  offhours: "Ресторан сейчас закрыт. Выберите другое время или самовывоз в рабочие часы.",
  zone_unknown: "По этому адресу доставка недоступна. Проверьте адрес или выберите самовывоз.",
  datetime_past: "Выбранное время уже прошло. Выберите другое время.",
  datetime_invalid: "Проверьте дату и время заказа.",
  pickup_disabled: "Самовывоз временно недоступен. Оформите доставку или позвоните в ресторан.",
  deferred_disabled: "Отложенные заказы временно недоступны. Оформите заказ на ближайшее время.",
  client_ref_conflict: "Эта заявка уже отправлена. Откроем её статус."
};

export function CheckoutForm({ ordersEnabled = true, pickupEnabled = true, deferredEnabled = true, marketingEnabled = false, pickupAddress }: { ordersEnabled?: boolean; pickupEnabled?: boolean; deferredEnabled?: boolean; marketingEnabled?: boolean; pickupAddress: string }) {
  const router = useRouter();
  const { items, clear, updatePriceSnapshots, orderComment, setOrderComment } = useCart();
  const totals = useCartTotals();
  const [status, setStatus] = useState<"idle" | "loading" | "error">("idle");
  const [message, setMessage] = useState("");
  const [method, setMethod] = useState<"delivery" | "pickup">("delivery");
  const [info, setInfo] = useState<Info>(null);
  const [customerName, setCustomerName] = useState("");
  const [customerPhone, setCustomerPhone] = useState("");
  const [addresses, setAddresses] = useState<SavedAddress[]>([]), [addressBookAvailable, setAddressBookAvailable] = useState<boolean | null>(null), [selectedAddressId, setSelectedAddressId] = useState<number | null>(null), [addressModal, setAddressModal] = useState(false), [addressDraft, setAddressDraft] = useState<AddressDraft>(emptyAddress), [addressBusy, setAddressBusy] = useState(false), [addressError, setAddressError] = useState(""), [guestAddress, setGuestAddress] = useState(""), [quote, setQuote] = useState<DeliveryQuote | null>(null), [quoteState, setQuoteState] = useState<"idle" | "loading" | "resolved" | "error">("idle"), [quoteStateKey, setQuoteStateKey] = useState(""), [quoteError, setQuoteError] = useState("");
  const [editDraft, setEditDraft] = useState<{ due?: string; method?: "delivery" | "pickup"; address?: string } | null>(null);
  useEffect(() => {
    try {
      const draft = JSON.parse(sessionStorage.getItem("kiln-order-edit-draft-v1") || "null");
      if (draft) { setEditDraft(draft); setGuestAddress(String(draft.address || "")); if (draft.method === "pickup" || draft.method === "delivery") setMethod(draft.method); }
    } catch { setEditDraft(null); }
  }, []);
  async function loadAddresses(preferredId?: number) {
    try {
      const response = await fetch("/api/account/addresses", { cache: "no-store" });
      if (response.status === 401) { setAddressBookAvailable(false); return; }
      if (!response.ok) throw new Error();
      const body = await response.json() as { addresses?: SavedAddress[] };
      const next = body.addresses || [];
      setAddressBookAvailable(true); setAddresses(next);
      setSelectedAddressId((current) => preferredId && next.some((item) => item.id === preferredId) ? preferredId : next.some((item) => item.id === current) ? current : next.find((item) => item.isDefault)?.id || next[0]?.id || null);
    } catch { setAddressBookAvailable(null); }
  }
  useEffect(() => { void loadAddresses(); }, []);
  useEffect(() => { fetch("/api/info").then((response) => response.ok ? response.json() : null).then((body) => setInfo(body?.ok ? body : null)).catch(() => setInfo(null)); }, []);
  useEffect(() => {
    fetch("/api/auth/me", { cache: "no-store" }).then((response) => response.ok ? response.json() : null).then((body) => {
      if (!body?.user) return;
      setCustomerName((value) => value || body.user.name || "");
      setCustomerPhone((value) => value || (body.user.phone ? `+${body.user.phone}` : ""));
    }).catch(() => undefined);
  }, []);
  // SBIS can disable a receive type dynamically (bot /api/info); combine with local flags.
  const deliveryAllowed = info?.delivery?.enabled !== false;
  const pickupAllowed = pickupEnabled && info?.pickup?.enabled !== false;
  useEffect(() => {
    if (method === "pickup" && !pickupAllowed) setMethod("delivery");
    if (method === "delivery" && !deliveryAllowed && pickupAllowed) setMethod("pickup");
  }, [method, pickupAllowed, deliveryAllowed]);
  const selectedAddress = addresses.find((item) => item.id === selectedAddressId) || null;
  const quoteAddress = selectedAddress?.address || guestAddress;
  const quoteKey = deliveryQuoteKey(quoteAddress, totals.subtotal);
  const currentQuoteState = quoteStateKey === quoteKey ? quoteState : "idle";
  const activeQuote = currentQuoteState === "resolved" && quote?.key === quoteKey ? quote : null;
  const activeQuoteError = currentQuoteState === "error" ? quoteError : "";
  useEffect(() => {
    if (method !== "delivery" || quoteAddress.trim().length < 5 || totals.subtotal <= 0) { setQuote(null); setQuoteStateKey(quoteKey); setQuoteState("idle"); setQuoteError(""); return; }
    const controller = new AbortController();
    setQuoteStateKey(quoteKey); setQuoteState("loading"); setQuoteError("");
    const timer = window.setTimeout(async () => {
      try {
        const response = await fetch("/api/delivery/quote", { method: "POST", headers: { "content-type": "application/json" }, body: JSON.stringify({ address: quoteAddress, orderTotal: totals.subtotal }), signal: controller.signal });
        const body = await response.json() as { error?: string; eligible?: boolean; zone?: { minOrder?: number; freeFrom?: number | null }; orderSubtotal?: number; shortfall?: number; deliveryFee?: number; totalWithDelivery?: number; message?: string };
        if (!response.ok && body.error !== "min_sum") throw new Error(body.message || "Не удалось рассчитать доставку.");
        setQuote(parseDeliveryQuote(body, totals.subtotal, quoteKey, response.ok));
        setQuoteState("resolved"); setQuoteError("");
      } catch (error) { if (!controller.signal.aborted) { setQuote(null); setQuoteState("error"); setQuoteError(error instanceof Error ? error.message : "Не удалось рассчитать доставку."); } }
    }, 350);
    return () => { window.clearTimeout(timer); controller.abort(); };
  }, [method, quoteAddress, quoteKey, totals.subtotal]);
  const hasUnavailableItems = totals.lines.some((line) => Boolean(line?.unavailable));
  const checkoutIsDisabled = checkoutDisabled({ status, method, itemCount: items.length, subtotal: totals.subtotal, hasUnavailableItems, address: quoteAddress, quote: activeQuote, quoteState: currentQuoteState });
  function editAddress(address?: SavedAddress) {
    setAddressError("");
    setAddressDraft(address ? { id: address.id, label: address.label || "", address: address.address, apartment: address.apartment || "", floor: address.floor || "", intercom: address.intercom || "", courierComment: address.courierComment || "", isDefault: address.isDefault } : { ...emptyAddress, isDefault: addresses.length === 0 });
    setAddressModal(true);
  }
  async function saveAddress() {
    if (addressBusy || addressDraft.address.trim().length < 5) return;
    setAddressBusy(true); setAddressError("");
    try {
      const response = await fetch("/api/account/addresses", { method: addressDraft.id ? "PATCH" : "POST", headers: { "content-type": "application/json" }, body: JSON.stringify(addressDraft) });
      const body = await response.json();
      if (!response.ok) throw new Error(body.message || "Не удалось сохранить адрес.");
      setSelectedAddressId(body.address.id); setAddressModal(false); await loadAddresses(body.address.id);
    } catch (error) { setAddressError(error instanceof Error ? error.message : "Не удалось сохранить адрес."); }
    finally { setAddressBusy(false); }
  }
  async function deleteAddress(id: number) {
    if (addressBusy || !window.confirm("Удалить сохранённый адрес?")) return;
    setAddressBusy(true);
    try {
      const response = await fetch("/api/account/addresses", { method: "DELETE", headers: { "content-type": "application/json" }, body: JSON.stringify({ id }) });
      if (!response.ok) throw new Error();
      if (selectedAddressId === id) setSelectedAddressId(null);
      setAddressModal(false); await loadAddresses();
    } catch { setAddressError("Не удалось удалить адрес."); }
    finally { setAddressBusy(false); }
  }
  if (!ordersEnabled) return <div className="card p-6"><h2 className="text-2xl">Приём заказов временно отключён</h2><p className="mt-3 muted">Мы скоро включим онлайн-заказ. Пока можно позвонить в ресторан или забронировать стол.</p></div>;

  async function submit(event: React.FormEvent<HTMLFormElement>) {
    event.preventDefault();
    if (checkoutIsDisabled) return;
    setStatus("loading");
    reachGoal("begin_checkout");
    const form = new FormData(event.currentTarget);
    const clientRefKey = "kiln-order-client-ref-v1";
    const clientRef = sessionStorage.getItem(clientRefKey) || crypto.randomUUID();
    sessionStorage.setItem(clientRefKey, clientRef);
    const payload = {
      clientRef,
      name: String(form.get("name") || ""),
      phone: String(form.get("phone") || ""),
      email: String(form.get("email") || ""),
      method,
      address: method === "delivery" ? selectedAddress?.address || String(form.get("address") || "") : "",
      apartment: method === "delivery" ? selectedAddress?.apartment || String(form.get("apartment") || "") : "",
      floor: method === "delivery" ? selectedAddress?.floor || String(form.get("floor") || "") : "",
      intercom: method === "delivery" ? selectedAddress?.intercom || String(form.get("intercom") || "") : "",
      courierComment: method === "delivery" ? selectedAddress?.courierComment || String(form.get("courierComment") || "") : "",
      orderComment,
      desiredTime: String(form.get("desiredTime") || ""),
      offerConsent: form.get("offerConsent") === "on",
      personalDataConsent: form.get("personalDataConsent") === "on",
      marketingConsent: marketingEnabled && form.get("marketingConsent") === "on",
      items
    };
    const response = await fetch("/api/order", { method: "POST", body: JSON.stringify(payload) });
    const data = (await response.json()) as { paymentUrl?: string | null; trackUrl?: string; clientRef?: string; orderId?: string; status?: string; message?: string; error?: string; items_actual?: { sbis_id: string; price?: number | null; available?: boolean; enough?: boolean; stock_left?: number | null; requested_qty?: number; shortfall_qty?: number }[] };
    if (response.ok) { if (!["pending_confirmation", "processing"].includes(data.status || "")) { clear(); sessionStorage.removeItem(clientRefKey); } router.push(`/order/${encodeURIComponent(data.clientRef || clientRef)}`); }
    else {
      setStatus("error");
      if (["price_mismatch", "stock_changed"].includes(data.error || "") && data.items_actual?.length) {
        updatePriceSnapshots(data.items_actual);
        const shortage = data.items_actual.find((item) => item.enough === false);
        setMessage(shortage ? `Наличие изменилось: запрошено ${shortage.requested_qty ?? "больше"}, доступно ${shortage.stock_left ?? 0}. Уменьшите количество в корзине.` : "Цена или наличие изменились. Данные корзины обновлены — проверьте состав и подтвердите заказ ещё раз.");
      } else if (data.error === "client_ref_conflict") {
        setMessage(CHECKOUT_ERRORS.client_ref_conflict);
        setTimeout(() => router.push(`/order/${encodeURIComponent(clientRef)}`), 1200);
      } else setMessage(data.message || CHECKOUT_ERRORS[data.error || ""] || "Заказ не создан. Проверьте данные и доступность позиций.");
    }
  }

  return (
    <>
    <form className="grid gap-6 lg:grid-cols-[1fr_360px]" onSubmit={submit}>
      <div className="card grid gap-4 p-5">
        <div className="rounded-md border border-kiln-flame/30 bg-kiln-flame/10 p-3 text-sm text-kiln-milk">Заказ создаётся в кассе ресторана. Ссылка на оплату появится после подтверждения заказа.</div>
        <h2 className="text-2xl">1. Контактные данные</h2>
        <div className="grid gap-4 sm:grid-cols-2">
          <label><span className="mb-1 block text-sm">Имя</span><input className="input" name="name" required minLength={2} value={customerName} onChange={(event) => setCustomerName(event.target.value)} /></label>
          <label><span className="mb-1 block text-sm">Телефон</span><input className="input" name="phone" type="tel" required inputMode="tel" pattern={"^[0-9+()\\-\\s]{10,32}$"} placeholder="+7 (___) ___-__-__" value={customerPhone} onChange={(event) => setCustomerPhone(event.target.value)} /></label>
        </div>
        <label><span className="mb-1 block text-sm">Email для чека (необязательно)</span><input className="input" name="email" type="email" /></label>
        <h2 className="pt-2 text-2xl">2. Способ получения</h2>
        <div className="grid gap-2 sm:grid-cols-2">
          <label className={`button button-secondary ${deliveryAllowed ? "cursor-pointer" : "cursor-not-allowed opacity-50"}`}><input type="radio" name="method" disabled={!deliveryAllowed} checked={method === "delivery"} onChange={() => deliveryAllowed && setMethod("delivery")} /> Доставка{deliveryAllowed ? "" : " — недоступна"}</label>
          <label className={`button button-secondary ${pickupAllowed ? "cursor-pointer" : "cursor-not-allowed opacity-50"}`}><input type="radio" name="method" disabled={!pickupAllowed} checked={method === "pickup"} onChange={() => pickupAllowed && setMethod("pickup")} /> Самовывоз{pickupAllowed ? "" : " — недоступен"}</label>
        </div>
        {info?.hours?.orders?.start && info?.hours?.orders?.end ? <p className="text-sm text-kiln-milk/60">Приём заказов: {info.hours.orders.start}–{info.hours.orders.end}{info.hours.orders.note ? ` · ${info.hours.orders.note}` : ""}.</p> : null}
        {method === "delivery" ? (
          <>
            <div className="grid gap-3">
              <div className="flex items-center justify-between gap-3"><h3 className="text-xl">Адрес</h3>{addressBookAvailable ? <button type="button" className="button button-secondary px-3 py-2" onClick={() => editAddress(selectedAddress || undefined)}><Pencil size={16} /> Редактировать</button> : null}</div>
              {selectedAddress ? <button type="button" className="rounded-md border border-white/10 bg-white/5 p-4 text-left" onClick={() => setAddressModal(true)}><strong>{selectedAddress.label || "Адрес доставки"}</strong><span className="mt-1 block text-kiln-milk/75">{[selectedAddress.address, selectedAddress.apartment ? `кв. ${selectedAddress.apartment}` : "", selectedAddress.floor ? `этаж ${selectedAddress.floor}` : "", selectedAddress.intercom ? `домофон ${selectedAddress.intercom}` : ""].filter(Boolean).join(", ")}</span></button> : addressBookAvailable ? <button type="button" className="button button-secondary w-fit" onClick={() => editAddress()}><Plus size={16} /> Добавить адрес</button> : <><input className="input" name="address" required value={guestAddress} onChange={(event) => setGuestAddress(event.target.value)} placeholder="Санкт-Петербург, улица, дом" /><div className="grid gap-4 sm:grid-cols-3"><input className="input" name="apartment" placeholder="Квартира" /><input className="input" name="floor" placeholder="Этаж" /><input className="input" name="intercom" placeholder="Домофон" /></div><label><span className="mb-1 block text-sm">Комментарий курьеру</span><textarea className="input min-h-24" name="courierComment" /></label></>}
              {activeQuoteError ? <p className="text-sm text-kiln-flame">{activeQuoteError}</p> : activeQuote ? <div className="grid gap-1 rounded-md border border-white/10 bg-white/5 p-3 text-sm text-kiln-milk/75"><p>Минимальная сумма заказа: <strong>{activeQuote.minOrder} ₽</strong></p><p>Стоимость доставки: <strong>{activeQuote.deliveryFee ? `${activeQuote.deliveryFee} ₽` : "бесплатно"}</strong></p><p>Бесплатная доставка: <strong>{activeQuote.freeFrom === null ? "порог не установлен" : `от ${activeQuote.freeFrom} ₽`}</strong></p>{activeQuote.shortfall > 0 ? <p className="text-kiln-flame">До минимальной суммы заказа не хватает <strong>{activeQuote.shortfall} ₽</strong></p> : null}</div> : quoteAddress.length >= 5 && currentQuoteState === "loading" ? <p className="text-sm text-kiln-milk/60">Рассчитываем стоимость доставки…</p> : null}
            </div>
          </>
        ) : null}
        <h2 className="pt-2 text-2xl">3. Время и комментарий</h2>
        <label><span className="mb-1 block text-sm">Комментарий</span><textarea className="input min-h-24" name="orderComment" maxLength={160} value={orderComment} onChange={(event) => setOrderComment(event.target.value)} /><span className="mt-1 block text-right text-xs muted">{orderComment.length}/160</span></label>
        {deferredEnabled ? <label><span className="mb-1 block text-sm">Желаемое время (необязательно)</span><input className="input" name="desiredTime" type="datetime-local" defaultValue={String(editDraft?.due || "").replace(" ", "T").slice(0, 16)} /></label> : null}
        {method === "pickup" ? <p className="rounded-md border border-white/10 bg-white/5 p-3 text-sm text-kiln-milk/80">Забрать заказ: <strong>{pickupAddress}</strong></p> : null}
        <label className="flex items-start gap-3 text-sm"><input className="mt-1 h-4 w-4" type="checkbox" name="offerConsent" required /> <span>Согласен с публичной офертой.</span></label>
        <label className="flex items-start gap-3 text-sm"><input className="mt-1 h-4 w-4" type="checkbox" name="personalDataConsent" required /> <span>Согласен на обработку персональных данных.</span></label>
        {marketingEnabled ? <label className="flex items-start gap-3 text-sm"><input className="mt-1 h-4 w-4" type="checkbox" name="marketingConsent" /> <span>Хочу получать новости и предложения КИЛН.</span></label> : null}
      </div>
      <aside className="card h-fit p-5">
        <h2 className="text-2xl">4. Состав и оплата</h2>
        <div className="mt-4 grid gap-2 text-sm">
          {totals.lines.map((line) => line ? <div key={line.dish.id} className="flex justify-between gap-3"><span>{line.quantity} × {line.dish.name}</span><strong className="shrink-0 whitespace-nowrap">{line.lineTotal}{"\u00a0"}₽</strong></div> : null)}
        </div>
        <div className="mt-4 grid gap-2 text-sm">
          <div className="flex justify-between"><span>Блюда</span><strong className="whitespace-nowrap">{totals.subtotal}{"\u00a0"}₽</strong></div>
          {method === "pickup" ? <div className="flex justify-between"><span>Самовывоз</span><strong className="whitespace-nowrap">бесплатно</strong></div> : activeQuote ? <><div className="flex justify-between"><span>Минимальная сумма</span><strong className="whitespace-nowrap">{activeQuote.minOrder}{"\u00a0"}₽</strong></div><div className="flex justify-between"><span>Доставка</span><strong className="whitespace-nowrap">{activeQuote.deliveryFee ? `${activeQuote.deliveryFee}\u00a0₽` : "бесплатно"}</strong></div><div className="flex justify-between"><span>Бесплатная доставка</span><strong className="text-right">{activeQuote.freeFrom === null ? "порог не установлен" : `от ${activeQuote.freeFrom}\u00a0₽`}</strong></div></> : currentQuoteState === "loading" ? <p className="text-kiln-milk/60">Рассчитываем условия доставки…</p> : null}
          {(method === "pickup" || activeQuote) ? <div className="flex justify-between border-t border-white/10 pt-3 text-lg"><span>Итого</span><strong className="whitespace-nowrap">{method === "delivery" && activeQuote ? activeQuote.totalWithDelivery : totals.subtotal}{"\u00a0"}₽</strong></div> : null}
        </div>
        {method === "delivery" && activeQuote?.shortfall ? <p className="mt-4 text-sm text-kiln-flame">До минимальной суммы заказа не хватает {activeQuote.shortfall} ₽.</p> : null}
        {hasUnavailableItems ? <p className="mt-4 text-sm text-kiln-flame">Исправьте недоступные позиции или количество в корзине.</p> : null}
        <button className="button button-primary mt-5 w-full" disabled={checkoutIsDisabled}>
          {status === "loading" ? "Переходим к оплате..." : "Перейти к оплате"}
        </button>
        {status === "error" ? <p className="mt-3 text-sm text-kiln-flame">{message}</p> : null}
      </aside>
    </form>
      {addressModal ? <div className="dish-modal" role="presentation" onMouseDown={(event) => event.target === event.currentTarget && !addressBusy && setAddressModal(false)}><section className="dish-modal-panel !block max-w-2xl" role="dialog" aria-modal="true" aria-labelledby="address-modal-title"><div className="dish-modal-content grid gap-5"><div className="flex items-center justify-between gap-3"><h2 id="address-modal-title" className="text-2xl">Адреса доставки</h2><button type="button" className="icon-button" onClick={() => setAddressModal(false)} aria-label="Закрыть"><X size={18} /></button></div>{addressError ? <p className="text-sm text-kiln-flame">{addressError}</p> : null}{addresses.length ? <div className="grid gap-2">{addresses.map((item) => <div key={item.id} className={`flex items-start justify-between gap-3 rounded-md border p-3 ${item.id === selectedAddressId ? "border-kiln-flame" : "border-white/10"}`}><button type="button" className="min-w-0 flex-1 text-left" onClick={() => { setSelectedAddressId(item.id); setAddressModal(false); }}><strong>{item.label || "Адрес доставки"}{item.isDefault ? " · основной" : ""}</strong><span className="mt-1 block text-sm text-kiln-milk/65">{item.address}</span></button><span className="flex gap-1"><button type="button" className="icon-button" onClick={() => editAddress(item)} aria-label="Изменить адрес"><Pencil size={16} /></button><button type="button" className="icon-button" onClick={() => void deleteAddress(item.id)} aria-label="Удалить адрес"><Trash2 size={16} /></button></span></div>)}</div> : null}<div className="grid gap-3 border-t border-white/10 pt-4"><div className="flex items-center justify-between gap-3"><h3 className="text-xl">{addressDraft.id ? "Изменить адрес" : "Добавить адрес"}</h3>{addressDraft.id ? <button type="button" className="button button-secondary px-3 py-2" onClick={() => { setAddressDraft({ ...emptyAddress, isDefault: addresses.length === 0 }); setAddressError(""); }}><Plus size={16} /> Новый адрес</button> : null}</div><div className="grid gap-3 sm:grid-cols-2"><input className="input sm:col-span-2" value={addressDraft.label} onChange={(event) => setAddressDraft({ ...addressDraft, label: event.target.value })} placeholder="Название, например Дом" /><input className="input sm:col-span-2" value={addressDraft.address} onChange={(event) => setAddressDraft({ ...addressDraft, address: event.target.value })} placeholder="Санкт-Петербург, улица, дом" /><input className="input" value={addressDraft.apartment} onChange={(event) => setAddressDraft({ ...addressDraft, apartment: event.target.value })} placeholder="Квартира" /><input className="input" value={addressDraft.floor} onChange={(event) => setAddressDraft({ ...addressDraft, floor: event.target.value })} placeholder="Этаж" /><input className="input" value={addressDraft.intercom} onChange={(event) => setAddressDraft({ ...addressDraft, intercom: event.target.value })} placeholder="Домофон" /><input className="input" value={addressDraft.courierComment} onChange={(event) => setAddressDraft({ ...addressDraft, courierComment: event.target.value })} placeholder="Комментарий курьеру" /></div><label className="flex items-center gap-2 text-sm"><input type="checkbox" checked={addressDraft.isDefault} onChange={(event) => setAddressDraft({ ...addressDraft, isDefault: event.target.checked })} /> Основной адрес</label><div className="flex flex-wrap justify-between gap-2">{addressDraft.id ? <button type="button" className="button button-danger" disabled={addressBusy} onClick={() => void deleteAddress(addressDraft.id!)}><Trash2 size={16} /> Удалить</button> : <span />}<button type="button" className="button button-primary" disabled={addressBusy || addressDraft.address.trim().length < 5} onClick={() => void saveAddress()}>{addressBusy ? "Сохраняем…" : "Сохранить"}</button></div></div></div></section></div> : null}
    </>
  );
}
