/**
 * Định dạng số thành tiền tệ VND
 * @param {number} amount - Số tiền cần định dạng
 * @returns {string} Chuỗi đã định dạng theo tiền VND (ví dụ: 1.000.000 đ)
 */
export const formatCurrency = (amount) => {
  if (!amount && amount !== 0) return "";

  return new Intl.NumberFormat("vi-VN", {
    style: "currency",
    currency: "VND",
    minimumFractionDigits: 0,
    maximumFractionDigits: 0,
  }).format(amount);
};

/**
 * Định dạng số thành tiền tệ VND không có ký hiệu tiền tệ
 * @param {number} amount - Số tiền cần định dạng
 * @returns {string} Chuỗi đã định dạng (ví dụ: 1.000.000)
 */
export const formatNumber = (amount) => {
  if (!amount && amount !== 0) return "";

  return new Intl.NumberFormat("vi-VN", {
    minimumFractionDigits: 0,
    maximumFractionDigits: 0,
  }).format(amount);
};

/**
 * Chuyển chuỗi tiền tệ thành số
 * @param {string} str - Chuỗi tiền tệ cần chuyển đổi
 * @returns {number} Số tiền
 */
export const parseCurrency = (str) => {
  if (!str) return 0;
  return Number(str.replace(/[^0-9-]+/g, ""));
};

/**
 * Định dạng số thành tiền tệ VND với tùy chọn
 * @param {number} amount - Số tiền cần định dạng
 * @param {Object} options - Tùy chọn định dạng
 * @returns {string} Chuỗi đã định dạng
 */
export const formatCurrencyWithOptions = (amount, options = {}) => {
  const defaultOptions = {
    showSymbol: true, // Hiển thị ký hiệu tiền tệ
    symbolPosition: "end", // 'start' hoặc 'end'
    separator: ".", // Dấu phân cách hàng nghìn
    decimal: ",", // Dấu thập phân
    precision: 0, // Số chữ số thập phân
    symbol: "đ", // Ký hiệu tiền tệ
  };

  const settings = { ...defaultOptions, ...options };

  let result = new Intl.NumberFormat("vi-VN", {
    minimumFractionDigits: settings.precision,
    maximumFractionDigits: settings.precision,
    useGrouping: true,
  }).format(amount);

  if (settings.showSymbol) {
    result =
      settings.symbolPosition === "start"
        ? `${settings.symbol}${result}`
        : `${result}${settings.symbol}`;
  }

  return result;
};

/**
 * Chuyển đổi số thành chữ tiếng Việt
 * @param {number} amount - Số tiền cần chuyển đổi
 * @returns {string} Chuỗi chữ tiếng Việt
 */
export const numberToWords = (amount) => {
  const units = [
    "",
    "một",
    "hai",
    "ba",
    "bốn",
    "năm",
    "sáu",
    "bảy",
    "tám",
    "chín",
  ];
  const positions = ["", "nghìn", "triệu", "tỷ", "nghìn tỷ", "triệu tỷ"];

  if (amount === 0) return "không";
  if (!amount) return "";

  const convertGroup = (n) => {
    let str = "";
    const hundreds = Math.floor(n / 100);
    const tens = Math.floor((n % 100) / 10);
    const ones = n % 10;

    if (hundreds > 0) {
      str += `${units[hundreds]} trăm `;
    }
    if (tens > 0) {
      str += tens === 1 ? "mười " : `${units[tens]} mươi `;
    }
    if (ones > 0) {
      str += units[ones];
    }
    return str.trim();
  };

  const groups = [];
  let temp = Math.abs(amount);
  while (temp > 0) {
    groups.push(temp % 1000);
    temp = Math.floor(temp / 1000);
  }

  let result = "";
  for (let i = groups.length - 1; i >= 0; i--) {
    if (groups[i] !== 0) {
      result += `${convertGroup(groups[i])} ${positions[i]} `;
    }
  }

  result = result.trim() + " đồng";
  return amount < 0 ? `âm ${result}` : result;
};

/**
 * Định dạng thời gian theo định dạng tiếng Việt
 * @param {string|Date} date - Thời gian cần định dạng
 * @returns {string} Chuỗi thời gian đã định dạng (ví dụ: 20/03/2024 15:30)
 */
export const formatDateTime = (date) => {
  if (!date) return "";

  const d = new Date(date);
  if (isNaN(d.getTime())) return "";

  return d.toLocaleString("vi-VN", {
    day: "2-digit",
    month: "2-digit",
    year: "numeric",
    hour: "2-digit",
    minute: "2-digit",
    hour12: false,
  });
};
