// 使用闭包管理时间差
const DateWithOffset = (function () {
  let timeOffset = 0; // 默认时间差（毫秒）
  let useTimeOffset = 0; // 默认时间差（毫秒）

  // 函数 setOffset：设置时间差（单位：毫秒）
  // 服务器 > 本机 传正数     本机 > 服务器 传负数
  function setOffset(ms) {
    timeOffset = ms; // 转为毫秒存储
    useTimeOffset = ms; // 转为毫秒存储
  }
  const OriginalDate = Date;

  // 自定义 Date 类
  class CustomDate extends OriginalDate {
    constructor(...args) {
      if (args.length === 0) {
        timeOffset = useTimeOffset;
        super();
      } else {
        // 有传入时间时，偏移量设置为 0
        timeOffset = 0;
        super(...args);
      }
    }
    // 重写所有获取时间的方法，应用偏移量
    getTime() {
      return super.getTime() + timeOffset;
    }

    newDate() {
      return new OriginalDate(this.getTime());
    }

    getFullYear() {
      return this.newDate().getFullYear();
    }

    getMonth() {
      return this.newDate().getMonth();
    }

    getDate() {
      return this.newDate().getDate();
    }

    getDay() {
      return this.newDate().getDay();
    }

    getHours() {
      return this.newDate().getHours();
    }

    getMinutes() {
      return this.newDate().getMinutes();
    }

    getSeconds() {
      return this.newDate().getSeconds();
    }

    getMilliseconds() {
      return this.newDate().getMilliseconds();
    }

    getTimezoneOffset() {
      return super.getTimezoneOffset();
    }

    // 其他 Date 方法保持不变
    toString() {
      return this.newDate().toString();
    }

    toDateString() {
      return this.newDate().toDateString();
    }

    toTimeString() {
      return this.newDate().toTimeString();
    }

    toISOString() {
      return this.newDate().toISOString();
    }

    toUTCString() {
      return this.newDate().toUTCString();
    }

    toLocaleString() {
      return this.newDate().toLocaleString();
    }

    toLocaleDateString() {
      return this.newDate().toLocaleDateString();
    }

    toLocaleTimeString() {
      return this.newDate().toLocaleTimeString();
    }

    // 静态方法
    static now() {
      return OriginalDate.now() + timeOffset;
    }

    static parse(dateString) {
      return OriginalDate.parse(dateString);
    }

    static UTC(...args) {
      return OriginalDate.UTC(...args);
    }
  }

  // 返回接口：CustomDate 和 setOffset 方法
  return {
    Date: CustomDate,
    setOffset,
  };
})();

// CommonJS 导出
module.exports = DateWithOffset;
