export interface Timestamp {
  date: string
  time: string
  year: number
  month: number
  day: number
  weekday: number
  hour: number
  minute: number
  doy: number
  workweek: number
  hasDay: boolean
  hasTime: boolean
  past: boolean
  current: boolean
  future: boolean
  disabled: boolean
}

export type TimestampArray = Timestamp[]
export type TimestampOrNull = Timestamp | null

export type TimestampFormatter = (timestamp: Timestamp, short: boolean) => string
export type TimestampFormatOptions = (
  timestamp: Timestamp,
  short: boolean,
) => Intl.DateTimeFormatOptions
export type TimestampMoveOperation = (timestamp: Timestamp) => Timestamp

export interface TimeObject {
  hour: number
  minute: number
}

export type TimeObjectOrNumberOrString = TimeObject | number | string

export interface AddToDateOptions {
  year?: number | string
  month?: number | string
  day?: number | string
  hour?: number | string
  minute?: number | string
}

export interface WeekdayFormatter {
  weekday: string
  type?: string
  locale?: string
}

export interface MonthFormatter {
  month: number
  type?: string
  locale?: string
}

export interface ColumnObject {
  id?: number | string
  key?: number | string
}

export type ColumnObjectArray = ColumnObject[]

export interface ResourceObject {
  label?: string
  height?: number
  expanded?: boolean
  children?: ResourceObjectArray
}

export type ResourceObjectArray = ResourceObject[]

export interface TaskObject {
  label?: string
  height?: number
  expanded?: boolean
  children?: TaskObjectArray
}

export type TaskObjectArray = TaskObject[]

export interface TitleObject {
  label?: string
}

export type TitleObjectArray = TitleObject[]

export interface FooterObject {
  label?: string
}

export type FooterObjectArray = FooterObject[]

export type NumberArray = number[]
export type StringArray = string[]
