/* ============================================================
   data.jsx — каталог подарков, кейсы, инвентарь, задания.

   ВАЖНО: массивы/объекты ниже теперь — ПУСТЫЕ КОНТЕЙНЕРЫ, которые
   заполняются данными с бэкенда при старте приложения (см. app.jsx,
   функция loadAll()). Ссылки (GIFTS, CASES, ...) остаются теми же —
   данные мутируются "в место" (length=0 + push / Object.assign), чтобы
   все giftById()/CASES.map() и т.п. по всему коду продолжали работать
   без изменений после загрузки.
   ============================================================ */

// Тиры редкости подарков (статика, не зависит от бэкенда)
const RARITY = {
  common:    { key:'common',    label:'Обычный',    color:'var(--r-common)',    hex:'#7d8896' },
  uncommon:  { key:'uncommon',  label:'Необычный',  color:'var(--r-uncommon)',  hex:'#4a9eff' },
  rare:      { key:'rare',      label:'Редкий',     color:'var(--r-rare)',      hex:'#9d6bff' },
  epic:      { key:'epic',      label:'Эпический',  color:'var(--r-epic)',      hex:'#e85aff' },
  legendary: { key:'legendary', label:'Легендарный',color:'var(--r-legendary)', hex:'#ffb340' },
};

// 🔌 BACKEND: GET /api/gifts — каталог подарков (id, title, emoji|image, rarity, ton)
const GIFTS = [];
const giftById = (id) => GIFTS.find(g => g.id === id) || { id, title:'?', emoji:'❓', rarity:'common', ton:0 };

// 🔌 BACKEND: GET /api/cases — список кейсов (id, title, emoji, priceTon, priceStar, pool[giftId])
const CASES = [];

// 🔌 BACKEND: GET /api/inventory — предметы пользователя (uid, giftId)
let INVENTORY_SEED = [];

// 🔌 BACKEND: GET /api/tasks — задания (id, type, title, desc, cta, reward, icon, link, done)
const TASKS = [];

// 🔌 BACKEND: GET /api/profile — профиль + статистика
const USER = {
  tgId: null,
  username: '',
  name: '',
  avatar: '',
  refCode: '',
  balanceTon: 0,
  balanceStar: 0,
  stats: { opened: 0, upgrades: 0, best: null, wonTon: 0 },
};

// 🔌 BACKEND: GET /api/history — лог операций (items[])
const HISTORY = [];

/** Форматирует ISO-дату в относительное время ("2 мин назад" и т.п.). */
function formatTs(iso){
  if(!iso) return '';
  const d = new Date(iso);
  const diff = Math.max(0, Date.now() - d.getTime());
  const min = Math.floor(diff/60000);
  if(min < 1) return 'только что';
  if(min < 60) return `${min} мин назад`;
  const hrs = Math.floor(min/60);
  if(hrs < 24) return `${hrs} ч назад`;
  const days = Math.floor(hrs/24);
  if(days === 1) return 'вчера';
  if(days < 7) return `${days} дн назад`;
  return d.toLocaleDateString('ru-RU');
}

/* Заметки для разработчика — показываются в панели </> Dev.
   Сгруппированы по экранам. Это карта бэкенд-интеграции для Claude Code. */
const DEV_NOTES = [
  { group:'Платформа / Telegram', items:[
    { n:1, t:'Инициализация', d:'Подключить Telegram WebApp SDK: telegram-web-app.js. Брать тему, цвета, initData.', code:'window.Telegram.WebApp' },
    { n:2, t:'Авторизация', d:'Валидировать initData на сервере (HMAC по bot token). TG ID = единственный идентификатор юзера.', code:'validateInitData()' },
    { n:3, t:'Хедер-баланс', d:'Баланс TON и Stars тянуть из API, обновлять после каждой операции (открытие/апгрейд/пополнение).', code:'GET /api/balance' },
  ]},
  { group:'Кейсы', items:[
    { n:4, t:'Список кейсов', d:'GET кейсы с ценой в TON и Stars (priceTon/priceStar) и пулом подарков (веса вероятностей на сервере). Цены задаются на бэке.', code:'GET /api/cases' },
    { n:5, t:'Открытие кейса', d:'Розыгрыш считает СЕРВЕР. Фронт шлёт open + выбранную валюту, получает выпавший giftId и только анимирует ленту до него.', code:'POST /api/cases/:id/open' },
    { n:6, t:'Списание', d:'Списать баланс выбранной валютой (TON или Stars) атомарно на сервере перед розыгрышем.', code:'tx: debit(cur) + draw' },
  ]},
  { group:'Инвентарь', items:[
    { n:7, t:'Список предметов', d:'GET инвентарь по TG ID. Каждый предмет — экземпляр (uid), а не тип.', code:'GET /api/inventory' },
    { n:8, t:'Продать', d:'Продажа предмета за TON по ton_value (или с комиссией). Возврат на баланс.', code:'POST /api/inventory/:uid/sell' },
    { n:9, t:'Вывести NFT', d:'Вывод реального Telegram-подарка/NFT на аккаунт. Очередь + статус транзакции.', code:'POST /api/withdraw' },
  ]},
  { group:'Апгрейдер', items:[
    { n:10, t:'Шанс апгрейда', d:'Шанс = (сумма ставки)/(стоимость цели) с мультипликатором. Считать на сервере, фронт показывает %.', code:'POST /api/upgrade/chance' },
    { n:11, t:'Результат', d:'Сервер решает win/lose и угол остановки стрелки. При win — выдать цель, при lose — сжечь ставку.', code:'POST /api/upgrade/play' },
  ]},
  { group:'Задания', items:[
    { n:12, t:'Проверка подписки', d:'Проверять членство в канале через Bot API getChatMember перед начислением.', code:'getChatMember' },
    { n:13, t:'Начисление Stars', d:'Идемпотентно начислять reward и помечать задание done. Защита от повторов.', code:'POST /api/tasks/:id/claim' },
    { n:14, t:'Рефералы', d:'Реф-ссылка вида t.me/bot?start=ref_<tgid>. Начислять при первом запуске приглашённого.', code:'start=ref_<id>' },
  ]},
  { group:'Профиль / Платежи', items:[
    { n:15, t:'Пополнение', d:'TON — через TON Connect / кошелёк; Stars — через Telegram invoices (XTR).', code:'TON Connect · invoice XTR' },
    { n:16, t:'История', d:'GET лог операций пользователя с пагинацией.', code:'GET /api/history' },
  ]},
];

Object.assign(window, {
  RARITY, GIFTS, giftById, CASES, INVENTORY_SEED, TASKS, USER, HISTORY, DEV_NOTES, formatTs,
});
