/** Định dạng hiển thị theo chuẩn Việt Nam. */
import { dayInTz } from "./period";

/** 12500000 → '12.500.000 ₫' */
export function formatVnd(amount: number | null | undefined): string {
  if (amount == null) return "—";
  return new Intl.NumberFormat("vi-VN", {
    style: "currency",
    currency: "VND",
    maximumFractionDigits: 0,
  }).format(amount);
}

/** Rút gọn cho thẻ số liệu và trục biểu đồ: 1250000000 → '1,25 tỷ'. */
export function formatVndShort(amount: number | null | undefined): string {
  if (amount == null) return "—";
  const abs = Math.abs(amount);
  if (abs >= 1_000_000_000) return `${trim(amount / 1_000_000_000)} tỷ`;
  if (abs >= 1_000_000) return `${trim(amount / 1_000_000)} tr`;
  if (abs >= 1_000) return `${trim(amount / 1_000)} n`;
  return String(amount);
}

function trim(value: number): string {
  return value
    .toFixed(2)
    .replace(/\.?0+$/, "")
    .replace(".", ",");
}

export function formatNumber(value: number | null | undefined): string {
  if (value == null) return "—";
  return new Intl.NumberFormat("vi-VN").format(value);
}

export function formatPercent(value: number | null | undefined, digits = 0): string {
  if (value == null) return "—";
  return `${value.toFixed(digits).replace(".", ",")}%`;
}

/** Dung lượng file cho người đọc: 184320 → '180 KB'. */
export function formatBytes(bytes: number | null | undefined): string {
  if (bytes == null) return "—";
  if (bytes < 1024) return `${bytes} B`;
  const kb = bytes / 1024;
  if (kb < 1024) return `${Math.round(kb)} KB`;
  return `${(kb / 1024).toFixed(1).replace(".", ",")} MB`;
}

/** '2026-08-10' → '10/08/2026' */
export function formatDate(isoDate: string | Date | null | undefined): string {
  if (!isoDate) return "—";
  // Mốc thời gian (Date) đổi sang ngày theo giờ Việt Nam — `toISOString()` cho ngày UTC, lệch một ngày từ 0h–7h sáng.
  const iso = typeof isoDate === "string" ? isoDate : dayInTz(isoDate);
  const [y, m, d] = iso.slice(0, 10).split("-");
  return `${d}/${m}/${y}`;
}

export function formatDateTime(value: Date | string | null | undefined): string {
  if (!value) return "—";
  const date = typeof value === "string" ? new Date(value) : value;
  return new Intl.DateTimeFormat("vi-VN", {
    timeZone: process.env.APP_TIMEZONE ?? "Asia/Ho_Chi_Minh",
    day: "2-digit",
    month: "2-digit",
    year: "numeric",
    hour: "2-digit",
    minute: "2-digit",
  }).format(date);
}

/** '2026-08' → 'Tháng 8/2026', '2026-Q3' → 'Quý 3/2026', '2026' → 'Năm 2026' */
export function formatPeriod(periodKey: string): string {
  if (/^\d{4}$/.test(periodKey)) return `Năm ${periodKey}`;
  const quarter = periodKey.match(/^(\d{4})-Q([1-4])$/);
  if (quarter) return `Quý ${quarter[2]}/${quarter[1]}`;
  const month = periodKey.match(/^(\d{4})-(\d{2})$/);
  if (month) return `Tháng ${Number(month[2])}/${month[1]}`;
  return periodKey;
}

export const STAGE_LABEL: Record<string, string> = {
  LEAD: 'KH "Sẽ"',
  PROSPECT: 'KH "Đang"',
  DEALER: "Đại lý",
};

export const ROLE_LABEL: Record<string, string> = {
  DIRECTOR: "Ban giám đốc",
  GDKV: "Giám đốc Khu vực",
  MANAGER: "Quản lý vùng",
  SALES: "Nhân viên kinh doanh",
};

export const PRODUCT_ROLE_LABEL: Record<string, string> = {
  CORE: "Chủ lực",
  POTENTIAL: "Tiềm năng",
  RECOVERY: "Khôi phục",
  NORMAL: "Thường",
};

export const ALERT_TYPE_LABEL: Record<string, string> = {
  DEALER_INACTIVE: "Đại lý ngừng lấy hàng",
  DEALER_REVENUE_DROP: "Đại lý giảm doanh thu",
  PRODUCT_NO_REVENUE: "Sản phẩm không có doanh thu",
  PRODUCT_VOLUME_DROP: "Sản phẩm giảm sản lượng",
  TERRITORY_NO_REVENUE: "Thị trường không có doanh thu",
  TERRITORY_REVENUE_DROP: "Thị trường tụt giảm",
  STAFF_UNDERPERFORM: "NVKD không đạt chỉ tiêu",
};

/** Nhãn trạng thái đơn — "Điều chỉnh" là đơn được người duyệt trả về cho NVKD sửa. */
export function orderStatusBadge(row: { status: string; needsRevision: boolean }) {
  if (row.status === "CANCELLED") return { label: "Huỷ", tone: "red" as const };
  if (row.status === "CONFIRMED") return { label: "Đã duyệt", tone: "green" as const };
  if (row.needsRevision) return { label: "Điều chỉnh", tone: "brand" as const };
  return { label: "Chờ duyệt", tone: "gold" as const };
}
