<?php 
class OsWpDateTime extends DateTime {
	function __construct( ?string $time = 'now', ?DateTimeZone $timezone = null ) {
		$timezone = ( $timezone instanceof DateTimeZone ) ? $timezone : OsTimeHelper::get_wp_timezone();
		try {
			if ( empty( $time ) ) {
				$time = 'now';
			}
			parent::__construct( $time, $timezone );
		} catch ( Exception $e ) {
			OsDebugHelper::log( 'Error parsing date: ' . $e->getMessage(), 'date_parsing' );
			return parent::__construct( 'now', $timezone );
		}
	}

	public static function datetime_in_utc( DateTime $datetime, $format = false ) {
		$utc_datetime = clone $datetime;
		$utc_datetime->setTimezone( new DateTimeZone( 'UTC' ) );
		return $format ? $utc_datetime->format( $format ) : $utc_datetime;
	}

	public static function date_to_db_format( $date_string, $default = '' ) {
		if ( empty( $date_string ) ) {
			return $default;
		}
		try {
			$date = self::os_createFromFormat( OsSettingsHelper::get_date_format(), $date_string );
			return $date->format( 'Y-m-d' );
		} catch ( Exception $e ) {
			return $default;
		}
	}

	public static function date_from_db_format( $date_string, $default = '' ) {
		if ( empty( $date_string ) ) {
			return $default;
		}
		try {
			$timezone = new DateTimeZone( 'UTC' );
			$date     = self::os_createFromFormat( 'Y-m-d', $date_string, $timezone );
			return $date->format( OsSettingsHelper::get_date_format() );
		} catch ( Exception $e ) {
			return $default;
		}
	}

	public static function os_createFromFormat( $format, $datetime_string, $timezone = false ) {
		$timezone = ( $timezone ) ? $timezone : OsTimeHelper::get_wp_timezone();
		return self::createFromFormat( $format, $datetime_string, $timezone );
	}

	// TODO will be deprecated, moved to GCal addon
	public static function os_get_start_of_google_event( $google_event ) {
		if ( ! empty( $google_event->start->dateTime ) ) {
			$date_string = $google_event->start->dateTime;
			$date_format = \DateTime::RFC3339;
			$timezone    = new DateTimeZone( $google_event->start->timeZone );
		} else {
			// Full day event
			$date_string = $google_event->start->date . ' 00:00:00';
			$date_format = LATEPOINT_DATETIME_DB_FORMAT;
			$timezone    = false;
		}
		return self::os_createFromFormat( $date_format, $date_string, $timezone );
	}

	// TODO will be deprecated, moved to GCal addon
	public static function os_get_end_of_google_event( $google_event ) {
		if ( ! empty( $google_event->end->dateTime ) ) {
			$date_string = $google_event->end->dateTime;
			$date_format = \DateTime::RFC3339;
			return self::os_createFromFormat( $date_format, $date_string );
		} else {
			// Full day event
			// !important,  in full day events of Google Calendar - start day is inclusive and the end day is exclusive https://stackoverflow.com/questions/34992747/google-calendar-json-api-full-day-events-always-one-day-longer
			$date_string = $google_event->end->date . ' 23:59:59';
			$date_format = LATEPOINT_DATETIME_DB_FORMAT;
			$temp_date   = self::os_createFromFormat( $date_format, $date_string );
			// move back 1 day to accomodate Google rule that end date is 1 day ahead of actual end date of a full day event
			$temp_date->modify( '-1 day' );
			return $temp_date;
		}
	}
}
