/**
 * dashboard.js — বধুবরণ জুয়েলার্স ERP
 * v4 (2026-06-08): Activity strip, shimmer loader,
 *   count-up animation, smarter error handling
 */

'use strict';

/* ═══════════════════════════════════════════
   CONSTANTS
═══════════════════════════════════════════ */
const TODAY   = new Date().toISOString().split('T')[0];
const VORI    = 11.664; // ১ ভরি = ১১.৬৬৪ গ্রাম

/* ═══════════════════════════════════════════
   HELPERS
═══════════════════════════════════════════ */

/** টাকা ফরম্যাট: ৳১,২৩,৪৫৬ */
function fmt(n) {
  if (n === null || n === undefined || isNaN(Number(n))) return '—';
  return '৳' + Number(n).toLocaleString('en-IN');
}

/** সংখ্যা ফরম্যাট (টাকা ছাড়া): ১,২৩৪ */
function fmtNum(n) {
  if (!n) return '০';
  return Number(n).toLocaleString('en-IN');
}

/** el-এ টেক্সট সেট করো */
function setText(id, val) {
  const el = document.getElementById(id);
  if (el) el.textContent = val;
}

/** el-এ style সেট করো */
function setStyle(id, prop, val) {
  const el = document.getElementById(id);
  if (el) el.style[prop] = val;
}

/** shimmer loading class remove */
function stopShimmer(id) {
  const el = document.getElementById(id);
  if (el) el.classList.remove('loading');
}

/**
 * Count-up animation — ব্যালেন্স সুন্দরভাবে গোনে
 * @param {string} id   — element id
 * @param {number} end  — final value
 * @param {number} dur  — duration ms (default 900)
 */
function countUp(id, end, dur = 900) {
  const el = document.getElementById(id);
  if (!el) return;
  stopShimmer(id);
  const start     = 0;
  const startTime = performance.now();
  function step(now) {
    const elapsed  = now - startTime;
    const progress = Math.min(elapsed / dur, 1);
    // easeOutCubic
    const ease     = 1 - Math.pow(1 - progress, 3);
    const current  = Math.round(start + (end - start) * ease);
    el.textContent = fmt(current);
    if (progress < 1) requestAnimationFrame(step);
    else el.textContent = fmt(end);
  }
  requestAnimationFrame(step);
}

/* ═══════════════════════════════════════════
   API CALLS
═══════════════════════════════════════════ */

/** ক্যাশ ব্যালেন্স লোড */
async function loadBalance() {
  try {
    const res  = await fetch('../api/cash/get_accounts.php');
    if (!res.ok) throw new Error('HTTP ' + res.status);
    const data = await res.json();
    let total  = 0;

    // Cash Module 2.0: {ok: true, accounts: [...]}
    if (data.ok && Array.isArray(data.accounts)) {
      total = data.accounts.reduce(
        (sum, a) => sum + Number(a.balance ?? a.current_balance ?? 0),
        0
      );
    }
    // Legacy: {success: true, data: {total_balance: X}}
    else if (data.success && data.data) {
      total = Number(data.data.total_balance || 0);
    }
    else {
      stopShimmer('heroAmount');
      setText('heroAmount', 'ডেটা পাওয়া যায়নি');
      return;
    }

    countUp('heroAmount', total);

  } catch (e) {
    console.error('[Balance]', e);
    stopShimmer('heroAmount');
    setText('heroAmount', '— সংযোগ ব্যর্থ —');
    setStyle('heroAmount', 'fontSize', '22px');
    setStyle('heroAmount', 'color', '#FCA5A5');
  }
}

/** আজকের আয়/ব্যয় সারাংশ */
async function loadSummary() {
  try {
    const url = `../api/cash/daily_summary.php?date=${TODAY}&from=${TODAY}&to=${TODAY}`;
    const res = await fetch(url);
    if (!res.ok) throw new Error('HTTP ' + res.status);
    const raw = await res.json();

    const d = raw.data ?? raw.summary ?? raw.result ?? raw;

    const inc = Number(
      d.total_in  ?? d.cash_in  ?? d.in_total ??
      d.income    ?? d.totalIn  ?? d.in       ?? 0
    );
    const exp = Number(
      d.total_out ?? d.cash_out ?? d.out_total ??
      d.expense   ?? d.totalOut ?? d.out      ?? 0
    );
    const net = inc - exp;

    setText('statIncome',  fmt(inc));
    setText('statExpense', fmt(exp));
    setText('statNet',     fmt(net));
    setStyle('statNet', 'color', net >= 0 ? '#10B981' : '#FCA5A5');

  } catch (e) {
    console.warn('[Summary]', e);
    ['statIncome', 'statExpense', 'statNet'].forEach(id => setText(id, '—'));
  }
}

