// data.jsx — default habits, storage, calculations

const DEFAULT_HABITS = [
  {
    id: 'tahajud', group: 'Tahajud', icon: '🌙',
    name: 'Sholat Tahajud 4 Rakaat + Witir 3 Rakaat', points: 70,
    addons: [
      { id: 'tahajud-rakaat', name: 'Tambah 4 Rakaat', points: 10 },
      { id: 'tahajud-dzikir', name: 'Dzikir + Doa', points: 10 },
      { id: 'tahajud-quran', name: 'Baca Quran 3 menit', points: 10 },
    ],
  },
  {
    id: 'dzikir-pagi', group: 'Dzikir Pagi', icon: '☀️',
    name: 'Dzikir Pagi 5 menit', points: 90,
    addons: [
      { id: 'dzikir-pagi-habis', name: 'Sampai habis', points: 10 },
    ],
  },
  {
    id: 'subuh', group: 'Subuh', icon: '🕌',
    name: 'Subuh di Masjid 2 Rakaat', points: 70,
    addons: [
      { id: 'subuh-qobliyah', name: '2 Rakaat Qobliyah', points: 10 },
      { id: 'subuh-dzikir', name: 'Dzikir + Doa', points: 10 },
      { id: 'subuh-quran', name: 'Baca Quran 3 menit', points: 10 },
    ],
  },
  {
    id: 'dhuha', group: 'Dhuha', icon: '🌅',
    name: 'Sholat Dhuha 4 Rakaat', points: 60,
    addons: [
      { id: 'dhuha-rakaat', name: 'Tambah 4 Rakaat', points: 10 },
      { id: 'dhuha-dzikir', name: 'Dzikir + Doa', points: 10 },
      { id: 'dhuha-quran', name: 'Baca Quran 3 menit', points: 10 },
    ],
  },
  {
    id: 'dzuhur', group: 'Dzuhur', icon: '🕌',
    name: 'Sholat Dzuhur 4 Rakaat di Masjid', points: 60,
    addons: [
      { id: 'dzuhur-qobliyah', name: 'Qobliyah 2 Rakaat', points: 10 },
      { id: 'dzuhur-badiyah', name: 'Badiyah 2 Rakaat', points: 10 },
      { id: 'dzuhur-dzikir', name: 'Dzikir + Doa', points: 10 },
      { id: 'dzuhur-quran', name: 'Baca Quran 3 menit', points: 10 },
    ],
  },
  {
    id: 'ashar', group: 'Ashar', icon: '🕌',
    name: 'Sholat Ashar 4 Rakaat di Masjid', points: 80,
    addons: [
      { id: 'ashar-dzikir', name: 'Dzikir + Doa', points: 10 },
      { id: 'ashar-quran', name: 'Baca Quran 3 menit', points: 10 },
    ],
  },
  {
    id: 'dzikir-sore', group: 'Dzikir Sore', icon: '🌇',
    name: 'Dzikir Sore 5 menit', points: 90,
    addons: [
      { id: 'dzikir-sore-habis', name: 'Sampai habis', points: 10 },
    ],
  },
  {
    id: 'puasa', group: 'Fisik', icon: '🍃',
    name: 'Buka Puasa Intermitten 16 Jam', points: 60,
    addons: [
      { id: 'puasa-tambah', name: 'Tambah 2 Jam', points: 10 },
    ],
  },
  {
    id: 'maghrib', group: 'Maghrib', icon: '🌆',
    name: 'Sholat Maghrib 3 Rakaat di Masjid', points: 70,
    addons: [
      { id: 'maghrib-badiyah', name: 'Badiyah 2 Rakaat', points: 10 },
      { id: 'maghrib-dzikir', name: 'Dzikir + Doa', points: 10 },
      { id: 'maghrib-quran', name: 'Baca Quran 3 menit', points: 10 },
    ],
  },
  {
    id: 'workout', group: 'Fisik', icon: '🏃',
    name: 'Workout 15 menit', points: 40,
    addons: [
      { id: 'workout-jalan', name: 'Jalan 6000 langkah', points: 10 },
      { id: 'workout-lagi', name: 'Workout 15 menit lagi', points: 10 },
    ],
  },
  {
    id: 'isya', group: 'Isya', icon: '🌃',
    name: 'Sholat Isya 4 Rakaat', points: 60,
    addons: [
      { id: 'isya-qobliyah', name: 'Qobliyah 2 Rakaat', points: 10 },
      { id: 'isya-badiyah', name: 'Badiyah 2 Rakaat', points: 10 },
      { id: 'isya-dzikir', name: 'Dzikir + Doa', points: 10 },
      { id: 'isya-quran', name: 'Baca Quran 3 menit', points: 10 },
    ],
  },
];

