<?php
/**
 * ============================================
 * FILE: includes/Emails/Employee/MeetingCancelled.php
 * Employee Meeting Cancelled Email
 * ============================================
 */

namespace RadiusTheme\RadiusBooking\Emails\Employee;

if ( ! defined( 'ABSPATH' ) ) {
	exit; // Exit if accessed directly
}
use RadiusTheme\RadiusBooking\Abstracts\BaseEmail;
use RadiusTheme\RadiusBooking\Models\Appointment;
use RadiusTheme\RadiusBooking\Models\MeetingType;
use RadiusTheme\RadiusBooking\Resources\AppointmentResource;

/**
 * Class MeetingCancelled
 *
 * Handles the "Meeting Cancelled" email notification sent to employees.
 *
 * @package RadiusTheme\RadiusBooking\Emails\Employee
 */
class MeetingCancelled extends BaseEmail {

	/**
	 * Constructor to initialize the email properties.
	 */
	public function __construct() {
		$this->id             = 'employee_meeting_cancelled';
		$this->title          = __( 'Meeting Cancelled - Employee', 'radius-booking' );
		$this->description    = __( 'Sent to employees when a meeting is cancelled', 'radius-booking' );
		$this->tooltip        = __( 'This email is sent automatically when a meeting is cancelled', 'radius-booking' );
		$this->recipient_type = 'employee';
		$this->template_html  = 'employee/meeting-cancelled.php';
		$this->status         = 'cancelled';

		parent::__construct();
	}

	/**
	 * Get the unique identifier for the email.
	 *
	 * @return string
	 */
	public function get_id() {
		return $this->id;
	}

	/**
	 * Get the trigger action for the email.
	 *
	 * @return string
	 */
	public function get_trigger_action() {
		return 'radius_booking_meeting_status_cancelled';
	}

	/**
	 * Get the default email notification settings for meeting cancellation.
	 *
	 * @return array The default email settings.
	 */
	public function get_default_settings() {
		return array(
			'enabled'            => true,
			'subject'            => __( 'Meeting Cancelled - {meeting_type_name}', 'radius-booking' ),
			'heading'            => __( 'A Meeting Has Been Cancelled', 'radius-booking' ),
			'additional_content' => __( "Hello {staff_name},\n\nA meeting has been cancelled.\n\nPlease review the details below and update your schedule accordingly.", 'radius-booking' ),
			'footer_text'        => '',
			'button_text'        => '',
			'button_url'         => '',
			'use_queue'          => false,
			'bcc_emails'         => array(),
			'attachments'        => array(),
		);
	}

	/**
	 * Prepare the email data for sending.
	 *
	 * @param array $args The arguments passed to the email trigger.
	 * @return array|false The prepared email data or false on failure.
	 */
	protected function prepare_email_data( $args ) {
		if ( empty( $args[0] ) ) {
			return false;
		}
		$appointment_id = $args[0] instanceof Appointment ? $args[0]->id : $args[0];
		$booking        = $this->get_booking( $appointment_id );

		if ( ! $booking ) {
			return false;
		}

		$meeting_type = $this->get_meeting_type( $booking );

		$to       = ! empty( $booking['employee_email'] ) ? $booking['employee_email'] : get_option( 'admin_email' );
		$customer = isset( $booking['customer'] ) && is_object( $booking['customer'] ) ? $booking['customer']->customer_info : null;

		$ml               = isset( $booking['meeting_link'] ) ? (array) $booking['meeting_link'] : array();
		$integration_link = ! empty( $ml['join_url'] ) ? $ml['join_url'] : ( $meeting_type && ! empty( $meeting_type->location_details ) ? $meeting_type->location_details : '' );
		$ml_provider      = $ml['provider'] ?? '';

		$merge_tags = array(
			'staff_name'          => $booking['employee_name'] ?? '',
			'staff_email'         => $booking['employee_email'] ?? '',
			'customer_name'       => $customer['name'] ?? '',
			'customer_email'      => $customer['email'] ?? '',
			'customer_phone'      => $customer['phone'] ?? '',
			'meeting_type_name'   => $meeting_type ? $meeting_type->name : '',
			'booking_date'        => date_i18n( 'l, F j, Y', strtotime( $booking['appointment_date'] ) ),
			'time'                => date_i18n( 'g:i A', strtotime( $booking['start_time'] ) ),
			'duration'            => $meeting_type ? $meeting_type->duration . ' minutes' : '',
			'meeting_link'        => $integration_link,
			'meeting_provider'    => $ml_provider,
			'location'            => $meeting_type ? $this->get_meeting_location( $meeting_type ) : '',
			'location_type'       => $meeting_type ? ( $meeting_type->location_type ?? '' ) : '',
			'status'              => 'Cancelled',
			'cancellation_reason' => $booking['cancellation_reason'] ?? '',
			'notes'               => $booking['notes'] ?? '',
			'booking_url'         => admin_url( 'admin.php?page=radius-booking#/meeting-bookings' ),
			'currency_symbol'     => function_exists( 'get_rtrb_currency_symbol' ) ? get_rtrb_currency_symbol() : '$',
		);

		return array(
			'to'          => $to,
			'cc'          => array(),
			'bcc'         => isset( $this->settings['bcc_emails'] ) ? $this->settings['bcc_emails'] : array(),
			'merge_tags'  => $merge_tags,
			'data'        => $booking,
			'attachments' => array(),
		);
	}

	/**
	 * Retrieve and transform the booking data for the given appointment ID.
	 *
	 * @param int|null $appointment_id The appointment ID.
	 * @return array|null The transformed booking data or null if not found.
	 */
	private function get_booking( $appointment_id = null ) {
		$appointment = Appointment::find( $appointment_id );
		return ( new AppointmentResource() )->transform( $appointment );
	}

	/**
	 * Get the meeting type from booking data.
	 *
	 * @param array $booking The booking data.
	 * @return MeetingType|null The meeting type or null.
	 */
	private function get_meeting_type( $booking ) {
		$appointment = Appointment::find( $booking['id'] );
		if ( $appointment && ! empty( $appointment->meeting_type_id ) ) {
			return MeetingType::find( $appointment->meeting_type_id );
		}

		return null;
	}

	/**
	 * Get the meeting location based on the meeting type.
	 *
	 * @param MeetingType $meeting_type The meeting type.
	 * @return string The location string.
	 */
	private function get_meeting_location( $meeting_type ) {
		if ( ! empty( $meeting_type->location_type ) ) {
			switch ( $meeting_type->location_type ) {
				case 'google_meet':
					return __( 'Google Meet', 'radius-booking' );
				case 'zoom':
					return __( 'Zoom', 'radius-booking' );
				case 'in_person':
					return ! empty( $meeting_type->location_details ) ? $meeting_type->location_details : __( 'In Person', 'radius-booking' );
				case 'phone':
					return __( 'Phone Call', 'radius-booking' );
				default:
					return ! empty( $meeting_type->location_details ) ? $meeting_type->location_details : '';
			}
		}

		return '';
	}
}