/** স্বর্ণ রেট লোড */
async function loadGoldRates() {
  try {
    const res  = await fetch('../api/gold/get_rate.php?date=' + TODAY);
    if (!res.ok) throw new Error('HTTP ' + res.status);
    const data = await res.json();

    if (!data.success || !data.data) return;

    const r      = data.data;
    const grades = [
      { id: 'g24', gId: 'g24g', val: r.rate_24k },
      { id: 'g22', gId: 'g22g', val: r.rate_22k },
      { id: 'g21', gId: 'g21g', val: r.rate_21k },
      { id: 'g18', gId: 'g18g', val: r.rate_18k },
    ];

    grades.forEach(({ id, gId, val }) => {
      if (!val) return;
      const perGram = Number(val);
      const perVori = Math.round(perGram * VORI);
      setText(id,  fmt(perVori));
      setText(gId, 'প্রতি গ্রাম: ৳' + perGram.toLocaleString('en-IN'));
    });

  } catch (e) {
    console.warn('[GoldRate]', e);
  }
}

/**
 * আজকের activity strip:
 * বিক্রয়, ক্রয়, বন্ধক সংখ্যা ও পরিমাণ
 * — আপনার API endpoint অনুযায়ী URL পরিবর্তন করুন
 */
async function loadActivityStrip() {
  // ── বিক্রয় ──
  try {
    const res  = await fetch(`../api/sales/today_summary.php?date=${TODAY}`);
    if (res.ok) {
      const d = await res.json();
      const sd = d.data ?? d;
      setText('actSale',    fmt(sd.total_amount ?? sd.total ?? 0));
      setText('actSaleQty', fmtNum(sd.count ?? sd.qty ?? 0) + ' টি');
    }
  } catch (e) { /* silent */ }

  // ── ক্রয় ──
  try {
    const res  = await fetch(`../api/purchases/today_summary.php?date=${TODAY}`);
    if (res.ok) {
      const d = await res.json();
      const pd = d.data ?? d;
      setText('actPur',    fmt(pd.total_amount ?? pd.total ?? 0));
      setText('actPurQty', fmtNum(pd.count ?? pd.qty ?? 0) + ' টি');
    }
  } catch (e) { /* silent */ }

  // ── বন্ধক ──
  try {
    const res  = await fetch(`../api/pawn/active_summary.php`);
    if (res.ok) {
      const d = await res.json();
      const pw = d.data ?? d;
      setText('actPawn',    fmtNum(pw.active_count ?? pw.count ?? 0) + ' টি');
      setText('actPawnAmt', fmt(pw.total_amount ?? pw.total ?? 0));
    }
  } catch (e) { /* silent */ }
}

/* ═══════════════════════════════════════════
   REFRESH — সব একসাথে রিফ্রেশ
═══════════════════════════════════════════ */
function refreshAll() {
  // shimmer ফিরিয়ে দাও
  const el = document.getElementById('heroAmount');
  if (el) el.classList.add('loading');

  Promise.allSettled([
    loadBalance(),
    loadSummary(),
    loadGoldRates(),
    loadActivityStrip(),
  ]).then(() => {
    // refresh icon spin শেষ হওয়ার পর ঠিক হয়ে যাবে
  });
}

/* ═══════════════════════════════════════════
   LOGOUT
═══════════════════════════════════════════ */
function logout() {
  if (!confirm('লগআউট করবেন?')) return;
  fetch('../api/auth/logout.php')
    .finally(() => { window.location.href = 'login.html'; });
}

/* ═══════════════════════════════════════════
   INIT
═══════════════════════════════════════════ */
document.addEventListener('DOMContentLoaded', function () {

  // তারিখ সেট
  setText('heroDate', 'আপডেট: ' + TODAY);
  setText('goldDate', 'আজকের স্বর্ণ মূল্য — ' + TODAY);

  // সব লোড একসাথে
  Promise.allSettled([
    loadBalance(),
    loadSummary(),
    loadGoldRates(),
    loadActivityStrip(),
  ]);
});
