/* ============================================================
   adventures.jsx — раздел «Приключения»: 90 необычных микро-задач,
   выдаются по 3 в день. Набор дня фиксируется в state.adventures.day,
   выполненные — в state.adventures.done { id: iso }. Прогресс и данные
   живут в основном стейте (синхронизируются как весь планер).
   Регистрирует window.Screens.adventures.
   ============================================================ */
const React = window.React;
const { useState } = React;
const Icon = window.Icon;
const A = window.PlannerActions;

const ADVENTURE_TEXTS = [
  "Найди дом с тигровым окрасом",
  "Сдуй пыль со шкафа ватной палочкой",
  "Съешь три зелёных сладости",
  "Найди облако, похожее на животное, и сфотографируй его",
  "Отыщи в городе три двери разного цвета",
  "Найди самую старую вывеску в своём районе",
  "Отыщи граффити, которое заставит тебя улыбнуться",
  "Найди дерево, которое обхватят только два человека",
  "Отыщи балкон, заросший цветами, как джунгли",
  "Найди номер дома, совпадающий с твоим возрастом",
  "Поздоровайся вслух с уличным котом",
  "Найди лужу, в которой отражается небо, и сфотографируй",
  "Пройди 100 шагов задом наперёд в безопасном месте",
  "Целый час носи что-то надетое наизнанку и никому не говори",
  "Напиши записку и спрячь её в библиотечной книге",
  "Построй башню из всего, что найдёшь на столе",
  "Полей растение и скажи ему что-нибудь приятное",
  "Поменяй местами две картины или предмета и живи так день",
  "Оставь монетку на видном месте для случайного прохожего",
  "Нарисуй лицо на яйце и представь его новым другом",
  "Сложи оригами и подари первому встречному",
  "Попробуй фрукт, который никогда раньше не ел",
  "Позавтракай в необычном месте квартиры — на полу или подоконнике",
  "Собери бутерброд из пяти этажей",
  "Выпей воду из красивого бокала, будто это дорогое вино",
  "Съешь что-нибудь с закрытыми глазами, смакуя вкус",
  "Добавь в чай специю, которую раньше в чай не клал",
  "Устрой себе ужин при свечах в одиночестве, как в ресторане",
  "Найди и попробуй незнакомую сладость из другой страны",
  "Съешь мороженое посреди рабочего дня без всякого повода",
  "Нарисуй свой день одной линией, не отрывая ручку от бумаги",
  "Придумай имя облаку за окном",
  "Сочини четверостишие про свой холодильник",
  "Сфотографируй за день десять оттенков одного цвета",
  "Придумай супергероя из обычного бытового предмета",
  "Нарисуй левую руку правой рукой",
  "Составь плейлист из песен, которые пахли бы кофе",
  "Придумай новое слово и вверни его в разговор",
  "Сделай коллаж из трёх случайных обрывков бумаги",
  "Придумай тайное имя для своего дома",
  "Собери мини-гербарий из пяти разных листьев",
  "Пять минут послушай пение птиц с закрытыми глазами",
  "Пройди по улице, наступая только на тени",
  "Найди камень идеально круглой формы",
  "Понаблюдай за муравьём целую минуту",
  "Собери букет из того, что растёт под ногами",
  "Найди самое высокое дерево в округе и задери голову",
  "Поймай ладонью солнечный зайчик",
  "Найди паутину и рассмотри её узор вблизи",
  "Погладь кору трёх разных деревьев",
  "Посиди пять минут в полной тишине, слушая только себя",
  "Запиши три звука своего дома на телефон",
  "Постучи по разным предметам и найди самый приятный звук",
  "Спой любимую песню шёпотом от начала до конца",
  "Услышь, как тикают часы, которые обычно не замечаешь",
  "Сделай искренний комплимент незнакомцу",
  "Уступи кому-нибудь место и понаблюдай за реакцией",
  "Позвони старому другу без всякого повода",
  "Поблагодари человека, которого давно хотел поблагодарить",
  "Улыбнись пяти прохожим и посчитай ответные улыбки",
  "Расскажи кому-нибудь историю из своего детства",
  "Спроси у пожилого человека совет о жизни",
  "Оставь доброе послание на стикере в людном месте",
  "Придержи дверь незнакомцу и пожелай хорошего дня",
  "Напиши письмо себе в будущее",
  "Потанцуй одну целую песню так, будто никто не видит",
  "Потянись, как кошка, только что проснувшаяся",
  "Дойди до знакомого места новым маршрутом",
  "Устрой пятиминутную прогулку совсем без телефона",
  "Полежи на полу и просто подыши десять минут",
  "Пройдись босиком по траве или по полу дома",
  "Сделай десять глубоких вдохов у открытого окна",
  "Пройди пешком часть пути, который обычно едешь",
  "Наведи идеальный порядок на одной маленькой полке",
  "Найди вещь, которой не пользовался год, и реши её судьбу",
  "Зажги свечу и посмотри на пламя пять минут",
  "Перевесь одежду в шкафу по цветам радуги",
  "Найди самую старую вещь в доме и вспомни её историю",
  "Свари какао и укутайся в плед среди бела дня",
  "Открой окно и впусти свежий воздух на десять минут",
  "Придумай альтернативную биографию случайному прохожему",
  "Весь день отвечай на «как дела» как-нибудь необычно",
  "Загадай желание на первой увиденной сегодня звезде",
  "Найди предмет, который поместится в спичечный коробок, и сохрани",
  "Сыграй сам с собой в игру «пол — это лава»",
  "Составь список из десяти вещей, за которые благодарен сегодня",
  "Проживи час так, будто ты турист в собственном городе",
  "Найди зеркало на улице и подмигни себе",
  "Собери коллекцию из пяти интересных этикеток",
  "Сделай сегодняшний день лучше, чем он начался, одним маленьким делом",
];
const ADVENTURES = ADVENTURE_TEXTS.map((text, i) => ({ id: "adv" + (i + 1), text }));
window.ADVENTURES = ADVENTURES;