// ── Storage ─────────────────────────────────────────
const STORAGE_KEY = 'habit-ican-v1';

function loadState() {
  try {
    const raw = localStorage.getItem(STORAGE_KEY);
    if (!raw) return { habits: DEFAULT_HABITS, checks: {} };
    const parsed = JSON.parse(raw);
    return {
      habits: parsed.habits || DEFAULT_HABITS,
      checks: parsed.checks || {},
    };
  } catch (e) {
    return { habits: DEFAULT_HABITS, checks: {} };
  }
}
function saveState(state) {
  try { localStorage.setItem(STORAGE_KEY, JSON.stringify(state)); } catch {}
}

// ── Date utils ──────────────────────────────────────
function toDateKey(d) {
  const y = d.getFullYear();
  const m = String(d.getMonth() + 1).padStart(2, '0');
  const dd = String(d.getDate()).padStart(2, '0');
  return `${y}-${m}-${dd}`;
}
function parseDateKey(k) {
  const [y, m, d] = k.split('-').map(Number);
  return new Date(y, m - 1, d);
}
const DAYS_ID = ['Min', 'Sen', 'Sel', 'Rab', 'Kam', 'Jum', 'Sab'];
const DAYS_ID_LONG = ['Minggu', 'Senin', 'Selasa', 'Rabu', 'Kamis', 'Jumat', 'Sabtu'];
const MONTHS_ID = [
  'Januari', 'Februari', 'Maret', 'April', 'Mei', 'Juni',
  'Juli', 'Agustus', 'September', 'Oktober', 'November', 'Desember'
];
const MONTHS_ID_SHORT = ['Jan','Feb','Mar','Apr','Mei','Jun','Jul','Agu','Sep','Okt','Nov','Des'];

function formatDateLong(d) {
  return `${DAYS_ID_LONG[d.getDay()]}, ${d.getDate()} ${MONTHS_ID[d.getMonth()]}`;
}
function formatMonth(d) {
  return `${MONTHS_ID[d.getMonth()]} ${d.getFullYear()}`;
}
function isSameDay(a, b) {
  return a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate();
}
function daysInMonth(year, month) {
  return new Date(year, month + 1, 0).getDate();
}

// ── Calculations ────────────────────────────────────
function pointsForDay(habits, dayChecks) {
  let total = 0;
  let max = 0;
  for (const h of habits) {
    max += h.points;
    if (dayChecks?.[h.id]) total += h.points;
    for (const a of h.addons || []) {
      max += a.points;
      if (dayChecks?.[a.id]) total += a.points;
    }
  }
  return { total, max };
}
function gradeFor(pct) {
  if (pct >= 0.85) return 'A';
  if (pct >= 0.70) return 'B';
  if (pct >= 0.55) return 'C';
  if (pct >= 0.40) return 'D';
  return 'E';
}
function gradeColor(g) {
  return {
    A: '#1D5A47', B: '#3D8B6F', C: '#C99A3C',
    D: '#B86A3A', E: '#9C4A3C',
  }[g] || '#7A746B';
}
// Streak: consecutive days ending yesterday or today where day pct >= threshold
function computeStreak(habits, checks, today, threshold = 0.5) {
  let count = 0;
  let cur = new Date(today);
  // include today if already > 0
  const todayKey = toDateKey(cur);
  const todayPts = pointsForDay(habits, checks[todayKey]);
  if (todayPts.max > 0 && todayPts.total / todayPts.max >= threshold) {
    count++;
    cur.setDate(cur.getDate() - 1);
  } else {
    cur.setDate(cur.getDate() - 1);
  }
  // walk backwards
  for (let i = 0; i < 365; i++) {
    const key = toDateKey(cur);
    const dc = checks[key];
    if (!dc) break;
    const p = pointsForDay(habits, dc);
    if (p.max === 0 || p.total / p.max < threshold) break;
    count++;
    cur.setDate(cur.getDate() - 1);
  }
  return count;
}
// Per-habit streak (consecutive days, including today if done)
function habitStreak(habit, checks, today) {
  let count = 0;
  let cur = new Date(today);
  for (let i = 0; i < 365; i++) {
    const key = toDateKey(cur);
    if (checks[key]?.[habit.id]) count++;
    else if (i > 0) break; // allow today to be unchecked without breaking
    cur.setDate(cur.getDate() - 1);
  }
  return count;
}

Object.assign(window, {
  DEFAULT_HABITS, loadState, saveState,
  toDateKey, parseDateKey, formatDateLong, formatMonth,
  DAYS_ID, DAYS_ID_LONG, MONTHS_ID, MONTHS_ID_SHORT,
  isSameDay, daysInMonth,
  pointsForDay, gradeFor, gradeColor, computeStreak, habitStreak,
});
