// 将res的key对应的值复制给dzdata的同名key
/**
 * 将源对象res的属性复制到目标对象dzdata中。
 * @param {Object} res - 源对象，其属性将被复制。
 * @param {Object} dzdata - 目标对象，将接收源对象的属性。
 * @example
 * ObjectCopy({a: 1, b: 2}, {c: 3}); // dzdata 变为 {a: 1, b: 2, c: 3}
 */
export function ObjectCopy(res, dzdata) {
  Object.keys(dzdata).map(key => {
    dzdata[key] = res[key];
  });
}

/** 
 * @description: 时间格式化
 * @param {*} time 传入时间参数，支持字符串和时间戳
 * @param {*} f 对应格式 "YYYY-MM-DD hh:mm:ss" "YYYY年MM月DD日hh时mm分ss秒"
 *              格式可以自定义，对应的字符串对应的时间会更新，输入单个字符表示可以不补零
 * @return {*} 返回格式化的日期
 */
export function formatTime(time, f) {
  const date = new Date(time);
  if (!(date instanceof Date && !isNaN(date.getTime()))) {
    console.error("不合法的日期！");
    return;
  }
  const year = date.getFullYear();
  const month = date.getMonth();
  const day = date.getDate();
  const hour = date.getHours();
  const minute = date.getMinutes();
  const second = date.getSeconds();
  const monthAdd0 = timeAdd0(month + 1);
  const dayAdd0 = timeAdd0(day);
  const hourAdd0 = timeAdd0(hour);
  const minuteAdd0 = timeAdd0(minute);
  const secondAdd0 = timeAdd0(second);
  let str = f.toString();
  str = str.replace("YYYY", year);
  if (f.includes("M")) {
    if (f.includes("MM")) str = str.replace("MM", monthAdd0);
    else str = str.replace("M", month + 1);
  }
  if (f.includes("D")) {
    if (f.includes("DD")) str = str.replace("DD", dayAdd0);
    else str = str.replace("D", day);
  }
  if (f.includes("h")) {
    if (f.includes("h")) str = str.replace("hh", hourAdd0);
    else str = str.replace("h", hour);
  }
  if (f.includes("m")) {
    if (f.includes("mm")) str = str.replace("mm", minuteAdd0);
    else str = str.replace("m", minute);
  }
  if (f.includes("s")) {
    if (f.includes("ss")) str = str.replace("ss", secondAdd0);
    else str = str.replace("s", second);
  }
  return str;
}

/** 
 * @description: 补零函数 为时间服务 不足两位的自定在数字前面加上0
 * @param {*} n 待补零数字
 * @return {*} 补零后数字
 */
function timeAdd0(n) {
  const s = n.toString();
  return s.padStart(2, "0");
}


export function deepclone(obj) {
  let str, newobj = obj.constructor === Array ? [] : {};
  if (typeof obj !== "object") {
    return;
  }
  else if (window.JSON) {
    str = JSON.stringify(obj), //系列化对象
      newobj = JSON.parse(str); //还原
  }
  else {
    for (var i in obj) {
      newobj[i] = typeof obj[i] === "object" ? deepclone(obj[i]) : obj[i];
    }
  }
  return newobj;
}

/**
 * 根据日期格式化时间。
 * @param {Date} date - 需要格式化的日期对象。
 * @param {string} format - 时间格式字符串。
 * @returns {string} 格式化后的时间字符串。
 * @example
 * formatTimeBydate(new Date(), 'yyyy-MM-dd HH:mm:ss');
 */
export function formatTimeBydate(f) {
  return formatTime(this, f)
}

export function debounce(fn, delay) {
  let timer = null;
  return function () {
    let _this = this;
    let args = arguments;
    if (timer) {
      clearTimeout(timer);
      timer = null;
    }
    timer = setTimeout(function () {
      fn.apply(_this, args);
    }, delay);
  }
}

export function throttle(fn, delay) {
  let timer = null;
  return function () {
    let _this = this;
    let args = arguments;
    if (!timer) {
      timer = setTimeout(function () {
        fn.apply(_this, args);
        timer = null;
      }, delay);
    }
  }
}

// 字典查询 通个一个字段返回另一个字段的值
/**
 * @description 字典查询
 * @param {*} dict 字典数组
 * @param {*} ckey 查询字段
 * @param {*} cvalue 查询值
 * @param {*} rkey 返回字段
 * @return {*} 返回值
 */
 
export function getDictValue(dict, ckey, cvalue,rkey) {
  let result = "";
  dict.map(item => {
    if (item[ckey] == cvalue) {
      result = item[rkey];
    }
  })
  return result;
}

// 分割数组
export function chunkArrayInGroups(arr, size) {
  return Array.from(
    { length: Math.ceil(arr.length / size) },
    (_, i) => arr.slice(i * size, i * size + size)
  );
}
// 重置对象
export function resetObject(obj) {
  for (const key in obj) {
    if (obj.hasOwnProperty(key)) {
      obj[key] = null;
    }
  }
}