// shark service — content data + reusable QuoteForm
const { useState, useRef } = React;

const BRANDS = ["La Marzocco", "Jura", "Breville", "Gaggia", "Rancilio", "Rocket", "DeLonghi", "Sage", "Nuova Simonelli", "Saeco", "ECM", "Profitec"];

const PHONE_FMT = "+375 (44) 527-28-27";
const PHONE_TEL = "tel:+375445272827";

// Authentic coffee-equipment photography (Unsplash, free license).
const IMG_HOME = "https://images.unsplash.com/photo-1714415632243-079d9a86071a?auto=format&fit=crop&w=1100&q=80"; // home espresso machine making coffee
const IMG_PRO = "https://images.unsplash.com/photo-1581068106019-5aa70c6ab424?auto=format&fit=crop&w=1100&q=80"; // commercial multi-group machine
const IMG_GRINDER = "https://images.unsplash.com/photo-1698750578084-f420ac9bf111?auto=format&fit=crop&w=1100&q=80"; // electric coffee grinder, close view
const IMG_PORTAFILTER = "https://images.unsplash.com/photo-1475296204602-08d15839e95f?auto=format&fit=crop&w=1100&q=80"; // espresso flowing from group head
const IMG_ELEC = "https://images.unsplash.com/photo-1517077304055-6e89abbf09b0?auto=format&fit=crop&w=1100&q=80"; // circuit board / electronics
const IMG_TECH = "https://images.unsplash.com/photo-1536914561643-9e3a7a8d063d?auto=format&fit=crop&w=1100&q=80"; // customer drinking coffee in cafe

const SERVICES = [
{
  id: "descaling", icon: "droplet", tag: "Чаще всего заказывают", price: "от 130,00 Br.", img: IMG_HOME,
  title: "Техническое обслуживание кофемашины",
  desc: "Регулярное ТО — самый дешёвый способ продлить жизнь кофемашине. Мы удаляем накипь и кофейные масла, промываем заварочный узел и магистрали, проверяем уплотнения и узлы под нагрузкой и при необходимости меняем расходники.",
  solves: "Слабый напор, отсутствие пенки, мутную воду, посторонний привкус и риск внезапной поломки из-за накипи.",
  incl: ["Удаление накипи", "Чистка от кофейных масел", "ТО варочной группы", "Проверка прокладок и уплотнений", "Тест жёсткости воды"]
},
{
  id: "leak", icon: "wrench", tag: "Бизнес", price: "от 600,00 Br.", img: IMG_PRO,
  title: "Ремонт профессиональной кофемашины",
  desc: "Полный разбор профессиональной машины с удалением накипи изнутри: снимаем бойлер, группы и магистрали, очищаем каждый узел от минеральных отложений, меняем изношенные уплотнения и собираем машину с проверкой давления и температуры.",
  solves: "Сильную накипь, падение давления, протечки, нестабильную температуру и потерю производительности в час пик.",
  incl: ["Полный разбор машины", "Удаление накипи со всех узлов", "Чистка бойлера и групп", "Замена уплотнений и прокладок", "Сборка и калибровка давления", "Проверка давления и температуры"]
},
{
  id: "grinder", icon: "settings", tag: null, price: "от 50,00 Br.", img: IMG_GRINDER,
  title: "Ремонт и калибровка кофемолки",
  desc: "Тупые или сбитые жернова портят вкус задолго до того, как откажет сама машина. Мы меняем изношенные жернова, очищаем остаток, выравниваем держатель и настраиваем помол, чтобы доза и время экстракции попадали точно в цель.",
  solves: "Неравномерный помол, слабый или горчащий эспрессо, нестабильную дозу и потерю вкуса в чашке.",
  incl: ["Замена / заточка жерновов", "Выравнивание держателя", "Чистка от остатка", "Калибровка дозы и времени", "Проверка мотора и шестерён"]
},
{
  id: "electronics", icon: "cpu", tag: "Специалист", price: "от 100,00 Br.", img: IMG_ELEC,
  title: "Диагностика электроники и плат управления",
  desc: "Когда дисплей выдаёт ошибки, кнопки не реагируют или настройки не сохраняются — причина в плате управления, проводке или датчиках. Мы проводим диагностику на уровне платы, перепаиваем или меняем компоненты и восстанавливаем прошивку там, где это поддерживается.",
  solves: "Коды ошибок, неотзывчивые кнопки, сброс настроек, мигающий дисплей или «мёртвую» машину.",
  incl: ["Поиск неисправности на плате", "Тест датчиков и проводки", "Ремонт / замена компонентов", "Восстановление прошивки", "Полный тест функций"]
},
{
  id: "gasket", icon: "disc", tag: null, price: "от 50,00 Br.", img: IMG_PORTAFILTER,
  title: "Замена прокладок и уплотнений",
  desc: "Прокладки группы твердеют и усыхают от нагрева, нарушая герметичность между холдером и группой. Мы устанавливаем прокладки по спецификации OEM, чтобы холдер плотно вставал и держал давление.",
  solves: "Холдер не встаёт в рабочее положение, шипение при экстракции, подтёки вокруг группы.",
  incl: ["Замена прокладки группы", "Замена душевой сетки", "Уплотнения парового клапана", "Проверка посадки холдера", "Тест удержания давления"]
},
{
  id: "maintenance", icon: "calendarCheck", tag: "Абонемент", price: "По запросу", img: IMG_TECH,
  title: "Программа регулярного ТО",
  desc: "Самый дешёвый ремонт — тот, который не понадобился. По графику мы проводим декальцинацию, меняем расходники и проверяем машину под Вашу нагрузку — чтобы мелкий износ не превращался в поломку.",
  solves: "Неожиданные простои, внезапные счета за ремонт и постепенную потерю качества кофе.",
  incl: ["Плановые визиты", "Регулярная чистка и декальцинация", "Замена расходников", "Приоритетная запись", "Отчёт о состоянии после визита"]
}];