/* серия дней подряд, в которые было выполнено хотя бы одно приключение */
function advStreak(done) {
  const days = new Set(Object.values(done || {}));
  const has = (i) => days.has(window.isoDaysAgo(i));
  let start = has(0) ? 0 : (has(1) ? 1 : null);
  if (start === null) return 0;
  let streak = 0;
  for (let i = start; i < 3650; i++) { if (has(i)) streak++; else break; }
  return streak;
}
function dmIso(iso) { return iso ? iso.slice(8, 10) + "." + iso.slice(5, 7) : ""; }

/* карточка одного приключения */
function AdventureCard({ item, doneIso, hero }) {
  return (
    <div className={"adv-card" + (doneIso ? " adv-card--done" : "") + (hero ? " adv-card--hero" : "")}>
      <div className="adv-card__label">Приключение</div>
      <div className="adv-card__text">{item.text}</div>
      {doneIso ? (
        <div className="adv-card__done">
          <span className="adv-card__doneby"><Icon name="check" size={13} /> выполнено {dmIso(doneIso)}</span>
          <button className="adv-undo" onClick={() => A.uncompleteAdventure(item.id)}>отменить</button>
        </div>
      ) : (
        <button className="adv-do" onClick={() => A.completeAdventure(item.id)}><Icon name="check" size={14} />Выполнить</button>
      )}
    </div>
  );
}

