import addon from '../utils/addon';
import { NativeElement, Component } from '../core/Component';
import { checkIfNativeElement } from '../utils/helpers';
import { QVariant } from './QVariant';
import { QDate } from './QDate';
import { QTime } from './QTime';
import { TimeSpec, DateFormat } from '../QtEnums';

export class QDateTime extends Component {
    native: NativeElement;
    constructor(arg?: NativeElement, time?: NativeElement) {
        super();
        const count = arguments.length;
        if (arg && time) {
            this.native = new addon.QDateTime(arg.native, time.native);
        } else if (count == 1 && checkIfNativeElement(arg)) {
            this.native = arg as NativeElement;
        } else {
            this.native = new addon.QDateTime();
        }
    }
    addDays(ndays: number): QDateTime {
        return new QDateTime(this.native.addDays(ndays));
    }
    addMSecs(msecs: number): QDateTime {
        return new QDateTime(this.native.addMSecs(msecs));
    }
    addMonths(nmonths: number): QDateTime {
        return new QDateTime(this.native.addMonths(nmonths));
    }
    addSecs(s: number): QDateTime {
        return new QDateTime(this.native.addSecs(s));
    }
    addYears(nyears: number): QDateTime {
        return new QDateTime(this.native.addYears(nyears));
    }
    date(): QDate {
        return new QDate(this.native.date());
    }
    daysTo(other: QDateTime): number {
        return this.native.daysTo(other.native);
    }
    isDaylightTime(): boolean {
        return this.native.isDaylightTime();
    }
    isNull(): boolean {
        return this.native.isNull();
    }
    isValid(): boolean {
        return this.native.isValid();
    }
    msecsTo(other: QDateTime): number {
        return this.native.msecsTo(other.native);
    }
    offsetFromUtc(): number {
        return this.native.offsetFromUtc();
    }
    secsTo(other: QDateTime): number {
        return this.native.secsTo(other.native);
    }
    setDate(date: QDate): void {
        this.native.setDate(date.native);
    }
    setMSecsSinceEpoch(msecs: number): void {
        this.native.setMSecsSinceEpoch(msecs);
    }
    setOffsetFromUtc(offsetSeconds: number): void {
        this.native.setOffsetFromUtc(offsetSeconds);
    }
    setSecsSinceEpoch(secs: number): void {
        this.native.setSecsSinceEpoch(secs);
    }
    setTime(time: QTime): void {
        this.native.setTime(time.native);
    }
    setTimeSpec(spec: TimeSpec): void {
        this.native.setTimeSpec(spec);
    }
    time(): QTime {
        return new QTime(this.native.time());
    }
    timeSpec(): TimeSpec {
        return this.native.timeSpec();
    }
    toLocalTime(): QDateTime {
        return new QDateTime(this.native.toLocalTime());
    }
    toMSecsSinceEpoch(): number {
        return this.native.toMSecsSinceEpoch();
    }
    toOffsetFromUtc(offsetSeconds: number): QDateTime {
        return new QDateTime(this.native.toOffsetFromUtc(offsetSeconds));
    }
    toSecsSinceEpoch(): number {
        return this.native.toSecsSinceEpoch();
    }
    toString(format: string | DateFormat): string {
        return this.native.toString$(format);
    }
    toTimeSpec(spec: TimeSpec): QDateTime {
        return new QDateTime(this.native.toTimeSpec(spec));
    }
    toUTC(): QDateTime {
        return new QDateTime(this.native.toUTC());
    }
    static currentDateTime(): QDateTime {
        return new QDateTime(addon.QDateTime.currentDateTime());
    }
    static currentDateTimeUtc(): QDateTime {
        return new QDateTime(addon.QDateTime.currentDateTimeUtc());
    }
    static currentMSecsSinceEpoch(): number {
        return addon.QDateTime.currentMSecsSinceEpoch();
    }
    static currentSecsSinceEpoch(): number {
        return addon.QDateTime.currentSecsSinceEpoch();
    }
    static fromString(dateTimeString: string, format: string | DateFormat): QDateTime {
        return addon.QDateTime.fromString(dateTimeString, format);
    }
    static fromQVariant(variant: QVariant): QDateTime {
        return new QDateTime(addon.QDateTime.fromQVariant(variant.native));
    }
}
