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


if ( ! class_exists( 'OsServicesController' ) ) :


	class OsServicesController extends OsController {


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

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

		/*
		  Edit service
		*/

		public function edit_form() {
			$service_id = $this->params['id'];

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


			$service            = new OsServiceModel( $service_id );
			$service_categories = new OsServiceCategoryModel();
			$agents             = new OsAgentModel();
			$locations          = new OsLocationModel();


			$this->vars['service']                       = $service;
			$this->vars['service_categories_for_select'] = $service_categories->index_for_select();
			$this->vars['agents']                        = $agents->get_results_as_models();
			$this->vars['locations']                     = $locations->get_results_as_models();

			$custom_work_periods               = OsWorkPeriodsHelper::get_work_periods(
				new \LatePoint\Misc\Filter(
					[
						'service_id'  => $service_id,
						'exact_match' => true,
					] 
				),
				true 
			);
			$this->vars['custom_work_periods'] = $custom_work_periods;
			$this->vars['is_custom_schedule']  = ( $custom_work_periods && ( count( $custom_work_periods ) > 0 ) );

			$this->format_render( __FUNCTION__ );
		}


		/*
		  New service form
		*/

		public function new_form() {
			$this->vars['pre_page_header'] = '';
			$this->vars['page_header']     = __( 'New Service', 'latepoint' );
			$this->vars['breadcrumbs'][]   = array(
				'label' => __( 'Create New Service', 'latepoint' ),
				'link'  => false,
			);


			$service            = new OsServiceModel();
			$service_categories = new OsServiceCategoryModel();
			$agents             = new OsAgentModel();
			$locations          = new OsLocationModel();


			$service->bg_color = $service->generate_new_bg_color();

			if ( isset( $this->params['service_category_id'] ) ) {
				$service->category_id = $this->params['service_category_id'];
			}

			$this->vars['service']                       = $service;
			$this->vars['service_categories_for_select'] = $service_categories->index_for_select();
			$this->vars['agents']                        = $agents->get_results_as_models();
			$this->vars['locations']                     = $locations->get_results_as_models();

			$this->vars['custom_work_periods'] = [];
			$this->vars['is_custom_schedule']  = false;


			$this->format_render( __FUNCTION__ );
		}


		/*
		  Index of services
		*/

		public function index() {
			$service_categories = new OsServiceCategoryModel();
			$service_categories = $service_categories->order_by( 'order_number asc' )->filter_allowed_records()->get_results_as_models();


			$this->vars['service_categories'] = $service_categories;

			$uncategorized_services               = new OsServiceModel();
			$this->vars['uncategorized_services'] = $uncategorized_services->filter_allowed_records()->should_be_active()->where(
				array(
					'category_id' => [
						'OR' => [
							0,
							'IS NULL',
						],
					],
				) 
			)->order_by( 'order_number asc' )->get_results_as_models();

			$disabled_services               = new OsServiceModel();
			$this->vars['disabled_services'] = $disabled_services->filter_allowed_records()->where( [ 'status' => LATEPOINT_SERVICE_STATUS_DISABLED ] )->get_results_as_models();

			$this->format_render( __FUNCTION__ );
		}


		/*
		  Create service
		*/

		public function create() {
			$this->update();
		}


		/*
		  Update service
		*/

		public function update() {
			$is_new_record = ( isset( $this->params['service']['id'] ) && $this->params['service']['id'] ) ? false : true;

			$this->check_nonce( $is_new_record ? 'new_service' : 'edit_service_' . $this->params['service']['id'] );
			$service = new OsServiceModel();
			$service->set_data( $this->params['service'] );
			$extra_response_vars = array();

			$this->params['service']['durations'] = isset( $this->params['service']['durations'] ) ? $this->params['service']['durations'] : [];
			$this->params['service']['agents']    = isset( $this->params['service']['agents'] ) ? $this->params['service']['agents'] : [];

			if ( $service->save() && $service->save_durations( $this->params['service']['durations'] ) && $service->save_agents_and_locations( $this->params['service']['agents'] ) ) {
				if ( $is_new_record ) {
					$response_html = __( 'Service Created. ID:', 'latepoint' ) . $service->id;
					OsActivitiesHelper::create_activity(
						array(
							'code'       => 'service_created',
							'service_id' => $service->id,
						) 
					);
				} else {
					$response_html = __( 'Service Updated. ID:', 'latepoint' ) . $service->id;
					OsActivitiesHelper::create_activity(
						array(
							'code'       => 'service_updated',
							'service_id' => $service->id,
						) 
					);
				}
				$status = LATEPOINT_STATUS_SUCCESS;
				// save schedules
				if ( $this->params['is_custom_schedule'] == 'on' ) {
					$service->save_custom_schedule( $this->params['work_periods'] );
				} elseif ( $this->params['is_custom_schedule'] == 'off' ) {
					$service->delete_custom_schedule();
				}
				$extra_response_vars['record_id'] = $service->id;
				do_action( 'latepoint_service_saved', $service, $is_new_record, $this->params['service'] );
			} else {
				$response_html = $service->get_error_messages();
				$status        = LATEPOINT_STATUS_ERROR;
			}
			if ( $this->get_return_format() == 'json' ) {
				$this->send_json(
					array(
						'status'  => $status,
						'message' => $response_html,
					) + $extra_response_vars 
				);
			}
		}


		/*
		  Delete service
		*/

		public function destroy() {
			if ( filter_var( $this->params['id'], FILTER_VALIDATE_INT ) ) {
				$this->check_nonce( 'destroy_service_' . $this->params['id'] );
				$service = new OsServiceModel( $this->params['id'] );
				if ( $service->delete() ) {
					$status        = LATEPOINT_STATUS_SUCCESS;
					$response_html = __( 'Service Removed', 'latepoint' );
				} else {
					$status        = LATEPOINT_STATUS_ERROR;
					$response_html = __( 'Error Removing Service', 'latepoint' );
				}
			} else {
				$status        = LATEPOINT_STATUS_ERROR;
				$response_html = __( 'Error Removing Service', 'latepoint' );
			}

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

		public function duplicate() {
			if ( filter_var( $this->params['id'], FILTER_VALIDATE_INT ) ) {
				$this->check_nonce( 'duplicate_service_' . $this->params['id'] );

				$original_service     = new OsServiceModel( $this->params['id'] );
				$cloned_service       = clone $original_service;
				$cloned_service->id   = null; // reset ID to create a new record
				$cloned_service->name = $cloned_service->name . ' - ' . __( 'Copy', 'latepoint' );

				if ( $cloned_service->save() ) {
					$status        = LATEPOINT_STATUS_SUCCESS;
					$response_html = OsRouterHelper::build_link( OsRouterHelper::build_route_name( 'services', 'edit_form' ), array( 'id' => $cloned_service->id ) );
					OsActivitiesHelper::create_activity(
						array(
							'code'       => 'service_created',
							'service_id' => $cloned_service->id,
						) 
					);

					$work_periods = new OsWorkPeriodModel();
					$work_periods = $work_periods->where( [ 'service_id' => $original_service->id ] )->get_results_as_models();
					foreach ( $work_periods as $work_period ) {
						$new_period             = clone $work_period;
						$new_period->id         = null; // reset ID to create a new record
						$new_period->service_id = $cloned_service->id; // set new service ID
						$new_period->save();
					}

					$connection_model = new OsConnectorModel();
					$connectors       = $connection_model->where( [ 'service_id' => $original_service->id ] )->get_results_as_models();

					foreach ( $connectors as $connector ) {
						$new_connector             = clone $connector;
						$new_connector->id         = null;
						$new_connector->service_id = $cloned_service->id; // set new location ID
						$new_connector->save();
					}

					$meta       = new OsServiceMetaModel();
					$meta_items = $meta->where( [ 'object_id' => $original_service->id ] )
									   ->where_not_in( 'meta_key', [ 'woocommerce_product_id', 'surecart_product_id' ] )
									   ->get_results_as_models();
					foreach ( $meta_items as $meta_item ) {
						$new_meta_item            = clone $meta_item;
						$new_meta_item->id        = null;
						$new_meta_item->object_id = $cloned_service->id;
						$new_meta_item->save();
					}

					#available in pro version only
					if ( class_exists( 'OsServiceExtraConnectorModel' ) ) {
						$extras = new OsServiceExtraConnectorModel();
						$extras = $extras->where( [ 'service_id' => $original_service->id ] )->get_results_as_models();
						foreach ( $extras as $extra ) {
							$new_extra             = clone $extra;
							$new_extra->id         = null;
							$new_extra->service_id = $cloned_service->id;
							$new_extra->save();
						}
					}
				}
			} else {
				$status        = LATEPOINT_STATUS_ERROR;
				$response_html = __( 'Error Creating Service', 'latepoint' );
			}

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


endif;
