import { PrintObject } from "./PrintObject";
import { Number } from "../dataType/Number";
import { String } from "../dataType/String";
import { DateRange } from "./DateRange";
import { JsDate } from "./JsDate";

/**
 *  gve
 * @class gve.Date
 * @since gve
 */
export class Date extends PrintObject {
  /**
   * 构造Date实例
   * @hideconstructor
   * @param {Date|number|string|object} date Date|NUmber|String|js可以计算的对象  转换日期(数字毫秒数,ISO日期字符串,JavaScript日期或者计算值的日期)
   * @param {string} [tz] 时区
   * @returns gve.Date
   */
  constructor(date: JsDate|number|string|object, tz?: string) {
    super();
    if (!(this instanceof Date)) {
      return new Date(date, tz);
    }
  }

  /**
   * 将指定的时间间隔添加到给定的日期中来创建新的日期
   * @param {number} delta 时间间隔
   * @param {string} unit 时间单位,year|month|week|day|hour|minute|second
   * @param {string} [timeZone] 可选参数,时区
   * @returns Date
   */
  advance(delta: number, unit: string, timeZone?: string) {
    return new Date(0);
  }

  /**
   * 返回两个时间日期指定单位之间的差异
   * @param {Date} start 时间间隔
   * @param {string} unit 时间单位,year|month|week|day|hour|minute|second
   * @returns Number
   */
  difference(start: JsDate, unit: string) {
    return new Number();
  }

  /**
   * 转换日期为字符串格式
   * @param {string} [format] 可选参数,时间日期格式
   * @param {string} [timeZone] 可选参数,时区
   * @returns String
   */
  format(format?: string, timeZone?: string) {
    return new String();
  }

  /**
   * 返回给定年月日的日期
   * @param {number} year 年
   * @param {number} month 月
   * @param {number} day 日
   * @param {string} [timeZone] 可选参数,时区
   * @returns Date
   * @tutorial gve.Date
   */
  static fromYMD(year: number, month: number, day: number, timeZone?: string) {
    return new Date(0);
  }

  /**
   * 返回特定的日期
   * @param {string} unit 时间单位,year|month|week|day|hour|minute|second
   * @param {string} [timeZone] 可选参数,时区
   * @returns Number
   */
  get(unit: string, timeZone?: string) {
    return new Number();
  }

  /**
   * 返回包含该日期的指定类型单位的日期范围
   * @param {string} unit 时间单位,year|month|week|day|hour|minute|second
   * @param {string} [timeZone] 可选参数,时区
   * @returns DateRange
   */
  getRange(unit: string, timeZone?: string) {
    return new DateRange(0);
  }

  /**
   * 返回该日期相对于更大单位的指定单位
   * @param {string} unit 时间单位,year|month|week|day|hour|minute|second
   * @param {string} inUnit 时间单位,year|month|week|day|hour|minute|second
   * @param {string} [timeZone] 可选参数,时区
   * @returns Number
   */
  getRelative(unit: string, inUnit: string, timeZone?: string) {
    return new Number();
  }

  /**
   * 返回时间毫秒数
   * @returns Number
   */
  mills() {
    return new Number();
  }

  /**
   * 根据给定的时间单位创建一个新的时间
   * @param {number} [year] 可选参数,年
   * @param {number} [month] 可选参数,月
   * @param {number} [day] 可选参数,日
   * @param {number} [hour] 可选参数,时
   * @param {number} [minute] 可选参数,分
   * @param {number} [second] 可选参数,秒
   * @param {string} [timeZone] 可选参数,时区
   * @returns Date
   */
  update(year?: number, month?: number, day?: number, hour?: number, minute?: number, second?: number, timeZone?: string) {
    return new Date(0);
  }
}