const STEPS = [
{ n: "1", title: "Заявка", icon: "clipboard", text: "Расскажите о марке, модели машины и что именно не так — через форму, по телефону или в Telegram. Займёт две минуты." },
{ n: "2", title: "Диагностика", icon: "search", text: "Мы проводим полную диагностику — на месте или в мастерской — и присылаем понятный фиксированный расчёт до начала работ." },
{ n: "3", title: "Ремонт", icon: "wrench", text: "Сертифицированный мастер выполняет ремонт оригинальными или OEM-деталями, а затем проверяет давление и температуру по спецификации производителя." },
{ n: "4", title: "Готово", icon: "checkCircle", text: "Мы возвращаем машину настроенной и готовой варить отличный кофе — с гарантией на ремонт." }];


const SYMPTOMS = [
{ icon: "waves", t: "Нет пенки, слабый эспрессо", d: "Проблемы с давлением, помолом или накипью портят экстракцию." },
{ icon: "droplet", t: "Подтекает вода", d: "Изношенные уплотнения, уставший насос или трещина в фитинге." },
{ icon: "thermometer", t: "Плохо греет", d: "Проблемы с ТЭНом, термостатом или термопредохранителем." },
{ icon: "alert", t: "Ошибки, кнопки не реагируют", d: "Неисправности платы, датчиков или проводки." }];


const WHYUS = [
{ icon: "award", t: "Сертифицированные мастера", d: "Каждый ремонт выполняет обученный сертифицированный специалист по кофемашинам." },
{ icon: "box", t: "Оригинальные и OEM-детали", d: "Мы ставим оригинальные или OEM-компоненты, чтобы машина работала и служила именно так, как задумал производитель." },
{ icon: "shield", t: "Гарантия по договору", d: "Гарантия на запчасти и работы прописана в договоре. Если ремонт не выдержал в течение гарантийного срока — переделаем бесплатно." },
{ icon: "zap", t: "Экспресс-ремонт", d: "Срочный ремонт — от 3 часов. Плановый идёт в порядке живой очереди и занимает от 1 до 3 дней; для бизнеса доступен приоритетный выезд." },
{ icon: "search", t: "Бесплатная диагностика", d: "Бесплатная диагностика и прозрачный расчёт до начала работ — и для бытовых кофемашин, и для профессиональных." },
{ icon: "receipt", t: "Честные цены", d: "Честные детализированные расчёты без скрытых платежей. Вы утверждаете цену до начала работ." }];


