/**
 * Các hàm tiện ích cho chức năng đối soát
 */

/**
 * Format số tiền theo định dạng VND
 * @param {number} amount - Số tiền cần format
 * @returns {string} Số tiền đã format
 */
export function formatCurrency(amount) {
  if (amount === null || amount === undefined || isNaN(amount)) {
    return "0 ₫";
  }

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

/**
 * Format số tiền ngắn gọn (K, M, B)
 * @param {number} amount - Số tiền cần format
 * @returns {string} Số tiền đã format ngắn gọn
 */
export function formatCurrencyShort(amount) {
  if (amount === null || amount === undefined || isNaN(amount)) {
    return "0 ₫";
  }

  const absAmount = Math.abs(amount);
  const sign = amount < 0 ? "-" : "";

  if (absAmount >= 1000000000) {
    return `${sign}${(absAmount / 1000000000).toFixed(1)}B ₫`;
  } else if (absAmount >= 1000000) {
    return `${sign}${(absAmount / 1000000).toFixed(1)}M ₫`;
  } else if (absAmount >= 1000) {
    return `${sign}${(absAmount / 1000).toFixed(1)}K ₫`;
  } else {
    return `${sign}${absAmount} ₫`;
  }
}

/**
 * Format ngày theo định dạng Việt Nam (dd/MM/yyyy)
 * @param {string|Date} dateStr - Ngày cần format
 * @returns {string} Ngày đã format
 */
export function formatDate(dateStr) {
  if (!dateStr) return "";

  try {
    const date = new Date(dateStr);
    if (isNaN(date.getTime())) return "";

    return date.toLocaleDateString("vi-VN", {
      day: "2-digit",
      month: "2-digit",
      year: "numeric",
    });
  } catch (error) {
    console.error("Error formatting date:", error);
    return "";
  }
}

/**
 * Format ngày giờ theo định dạng Việt Nam (dd/MM/yyyy HH:mm)
 * @param {string|Date} dateStr - Ngày giờ cần format
 * @returns {string} Ngày giờ đã format
 */
export function formatDateTime(dateStr) {
  if (!dateStr) return "";

  try {
    const date = new Date(dateStr);
    if (isNaN(date.getTime())) return "";

    return date.toLocaleString("vi-VN", {
      day: "2-digit",
      month: "2-digit",
      year: "numeric",
      hour: "2-digit",
      minute: "2-digit",
    });
  } catch (error) {
    console.error("Error formatting datetime:", error);
    return "";
  }
}

/**
 * Format ngày giờ ngắn gọn (dd/MM HH:mm)
 * @param {string|Date} dateStr - Ngày giờ cần format
 * @returns {string} Ngày giờ đã format ngắn gọn
 */
export function formatDateTimeShort(dateStr) {
  if (!dateStr) return "";

  try {
    const date = new Date(dateStr);
    if (isNaN(date.getTime())) return "";

    return date.toLocaleString("vi-VN", {
      day: "2-digit",
      month: "2-digit",
      hour: "2-digit",
      minute: "2-digit",
    });
  } catch (error) {
    console.error("Error formatting datetime short:", error);
    return "";
  }
}

/**
 * Chuyển đổi ngày từ Date object sang ISO string cho API
 * @param {Date} date - Date object
 * @returns {string} ISO string
 */
export function dateToISOString(date) {
  if (!date || !(date instanceof Date)) return "";
  return date.toISOString();
}

/**
 * Tạo range ngày mặc định (từ đầu tháng đến hiện tại)
 * @returns {Object} Object chứa fromDate và toDate
 */
export function getDefaultDateRange() {
  const now = new Date();
  const firstDayOfMonth = new Date(now.getFullYear(), now.getMonth(), 1);

  return {
    fromDate: dateToISOString(firstDayOfMonth),
    toDate: dateToISOString(now),
  };
}

/**
 * Tạo range ngày cho tháng hiện tại
 * @returns {Object} Object chứa fromDate và toDate
 */
export function getCurrentMonthRange() {
  const now = new Date();
  const firstDay = new Date(now.getFullYear(), now.getMonth(), 1);
  const lastDay = new Date(
    now.getFullYear(),
    now.getMonth() + 1,
    0,
    23,
    59,
    59
  );

  return {
    fromDate: dateToISOString(firstDay),
    toDate: dateToISOString(lastDay),
  };
}

/**
 * Tạo range ngày cho tháng trước
 * @returns {Object} Object chứa fromDate và toDate
 */
export function getLastMonthRange() {
  const now = new Date();
  const firstDay = new Date(now.getFullYear(), now.getMonth() - 1, 1);
  const lastDay = new Date(now.getFullYear(), now.getMonth(), 0, 23, 59, 59);

  return {
    fromDate: dateToISOString(firstDay),
    toDate: dateToISOString(lastDay),
  };
}

/**
 * Validate email address
 * @param {string} email - Email cần validate
 * @returns {boolean} True nếu email hợp lệ
 */
export function isValidEmail(email) {
  if (!email) return false;
  const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
  return emailRegex.test(email);
}

/**
 * Validate số điện thoại Việt Nam
 * @param {string} phone - Số điện thoại cần validate
 * @returns {boolean} True nếu số điện thoại hợp lệ
 */
export function isValidPhone(phone) {
  if (!phone) return false;
  // Regex cho số điện thoại Việt Nam (10-11 số, bắt đầu bằng 0)
  const phoneRegex = /^0[0-9]{9,10}$/;
  return phoneRegex.test(phone.replace(/\s/g, ""));
}

/**
 * Tính toán số tiền thực chuyển (COD - phí)
 * @param {number} codAmount - Số tiền COD
 * @param {number} feeAmount - Số tiền phí
 * @returns {number} Số tiền thực chuyển
 */
export function calculateNetAmount(codAmount, feeAmount) {
  const cod = Number(codAmount) || 0;
  const fee = Number(feeAmount) || 0;
  return Math.max(0, cod - fee);
}

/**
 * Tính tổng số tiền COD từ danh sách đơn hàng
 * @param {Array} orders - Danh sách đơn hàng
 * @returns {number} Tổng số tiền COD
 */
export function calculateTotalCodAmount(orders) {
  if (!Array.isArray(orders)) return 0;
  return orders.reduce(
    (total, order) => total + (Number(order.CodAmount || order.codAmount) || 0),
    0
  );
}

/**
 * Tính tổng phí từ danh sách đơn hàng
 * @param {Array} orders - Danh sách đơn hàng
 * @returns {number} Tổng phí
 */
export function calculateTotalFeeAmount(orders) {
  if (!Array.isArray(orders)) return 0;
  return orders.reduce(
    (total, order) =>
      total + (Number(order.ServiceFee || order.serviceFee) || 0),
    0
  );
}

/**
 * Tính tổng cước phí từ danh sách đơn hàng đã chọn
 * @param {Array} orders - Danh sách đơn hàng
 * @param {Array} selectedOrderIds - Danh sách ID đơn hàng đã chọn
 * @returns {number} Tổng cước phí
 */
export function calculateTotalShippingFeeAmount(orders, selectedOrderIds) {
  if (!Array.isArray(orders) || !Array.isArray(selectedOrderIds)) return 0;

  const selectedOrders = orders.filter((order) =>
    selectedOrderIds.includes(order.Id)
  );
  return selectedOrders.reduce(
    (total, order) =>
      total + (Number(order.ShippingFeeAmount || order.shippingFeeAmount) || 0),
    0
  );
}

/**
 * Debounce function để giảm số lần gọi API khi search
 * @param {Function} func - Function cần debounce
 * @param {number} delay - Thời gian delay (ms)
 * @returns {Function} Function đã được debounce
 */
export function debounce(func, delay) {
  let timeoutId;
  return function (...args) {
    clearTimeout(timeoutId);
    timeoutId = setTimeout(() => func.apply(this, args), delay);
  };
}

/**
 * Tạo mã đối soát tự động (dùng cho preview)
 * @returns {string} Mã đối soát
 */
export function generateReconciliationCode() {
  const now = new Date();
  const year = now.getFullYear().toString().slice(-2);
  const month = (now.getMonth() + 1).toString().padStart(2, "0");
  const day = now.getDate().toString().padStart(2, "0");
  const random = Math.floor(Math.random() * 1000)
    .toString()
    .padStart(3, "0");

  return `RC${year}${month}${day}${random}`;
}

/**
 * Kiểm tra xem có phải là số hợp lệ không
 * @param {any} value - Giá trị cần kiểm tra
 * @returns {boolean} True nếu là số hợp lệ
 */
export function isValidNumber(value) {
  return (
    !isNaN(value) && isFinite(value) && value !== null && value !== undefined
  );
}

/**
 * Làm sạch và format số từ input
 * @param {string} value - Giá trị input
 * @returns {number} Số đã được làm sạch
 */
export function cleanNumber(value) {
  if (!value) return 0;
  const cleaned = value.toString().replace(/[^\d.-]/g, "");
  const number = parseFloat(cleaned);
  return isValidNumber(number) ? number : 0;
}

/**
 * Tạo query string từ object parameters
 * @param {Object} params - Object chứa parameters
 * @returns {string} Query string
 */
export function buildQueryString(params) {
  const queryParams = new URLSearchParams();

  Object.keys(params).forEach((key) => {
    const value = params[key];
    if (value !== null && value !== undefined && value !== "") {
      queryParams.append(key, value.toString());
    }
  });

  return queryParams.toString();
}
