// ---- Reward + Points helpers (shared by login-app.jsx and admin-app.jsx) ----
//
// Loaded as <script type="text/babel"> AFTER supabase-client.js (so `sb` exists)
// and BEFORE login-app.jsx / admin-app.jsx (so the helpers can be referenced).

const REDEMPTION_STATUS_LABEL = {
  pending:   "รออนุมัติ",
  approved:  "อนุมัติแล้ว",
  delivered: "จัดส่งแล้ว",
  rejected:  "ปฏิเสธ",
  cancelled: "ยกเลิก",
};

const REDEMPTION_STATUS_CLASS = {
  pending:   "pending",
  approved:  "active",
  delivered: "ok",
  rejected:  "miss",
  cancelled: "miss",
};

// statuses that "lock" points (block from being spent again)
const REDEMPTION_LOCKED_STATUSES = ["pending", "approved", "delivered"];

// lifetime = sum of all earned activity points.
// available = lifetime − locked  (locked includes pending+approved+delivered)
const computePoints = (activities, redemptions) => {
  const lifetime = (activities || []).reduce((s, x) => s + (x.points || 0), 0);
  const locked = (redemptions || [])
    .filter(r => REDEMPTION_LOCKED_STATUSES.includes(r.status))
    .reduce((s, r) => s + (r.cost_points_snapshot || 0), 0);
  return { lifetime, locked, available: Math.max(0, lifetime - locked) };
};

// Legacy LMS activity prefix kept for older activity rows and admin display.
const LMS_NAME_PREFIX = "LMS: ";

// Reward image lives in the same `avatars` bucket under rewards/ folder so we
// reuse existing public-read policies without provisioning a new bucket.
const REWARD_IMAGE_FOLDER = "rewards";
const rewardImagePath = (id) => `${REWARD_IMAGE_FOLDER}/${id}`;
const addCacheBust = (url, bust = "") => `${url}${bust ? `${url.includes("?") ? "&" : "?"}bust=${bust}` : ""}`;
const rewardImageSrc = (path, bust = "") => {
  if (!path) return null;
  if (/^https?:\/\//i.test(path) || path.startsWith("/")) return addCacheBust(encodeURI(path), bust);
  if (path.startsWith("photos/")) return addCacheBust(encodeURI(`/${path}`), bust);
  return addCacheBust(`${window.SUPABASE_URL}/storage/v1/object/public/avatars/${path}`, bust);
};

const REWARD_DEFAULT_IMAGES = [
  { match: "Start Buck", file: "Start Buck card.png" },
  { match: "เสื้อ Polo KTAXA", file: "เสื้อ Polo KTAXA.png" },
  { match: "กระเป๋า 14", file: "กระเป๋า 14” สีขาว หรือ:ฟ้า.jpg" },
  { match: "Central Card", file: "Central Card 500 บาท.jpg" },
  { match: "Cash back for food", file: "Cash back.jpg" },
  { match: "กระเป๋า 18", file: "กระเป๋า 18”.jpg" },
  { match: "ส่วนลดCourse", file: "ส่วนลดCourse พัฒนาตัวเอง (มูลค่า 1000 บาท.png" },
  { match: "Canva Pro", file: "แอป Canva.png" },
  { match: "ChatGPT Go", file: "ChatGPT.png" },
  { match: "Cash back", file: "Cash back.jpg" },
  { match: "ทริปต่างประเทศ", file: "ทริปต่างประเทศ.jpg" },
];

const rewardDefaultImageSrc = (reward) => {
  const name = reward?.name_th || "";
  const found = REWARD_DEFAULT_IMAGES.find(x => name.includes(x.match));
  return found ? encodeURI(`/photos/${found.file}`) : null;
};

const rewardDisplayImageSrc = (reward, bust = "") => (
  rewardImageSrc(reward?.image_path, bust) || rewardDefaultImageSrc(reward)
);

const CHALLENGE_IMAGE_FOLDER = "challenges";
const challengeImagePath = (id) => `${CHALLENGE_IMAGE_FOLDER}/${id}`;
const challengeImageSrc = (path, bust = "") => {
  if (!path) return null;
  return `${window.SUPABASE_URL}/storage/v1/object/public/avatars/${path}${bust ? `?bust=${bust}` : ""}`;
};

// Class-schedule posters live in the same `avatars` bucket under class-posters/.
const CLASS_POSTER_FOLDER = "class-posters";
const classPosterPath = (id) => `${CLASS_POSTER_FOLDER}/${id}`;
const classPosterSrc = (path, bust = "") => {
  if (!path) return null;
  return `${window.SUPABASE_URL}/storage/v1/object/public/avatars/${path}${bust ? `?bust=${bust}` : ""}`;
};

// Announcement/ads banner images live in the same `avatars` bucket under announcements/.
const ANNOUNCE_IMG_FOLDER = "announcements";
const announceImagePath = (id) => `${ANNOUNCE_IMG_FOLDER}/${id}`;
const announceImageSrc = (path, bust = "") => {
  if (!path) return null;
  return `${window.SUPABASE_URL}/storage/v1/object/public/avatars/${path}${bust ? `?bust=${bust}` : ""}`;
};

Object.assign(window, {
  REDEMPTION_STATUS_LABEL,
  REDEMPTION_STATUS_CLASS,
  REDEMPTION_LOCKED_STATUSES,
  LMS_NAME_PREFIX,
  computePoints,
  rewardImagePath,
  rewardImageSrc,
  rewardDefaultImageSrc,
  rewardDisplayImageSrc,
  challengeImagePath,
  challengeImageSrc,
  classPosterPath,
  classPosterSrc,
  announceImagePath,
  announceImageSrc,
});