const FAQ = [
{ q: "Сколько стоит ремонт?", a: "Стоимость зависит от услуги и нужных деталей. Бесплатную диагностику и расчёт делаем до начала работ — и для бытовых кофемашин, и для профессиональных баров. Цену Вы утверждаете заранее, никаких сюрпризов в счёте." },
{ q: "Сколько это займёт времени?", a: "Экспресс-ремонт занимает от 3 часов. Плановый ремонт выполняется в порядке живой очереди — как правило, от 1 до 3 дней. Для кафе и ресторанов доступен приоритетный выезд в день обращения." },
{ q: "Какие марки Вы обслуживаете?", a: "Мы обслуживаем весь спектр бытовых, полупрофессиональных и профессиональных машин — La Marzocco, Jura, Breville, Gaggia, Rancilio, Rocket, DeLonghi, Sage, Nuova Simonelli и многие другие. Если Вашей марки нет в списке — просто спросите." },
{ q: "Выезд или привоз в мастерскую?", a: "И то, и другое. Мы выезжаем на место к профессиональным машинам и крупным агрегатам, а бытовую или полупрофессиональную машину удобно привезти к нам. Мы подскажем лучший вариант при записи. Обслуживаем Минск, регионы и всю Беларусь." },
{ q: "Что покрывает гарантия на ремонт?", a: "Гарантия на заменённые детали и выполненные работы прописана в договоре. Если отремонтированный узел выйдет из строя в течение гарантийного срока, мы переделаем работу бесплатно." },
{ q: "Вы используете оригинальные детали?", a: "Да. Мы стандартно используем оригинальные или OEM-детали производителя. Мы всегда укажем в расчёте, что именно ставим и почему, до начала работ." }];


const DIAGNOSE = [
{
  t: "Нет пара или слабый пар",
  sym: "Капучинатор не вспенивает молоко, пар идёт еле-еле или не идёт совсем.",
  do: "Декальцинация, чистка форсунок, ремонт или замена электромагнитного клапана подачи пара."
},
{
  t: "Горький или слабый кофе",
  sym: "Напиток без пенки, водянистый, отдаёт кислинкой или горчит.",
  do: "Комплексное ТО: снимаем накипь с ТЭНа, промываем заварочный блок от масел и заново настраиваем помол."
},
{
  t: "Не набирает давление",
  sym: "Машина громко гудит, но вода почти не идёт или льётся тонкой струйкой.",
  do: "Убираем воздушные пробки, чистим флоуметр, ремонтируем или меняем помпу."
},
{
  t: "Мелет, но не варит",
  sym: "Молотый кофе уходит в отходы, а в чашку напиток так и не попадает.",
  do: "Промываем гидросистему от кофейных масел и смазываем механизмы; при сильном износе меняем заварочный блок."
},
{
  t: "Не включается, не реагирует на кнопки",
  sym: "Дисплей тёмный, индикаторы погасли, на нажатия машина не отвечает.",
  do: "Проверяем питание, меняем сработавшие термопредохранители, ремонтируем силовую плату или блок питания."
},
{
  t: "Перестала молоть зёрна",
  sym: "Слышен скрежет или холостой гул мотора, зёрна не затягиваются в кофемолку.",
  do: "Достаём посторонние предметы, ультразвуком чистим жернова от жира, меняем жернова или ремонтируем мотор."
},
{
  t: "Течёт снизу",
  sym: "Под корпусом или поддоном регулярно собирается вода или готовый кофе.",
  do: "Меняем изношенные силиконовые трубки, уплотнительные кольца, сальники или треснувший поддон."
},
{
  t: "Горит код ошибки",
  sym: "Машина заблокирована, мигает индикация или на дисплее горит код (например, Error 8).",
  do: "Расшифровываем код, проверяем концевые выключатели и термодатчики, ремонтируем плату управления."
}];


