<?php
if ( ! defined( 'ABSPATH' ) ) {
	exit; // Exit if accessed directly.
}


if ( ! class_exists( 'OsActivitiesController' ) ) :


	class OsActivitiesController extends OsController {


		function __construct() {
			parent::__construct();

			$this->views_folder            = LATEPOINT_VIEWS_ABSPATH . 'activities/';
			$this->vars['page_header']     = OsMenuHelper::get_menu_items_by_id( 'processes' );
			$this->vars['pre_page_header'] = OsMenuHelper::get_label_by_id( 'processes' );
			$this->vars['breadcrumbs'][]   = array(
				'label' => __( 'Activities', 'latepoint' ),
				'link'  => OsRouterHelper::build_link( OsRouterHelper::build_route_name( 'activities', 'index' ) ),
			);
		}

		public function clear_all() {
			$this->check_nonce( 'clear_activities' );
			global $wpdb;
			$wpdb->query( $wpdb->prepare( 'TRUNCATE TABLE %i', esc_sql( LATEPOINT_TABLE_ACTIVITIES ) ) );
			if ( $this->get_return_format() == 'json' ) {
				$this->send_json(
					array(
						'status'  => LATEPOINT_STATUS_SUCCESS,
						'message' => __( 'Activities log cleared', 'latepoint' ),
					) 
				);
			}
		}

		public function export() {
			// Verify nonce.
			$this->check_nonce( 'export_activities' );

			$csv_filename = 'activities_log_' . OsUtilHelper::random_text() . '.csv';

			header( 'Content-Type: text/csv' );
			header( "Content-Disposition: attachment; filename={$csv_filename}" );

			$labels_row = [
				__( 'Type', 'latepoint' ),
				__( 'Agent ID', 'latepoint' ),
				__( 'Booking ID', 'latepoint' ),
				__( 'Service ID', 'latepoint' ),
				__( 'Customer ID', 'latepoint' ),
				__( 'Location ID', 'latepoint' ),
				__( 'Action By User Type', 'latepoint' ),
				__( 'Action By User ID', 'latepoint' ),
				__( 'Date, Time', 'latepoint' ),
				__( 'Description', 'latepoint' ),
			];


			$activities_data   = [];
			$activities_data[] = $labels_row;

			$activities     = new OsActivityModel();
			$activities_arr = $activities->order_by( 'created_at' )->get_results( ARRAY_A );

			if ( $activities_arr ) {
				foreach ( $activities_arr as $activity ) {
					$values_row        = [
						$activity['code'],
						$activity['agent_id'],
						$activity['booking_id'],
						$activity['service_id'],
						$activity['customer_id'],
						$activity['location_id'],
						$activity['initiated_by'],
						$activity['initiated_by_id'],
						$activity['created_at'],
						$activity['description'],
					];
					$activities_data[] = $values_row;
				}			
			}

			OsCSVHelper::array_to_csv( $activities_data );

			return;
		}

		/*
			Index of activities
		*/

		public function index() {
			$per_page    = OsSettingsHelper::get_number_of_records_per_page();
			$page_number = isset( $this->params['page_number'] ) ? $this->params['page_number'] : 1;

			$activities       = new OsActivityModel();
			$count_activities = new OsActivityModel();

			// TABLE SEARCH FILTERS
			$filter = isset( $this->params['filter'] ) ? $this->params['filter'] : false;

			$query_args = [];
			if ( $filter ) {
				if ( ! empty( $filter['code'] ) ) {
					$query_args['code'] = $filter['code'];
				}
				if ( ! empty( $filter['initiated_by_id'] ) ) {
					$query_args['initiated_by_id'] = $filter['initiated_by_id'];
				}

				if ( ! empty( $filter['created_at_from'] ) && ! empty( $filter['created_at_to'] ) ) {
					$query_args['created_at >='] = $filter['created_at_from'];
					$query_args['created_at <='] = $filter['created_at_to'];
				}
			}

			$total_activities = $count_activities->where( $query_args )->count();

			$activities = $activities->where( $query_args )->order_by( 'id desc' )->set_limit( $per_page );
			if ( $page_number > 1 ) {
				$activities = $activities->set_offset( ( $page_number - 1 ) * $per_page );
			}

			$this->vars['activities'] = $activities->get_results_as_models();

			$this->vars['total_activities']    = $total_activities;
			$this->vars['current_page_number'] = $page_number;
			$this->vars['per_page']            = $per_page;
			$total_pages                       = ceil( $total_activities / $per_page );
			$this->vars['total_pages']         = $total_pages;

			$this->vars['showing_from'] = ( ( $page_number - 1 ) * $per_page ) ? ( ( $page_number - 1 ) * $per_page ) : 1;
			$this->vars['showing_to']   = min( $page_number * $per_page, $total_activities );


			$this->vars['breadcrumbs'][] = array(
				'label' => __( 'Index', 'latepoint' ),
				'link'  => false,
			);

			$this->format_render(
				[
					'json_view_name' => '_table_body',
					'html_view_name' => __FUNCTION__,
				],
				[],
				[
					'total_pages'   => $total_pages,
					'showing_from'  => $this->vars['showing_from'],
					'showing_to'    => $this->vars['showing_to'],
					'total_records' => $total_activities,
				] 
			);
		}

		public function destroy() {
			if ( filter_var( $this->params['id'], FILTER_VALIDATE_INT ) ) {

				$this->check_nonce( 'destroy_activity_' . $this->params['id'] );
				$activity = new OsActivityModel( $this->params['id'] );
				if ( $activity->delete() ) {
					$status        = LATEPOINT_STATUS_SUCCESS;
					$response_html = __( 'Activity Removed', 'latepoint' );
				} else {
					$status        = LATEPOINT_STATUS_ERROR;
					$response_html = __( 'Error Removing Activity', 'latepoint' );
				}
			} else {
				$status        = LATEPOINT_STATUS_ERROR;
				$response_html = __( 'Error Removing Activity', 'latepoint' );
			}

			if ( $this->get_return_format() == 'json' ) {
				$this->send_json(
					array(
						'status'  => $status,
						'message' => $response_html,
					) 
				);
			}
		}

		public function view() {
			$activity = new OsActivityModel( $this->params['id'] );
			$data     = json_decode( $activity->description, true );

			$this->vars['activity_id']   = $activity->id;
			$this->vars['activity_name'] = $activity->name;
			$this->vars['activity_type'] = $activity->code;
			$this->vars['status']        = $data['status'] ?? '';

			$status_html = '';
			if ( ! empty( $data['status'] ) ) {
				$status_html  = '<div class="status-item">' . __( 'Status:', 'latepoint' ) . ' <strong>' . esc_html( $data['status'] ) . '</strong></div>';
				$status_html .= '<div class="status-item">' . __( 'Processed on:', 'latepoint' ) . ' <strong>' . esc_html( $data['processed_datetime'] ) . '</strong></div>';
				if ( ! empty( $data['errors'] ) ) {
					$status_html .= '<div class="status-item">' . __( 'Errors:', 'latepoint' ) . '<strong>' . esc_html( is_array( $data['errors'] ) ? implode( ', ', $data['errors'] ) : $data['errors'] ) . '</strong></div>';
				}
			}

			switch ( $activity->code ) {
				// orders
				case 'order_intent_updated':
					$link_to_order = $activity->order_id ? '<a href="#" ' . OsOrdersHelper::quick_order_btn_html( $activity->order_id ) . '>' . __( 'View Order', 'latepoint' ) . '</a>' : '';
					$meta_html     = '<div class="activity-preview-to">' . ( $link_to_order ? ( '<span class="os-value">' . $link_to_order . '</span>' ) : '' ) . '<span class="os-label">' . __( 'Created On:', 'latepoint' ) . '</span><span class="os-value">' . $activity->nice_created_at . '</span></div>';
					$content_html  = '<pre class="format-json">' . esc_html( wp_json_encode( $data['order_data_vars'], JSON_PRETTY_PRINT | JSON_HEX_TAG ) ) . '</pre>';
					break;
				case 'order_intent_created':
					$link_to_order = $activity->order_id ? '<a href="#" ' . OsOrdersHelper::quick_order_btn_html( $activity->order_id ) . '>' . __( 'View Order', 'latepoint' ) . '</a>' : '';
					$meta_html     = '<div class="activity-preview-to">' . ( $link_to_order ? ( '<span class="os-value">' . $link_to_order . '</span>' ) : '' ) . '<span class="os-label">' . __( 'Created On:', 'latepoint' ) . '</span><span class="os-value">' . $activity->nice_created_at . '</span></div>';
					$content_html  = '<pre class="format-json">' . esc_html( wp_json_encode( $data['order_data_vars'], JSON_PRETTY_PRINT | JSON_HEX_TAG ) ) . '</pre>';
					break;
				case 'order_intent_converted':
					$link_to_order = '<a href="#" ' . OsOrdersHelper::quick_order_btn_html( $activity->order_id ) . '>' . __( 'View Order', 'latepoint' ) . '</a>';
					$meta_html     = '<div class="activity-preview-to"><span class="os-value">' . $link_to_order . '</span><span class="os-label">' . __( 'Created On:', 'latepoint' ) . '</span><span class="os-value">' . $activity->nice_created_at . '</span></div>';
					$content_html  = '<pre class="format-json">' . esc_html( wp_json_encode( $data['order_data_vars'], JSON_PRETTY_PRINT | JSON_HEX_TAG ) ) . '</pre>';
					break;
				case 'order_created':
					$link_to_order = '<a href="#" ' . OsOrdersHelper::quick_order_btn_html( $activity->order_id ) . '>' . __( 'View Order', 'latepoint' ) . '</a>';
					$meta_html     = '<div class="activity-preview-to"><span class="os-value">' . $link_to_order . '</span><span class="os-label">' . __( 'Created On:', 'latepoint' ) . '</span><span class="os-value">' . $activity->nice_created_at . '</span><span class="os-label">' . esc_html__( 'by:', 'latepoint' ) . '</span><span class="os-value">' . $activity->get_user_link() . '</span></div>';
					$content_html  = '<pre class="format-json">' . esc_html( wp_json_encode( $data['order_data_vars'], JSON_PRETTY_PRINT | JSON_HEX_TAG ) ) . '</pre>';
					break;
				case 'order_updated':
					$link_to_order = '<a href="#" ' . OsOrdersHelper::quick_order_btn_html( $activity->order_id ) . '>' . __( 'View Order', 'latepoint' ) . '</a>';
					$meta_html     = '<div class="activity-preview-to"><span class="os-value">' . $link_to_order . '</span><span class="os-label">' . __( 'Updated On:', 'latepoint' ) . '</span><span class="os-value">' . $activity->nice_created_at . '</span><span class="os-label">' . esc_html__( 'by:', 'latepoint' ) . '</span><span class="os-value">' . $activity->get_user_link() . '</span></div>';
					$changes       = OsUtilHelper::compare_model_data_vars( $data['order_data_vars']['new'], $data['order_data_vars']['old'] );
					$content_html  = '<pre class="format-json">' . esc_html( wp_json_encode( $changes, JSON_PRETTY_PRINT | JSON_HEX_TAG ) ) . '</pre>';
					break;

				case 'customer_created':
					$link_to_customer = '<a href="#" ' . OsCustomerHelper::quick_customer_btn_html( $activity->customer_id ) . '>' . __( 'View Customer', 'latepoint' ) . '</a>';
					$meta_html        = '<div class="activity-preview-to"><span class="os-value">' . $link_to_customer . '</span><span class="os-label">' . __( 'Created On:', 'latepoint' ) . '</span><span class="os-value">' . $activity->nice_created_at . '</span><span class="os-label">' . esc_html__( 'by:', 'latepoint' ) . '</span><span class="os-value">' . $activity->get_user_link() . '</span></div>';
					$content_html     = '<pre class="format-json">' . esc_html( wp_json_encode( $data['customer_data_vars'], JSON_PRETTY_PRINT | JSON_HEX_TAG ) ) . '</pre>';
					break;
				case 'customer_updated':
					$link_to_customer = '<a href="#" ' . OsCustomerHelper::quick_customer_btn_html( $activity->customer_id ) . '>' . __( 'View Customer', 'latepoint' ) . '</a>';
					$meta_html        = '<div class="activity-preview-to"><span class="os-value">' . $link_to_customer . '</span><span class="os-label">' . __( 'Updated On:', 'latepoint' ) . '</span><span class="os-value">' . $activity->nice_created_at . '</span><span class="os-label">' . esc_html__( 'by:', 'latepoint' ) . '</span><span class="os-value">' . $activity->get_user_link() . '</span></div>';
					$changes          = OsUtilHelper::compare_model_data_vars( $data['customer_data_vars']['new'], $data['customer_data_vars']['old'] );
					$content_html     = '<pre class="format-json">' . esc_html( wp_json_encode( $changes, JSON_PRETTY_PRINT | JSON_HEX_TAG ) ) . '</pre>';
					break;
				case 'payment_request_created':
					$link_to_order = '<a href="#" ' . OsOrdersHelper::quick_order_btn_html( $activity->order_id ) . '>' . __( 'View Order', 'latepoint' ) . '</a>';
					$meta_html     = '<div class="activity-preview-to"><span class="os-value">' . $link_to_order . '</span><span class="os-label">' . __( 'Created On:', 'latepoint' ) . '</span><span class="os-value">' . $activity->nice_created_at . '</span></div>';
					$content_html  = '<pre class="format-json">' . esc_html( wp_json_encode( $data['payment_request_data_vars'], JSON_PRETTY_PRINT | JSON_HEX_TAG ) ) . '</pre>';
					break;

				// bookings
				case 'booking_change_status':
					$link_to_order = $activity->order_id ? '<a href="#" ' . OsBookingHelper::quick_booking_btn_html( $activity->booking_id ) . '>' . __( 'View Booking', 'latepoint' ) . '</a>' : '';
					$meta_html     = '<div class="activity-preview-to">' . ( $link_to_order ? ( '<span class="os-value">' . $link_to_order . '</span>' ) : '' ) . '<span class="os-label">' . __( 'Created On:', 'latepoint' ) . '</span><span class="os-value">' . $activity->nice_created_at . '</span><span class="os-label">' . esc_html__( 'by:', 'latepoint' ) . '</span><span class="os-value">' . $activity->get_user_link() . '</span></div>';
					$content_html  = '<div class="activity-preview-content">' . wp_kses_post( $activity->description ) . '</div>';
					break;
				case 'booking_created':
					$link_to_booking = '<a href="#" ' . OsBookingHelper::quick_booking_btn_html( $activity->booking_id ) . '>' . __( 'View Booking', 'latepoint' ) . '</a>';
					$meta_html       = '<div class="activity-preview-to"><span class="os-value">' . $link_to_booking . '</span><span class="os-label">' . __( 'Created On:', 'latepoint' ) . '</span><span class="os-value">' . $activity->nice_created_at . '</span><span class="os-label">' . esc_html__( 'by:', 'latepoint' ) . '</span><span class="os-value">' . $activity->get_user_link() . '</span></div>';
					$content_html    = '<pre class="format-json">' . esc_html( wp_json_encode( $data['booking_data_vars'], JSON_PRETTY_PRINT | JSON_HEX_TAG ) ) . '</pre>';
					break;
				case 'booking_updated':
					$link_to_booking = '<a href="#" ' . OsBookingHelper::quick_booking_btn_html( $activity->booking_id ) . '>' . __( 'View Booking', 'latepoint' ) . '</a>';
					$meta_html       = '<div class="activity-preview-to"><span class="os-value">' . $link_to_booking . '</span><span class="os-label">' . __( 'Updated On:', 'latepoint' ) . '</span><span class="os-value">' . $activity->nice_created_at . '</span><span class="os-label">' . esc_html__( 'by:', 'latepoint' ) . '</span><span class="os-value">' . $activity->get_user_link() . '</span></div>';
					$changes         = OsUtilHelper::compare_model_data_vars( $data['booking_data_vars']['new'], $data['booking_data_vars']['old'] );
					$content_html    = '<pre class="format-json">' . esc_html( wp_json_encode( $changes, JSON_PRETTY_PRINT | JSON_HEX_TAG ) ) . '</pre>';
					break;
				case 'email_sent':
					$meta_html    = '<div class="activity-preview-subject">' . esc_html( $data['extra_data']['subject'] ) . '</div>';
					$meta_html   .= '<div class="activity-preview-to"><span class="os-label">' . __( 'To:', 'latepoint' ) . '</span><span class="os-value">' . esc_html( $data['to'] ) . '</span></div>';
					$content_html = '<div class="activity-preview-content">' . wp_kses_post( $data['content'] ) . '</div>';
					break;
				case 'sms_sent':
					$meta_html    = '<div class="activity-preview-to"><span class="os-label">' . __( 'To:', 'latepoint' ) . '</span><span class="os-value">' . esc_html( $data['to'] ) . '</span></div>';
					$content_html = '<div class="activity-preview-content">' . wp_kses_post( $data['content'] ) . '</div>';
					break;
				case 'http_request':
					$meta_html    = '<div class="activity-preview-to"><span class="os-label">' . __( 'URL:', 'latepoint' ) . '</span><span class="os-value"><a href="#" target="_blank">' . esc_html( $data['to'] ) . '</a></span></div>';
					$content_html = '<pre class="format-json">' . esc_html( wp_json_encode( $data['content'], JSON_PRETTY_PRINT | JSON_HEX_TAG ) ) . '</pre>';
					break;
				case 'process_job_run':
					$job          = new OsProcessJobModel( $data['job_id'] );
					$name         = $job->process->name . ', ID: ' . $job->process->id;
					$meta_html    = '<div class="activity-preview-to"><span class="os-label">' . __( 'Process:', 'latepoint' ) . '</span><span class="os-value">' . esc_html( $name ) . '</span></div>';
					$content_html = '<pre class="format-json">' . esc_html( $data['run_result'] ) . '</pre>';
					break;
				case 'error':
					$meta_html    = '<div class="activity-preview-to"><span class="os-label">' . __( 'Error Message:', 'latepoint' ) . '</span><span class="os-value">' . esc_html( $data['message'] ) . ' | ' . esc_html( $data['error_code'] ) . '</span></div>';
					$content_html = '<pre class="format-json">' . esc_html( wp_json_encode( $data['extra_description'], JSON_PRETTY_PRINT | JSON_HEX_TAG ) ) . '</pre>';
					break;

				default:
					/**
					 * Allow to add custom activity
					 *
					 * @since 5.1.8
					 * @hook latepoint_custom_activity_html
					 *
					 * @param {OsActivityModel} $activity
					 * @param {array} $data
					 *
					 * @returns {array}  The array of meta and content HTML
					 */
					$custom_activity_html = apply_filters( 'latepoint_custom_activity_html', false, $activity, $data );
					if ( $custom_activity_html !== false ) {
						$meta_html    = $custom_activity_html['meta_html'] ?? '';
						$content_html = $custom_activity_html['content_html'] ?? '';
						break;
					}
					break;
			}

			$this->vars['content_html'] = $content_html ?? '';
			$this->vars['meta_html']    = $meta_html ?? '';
			$this->vars['status_html']  = $status_html ?? '';

			$this->vars = apply_filters( 'latepoint_activity_view_vars', $this->vars, $activity );

			$this->format_render( __FUNCTION__ );
		}
	}


endif;