function AdventuresScreen({ state }) {
  const Cmp = window;
  const adv = state.adventures || { done: {} };
  const done = adv.done || {};
  const [showAll, setShowAll] = useState(false);

  /* набор дня выводится ДЕТЕРМИНИРОВАННО из даты (без записи в стор — иначе
     запись на mount гонялась бы с loadServerState). Каждый день окно из 3
     сдвигается на 3, за 30 дней проходятся все 90 без повторов. */
  const total = ADVENTURES.length;
  const dayNum = Math.floor(new Date(window.todayISO() + "T00:00:00").getTime() / 86400000);
  const start = ((dayNum * 3) % total + total) % total;
  const today = [0, 1, 2].map((k) => ADVENTURES[(start + k) % total]);
  const doneCount = Object.keys(done).length;
  const doneToday = today.filter((a) => done[a.id]).length;
  const allDone = doneCount >= total;
  const streak = advStreak(done);

  return (
    <div className="page page--wide screen-enter">
      <div className="page-head">
        <div className="page-head__titles">
          <div className="kicker-row"><span className="eyebrow-mono">По 3 в день</span><span className="date-stamp">{doneCount} / {total} пройдено</span></div>
          <h1 className="page-title">Приключения</h1>
        </div>
      </div>

      {/* сводка */}
      <div className="task" style={{ display: "flex", alignItems: "center", gap: "var(--s-6)", padding: "var(--s-5)", marginBottom: "var(--s-6)", flexWrap: "wrap" }}>
        <div><div className="e-label">Пройдено всего</div><div className="ring-total" style={{ fontSize: 34 }}>{doneCount}<span style={{ fontSize: "0.5em", color: "var(--text-muted)", fontWeight: 400 }}> / {total}</span></div></div>
        <div className="section-rule__line" />
        <div><div className="e-label">Сегодня</div><div className="ring-total" style={{ fontSize: 34, color: doneToday >= today.length && today.length ? "var(--signal)" : "inherit" }}>{doneToday} / {today.length || 3}</div></div>
        <div className="section-rule__line" />
        <div><div className="e-label">Серия дней</div><div className="ring-total" style={{ fontSize: 34 }}>{streak}<Icon name="flame" size={22} style={{ display: "inline", color: "var(--signal)", verticalAlign: "0", marginLeft: 4 }} /></div></div>
      </div>

      {/* приключения дня */}
      <Cmp.SectionRule kicker="Сегодня">Приключения дня</Cmp.SectionRule>
      {allDone ? (
        <div className="ach-blank">
          <Icon name="flame" size={34} />
          <div className="ach-blank__title">Все 90 приключений пройдены!</div>
          <div className="muted" style={{ fontSize: "var(--t-small)" }}>Ты настоящий искатель приключений. Можно пройтись по любимым ещё раз через список ниже.</div>
        </div>
      ) : (
        <div className="adv-hero">
          {today.map((a) => <AdventureCard key={a.id} item={a} doneIso={done[a.id]} hero />)}
        </div>
      )}
      {!allDone && doneToday >= today.length && today.length > 0 && (
        <div className="adv-alldone">На сегодня всё — новые приключения ждут завтра ✨</div>
      )}

      {/* весь список */}
      <div className="adv-showall">
        <button className="wq-link" onClick={() => setShowAll((v) => !v)}>{showAll ? "Скрыть все приключения" : "Показать все приключения (" + total + ")"}</button>
      </div>
      {showAll && (
        <div className="adv-list">
          {ADVENTURES.map((a, i) => (
            <div key={a.id} className={"adv-row" + (done[a.id] ? " adv-row--done" : "")}>
              <span className="adv-row__num mono">{i + 1}</span>
              <span className="adv-row__text">{a.text}</span>
              {done[a.id] ? (
                <button className="adv-row__btn adv-row__btn--done" onClick={() => A.uncompleteAdventure(a.id)} title="Отменить"><Icon name="check" size={14} /></button>
              ) : (
                <button className="adv-row__btn" onClick={() => A.completeAdventure(a.id)} title="Отметить выполненным"><Icon name="check" size={14} /></button>
              )}
            </div>
          ))}
        </div>
      )}
    </div>
  );
}

window.Screens = Object.assign(window.Screens || {}, { adventures: AdventuresScreen });
