<?php
/*
 * Copyright (c) 2022 LatePoint LLC. All rights reserved.
 *
 * This class is used to create booking requests, they are useful for getting availability information on the calendar
 * and checking if a timeslot is available.
 */

namespace LatePoint\Misc;

class BookingRequest {
	public ?string $start_date;
	public ?string $end_date;
	public ?int $start_time      = 0;
	public ?int $end_time        = 0;
	public ?int $duration        = 0;
	public ?int $buffer_before   = 0;
	public ?int $buffer_after    = 0;
	public ?int $total_attendees = 1;
	public $service_id           = 0;
	public $agent_id             = 0;
	public $location_id          = 0;

	function __construct( $args = [] ) {
		$allowed_props = self::allowed_props();
		foreach ( $args as $key => $arg ) {
			if ( in_array( $key, $allowed_props ) ) {
				$this->$key = $arg;
			}
		}
	}


	public static function create_from_booking_model( \OsBookingModel $booking ): BookingRequest {
		$booking_request = new BookingRequest(
			[
				'start_date'      => $booking->start_date,
				'end_date'        => $booking->end_date ? $booking->end_date : $booking->start_date,
				'start_time'      => (int) $booking->start_time,
				'end_time'        => (int) $booking->end_time,
				'duration'        => (int) $booking->get_total_duration(),
				'buffer_before'   => (int) $booking->buffer_before,
				'buffer_after'    => (int) $booking->buffer_after,
				'total_attendees' => (int) $booking->total_attendees,
				'agent_id'        => ( $booking->agent_id == LATEPOINT_ANY_AGENT ) ? 0 : $booking->agent_id,
				'service_id'      => $booking->service_id,
				'location_id'     => ( $booking->location_id == LATEPOINT_ANY_LOCATION ) ? 0 : $booking->location_id,
			]
		);
		return apply_filters( 'latepoint_create_booking_request_from_booking_model', $booking_request, $booking );
	}

	public function get_start_time_with_buffer(): int {
		return $this->start_time - $this->buffer_before;
	}

	public function get_end_time_with_buffer(): int {
		return $this->end_time + $this->buffer_after;
	}


	public function get_start_datetime( string $set_timezone = '' ): \OsWpDateTime {
		try {
			// start_time and start_date is legacy stored in wordpress timezone
			$dateTime = new \OsWpDateTime( $this->start_date . ' 00:00:00', \OsTimeHelper::get_wp_timezone() );
			if ( $this->start_time > 0 ) {
				$dateTime->modify( '+' . $this->start_time . ' minutes' );
			}
			if ( ! empty( $set_timezone ) ) {
				$dateTime->setTimezone( new \DateTimeZone( $set_timezone ) );
			}
			return $dateTime;
		} catch ( \Exception $e ) {
			return new \OsWpDateTime( 'now' );
		}
	}

	public function get_end_datetime( string $set_timezone = '' ): \OsWpDateTime {
		try {
			// start_time and start_date is legacy stored in wordpress timezone
			$dateTime = new \OsWpDateTime( $this->end_date . ' 00:00:00', \OsTimeHelper::get_wp_timezone() );
			if ( $this->end_time > 0 ) {
				$dateTime->modify( '+' . $this->end_time . ' minutes' );
			}
			if ( ! empty( $set_timezone ) ) {
				$dateTime->setTimezone( new \DateTimeZone( $set_timezone ) );
			}
			return $dateTime;
		} catch ( \Exception $e ) {
			return new \OsWpDateTime( 'now' );
		}
	}


	public static function allowed_props(): array {
		return [
			'start_date',
			'end_date',
			'start_time',
			'end_time',
			'duration',
			'buffer_before',
			'buffer_after',
			'total_attendees',
			'agent_id',
			'service_id',
			'location_id',
		];
	}
}