// ---------- Reusable quote form with full validation ----------
function QuoteForm({ id, compact }) {
  const [vals, setVals] = useState({ name: "", phone: "", email: "", brand: "", problem: "", who: "Дом / личная" });
  const [errs, setErrs] = useState({});
  const [done, setDone] = useState(false);
  const [ref, setRef] = useState("");

  const set = (k) => (e) => {
    setVals((v) => ({ ...v, [k]: e.target.value }));
    if (errs[k]) setErrs((x) => ({ ...x, [k]: null }));
  };

  const validate = () => {
    const e = {};
    if (!vals.name.trim()) e.name = "Укажите Ваше имя";
    const phoneDigits = vals.phone.replace(/[^\d]/g, "");
    if (!vals.phone.trim()) e.phone = "Укажите номер телефона";else
    if (phoneDigits.length < 7) e.phone = "Похоже, номер указан неверно";
    if (vals.email.trim() && !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(vals.email)) e.email = "Введите корректный e-mail";
    if (!vals.problem.trim()) e.problem = "Коротко опишите, что не так";
    return e;
  };

  const submit = (ev) => {
    ev.preventDefault();
    const e = validate();
    setErrs(e);
    if (Object.keys(e).length) {
      const first = ev.currentTarget.querySelector(".qfield.invalid input, .qfield.invalid textarea");
      if (first) first.focus();
      return;
    }
    setRef("SF-" + Math.floor(100000 + Math.random() * 899999));
    setDone(true);
  };

  if (done) {
    return (
      <div className="qform">
        <div className="qform-success">
          <div className="mark"><Icon name="checkCircle" size={36} /></div>
          <h3>Заявка принята</h3>
          <p>Спасибо, {vals.name.split(" ")[0] || "Вы"}. Сертифицированный мастер перезвонит Вам в течение одного рабочего часа, чтобы согласовать диагностику.</p>
          <div className="ref">Номер заявки {ref}</div>
          <button className="btn btn-light btn-block" onClick={() => {setDone(false);setVals({ name: "", phone: "", email: "", brand: "", problem: "", who: "Дом / личная" });}}>Отправить ещё одну заявку</button>
        </div>
      </div>);

  }

  return (
    <form className="qform" onSubmit={submit} noValidate>
      {!compact &&
      <div className="qform-head">
          <strong>Закажите бесплатную диагностику</strong>
          <span>Без обязательств · расчёт до начала работ</span>
        </div>
      }
      <div className="qfield">
        <label>Для кого заявка?</label>
        <div className="qseg">
          {["Дом / личная", "Кафе / бизнес"].map((w) =>
          <button type="button" key={w} className={vals.who === w ? "active" : ""} onClick={() => setVals((v) => ({ ...v, who: w }))}>{w}</button>
          )}
        </div>
      </div>
      <div className="qrow">
        <div className={"qfield" + (errs.name ? " invalid" : "")}>
          <label htmlFor={id + "-name"}>Имя <span className="req">*</span></label>
          <input id={id + "-name"} value={vals.name} onChange={set("name")} placeholder="Анна Иванова" autoComplete="name" />
          <span className="err">{errs.name}</span>
        </div>
        <div className={"qfield" + (errs.phone ? " invalid" : "")}>
          <label htmlFor={id + "-phone"}>Телефон <span className="req">*</span></label>
          <input id={id + "-phone"} value={vals.phone} onChange={set("phone")} placeholder="+375 (29) 123-45-67" inputMode="tel" autoComplete="tel" />
          <span className="err">{errs.phone}</span>
        </div>
      </div>
      <div className="qrow">
        <div className={"qfield" + (errs.email ? " invalid" : "")}>
          <label htmlFor={id + "-email"}>E-mail</label>
          <input id={id + "-email"} value={vals.email} onChange={set("email")} placeholder="anna@email.com" inputMode="email" autoComplete="email" />
          <span className="err">{errs.email}</span>
        </div>
        <div className="qfield">
          <label htmlFor={id + "-brand"}>Марка / модель машины</label>
          <input id={id + "-brand"} value={vals.brand} onChange={set("brand")} placeholder="напр. Gaggia Classic Pro" list={id + "-brands"} />
          <datalist id={id + "-brands"}>{BRANDS.map((b) => <option key={b} value={b} />)}</datalist>
        </div>
      </div>
      <div className={"qfield" + (errs.problem ? " invalid" : "")}>
        <label htmlFor={id + "-problem"}>В чём проблема? <span className="req">*</span></label>
        <textarea id={id + "-problem"} value={vals.problem} onChange={set("problem")} placeholder="напр. Машина течёт снизу, порции слабые и без крема…" />
        <span className="err">{errs.problem}</span>
      </div>
      <button type="submit" className="btn btn-primary btn-lg btn-block">Оставить заявку</button>
      <p className="qform-note">
        Отправляя заявку, Вы соглашаетесь на связь по ремонту. Мы никогда не передаём Ваши данные.{" "}
        <strong className="qform-note-call">Предпочитаете позвонить? <a href={PHONE_TEL}>{PHONE_FMT}</a>.</strong>
      </p>
    </form>);

}

Object.assign(window, { SERVICES, STEPS, SYMPTOMS, WHYUS, FAQ, DIAGNOSE, BRANDS, QuoteForm, PHONE_FMT, PHONE_TEL });