<?php

class OsLocationModel extends OsModel {
	public $id,
	  $name,
	  $full_address,
	  $selection_image_id,
	  $status,
	  $category_id,
	  $order_number,
	  $services_agents_table_name,
	  $updated_at,
	  $created_at;

	function __construct( $id = false ) {
		parent::__construct();
		$this->table_name                 = LATEPOINT_TABLE_LOCATIONS;
		$this->services_agents_table_name = LATEPOINT_TABLE_AGENTS_SERVICES;
		$this->nice_names                 = array(
			'name' => __( 'Location Name', 'latepoint' ),
		);

		if ( $id ) {
			$this->load_by_id( $id );
		}
	}

	public function generate_data_vars(): array {
		$location_category = empty( $this->category_id ) ? false : new OsLocationCategoryModel( $this->category_id );
		return [
			'id'           => $this->id,
			'name'         => $this->name,
			'full_address' => $this->full_address,
			'category'     => $location_category ? $location_category->get_data_vars() : [],
		];
	}

	public function filter_allowed_records(): OsModel {
		if ( ! OsRolesHelper::are_all_records_allowed( 'location' ) ) {
			$this->filter_where_conditions( [ 'id' => OsRolesHelper::get_allowed_records( 'location' ) ] );
		}
		return $this;
	}

	protected function allowed_params( $role = 'admin' ) {
		$allowed_params = array(
			'id', 
			'name', 
			'full_address', 
			'status', 
			'category_id', 
			'order_number', 
			'selection_image_id', 
		);
		return $allowed_params;
	}

	protected function params_to_save( $role = 'admin' ) {
		$params_to_save = array(
			'id', 
			'name',
			'status',
			'category_id',
			'order_number',
			'full_address', 
			'selection_image_id',
		);
		return $params_to_save;
	}


	protected function before_create() {
	}

	protected function set_defaults() {
		if ( empty( $this->category_id ) ) {
			$this->category_id = 0;
		}
		if ( empty( $this->status ) ) {
			$this->status = LATEPOINT_LOCATION_STATUS_ACTIVE;
		}
	}
  
	public function save_custom_schedule( $work_periods ) {
		foreach ( $work_periods as &$work_period ) {
			$work_period['location_id'] = $this->id;
		}
		unset( $work_period );
		OsWorkPeriodsHelper::save_work_periods( $work_periods );
	}

	public function get_google_maps_link( $embed = false ) {
		$extra = $embed ? '&output=embed' : '';
		return 'https://google.com/maps?q=' . urlencode( $this->full_address ) . $extra;
	}

	public function get_google_maps_iframe( $height = '240' ) {
		return '<iframe width="100%" height="' . $height . '" frameborder="0" scrolling="no" marginheight="0" marginwidth="0" src="' . $this->get_google_maps_link( true ) . '"></iframe>';
	}

	public function delete_custom_schedule() {
		$work_periods_model = new OsWorkPeriodModel();
		$work_periods       = $work_periods_model->where(
			array(
				'location_id' => $this->id,
				'agent_id'    => 0,
				'service_id'  => 0,
				'custom_date' => 'IS NULL',
			) 
		)->get_results_as_models();
		if ( is_array( $work_periods ) ) {
			foreach ( $work_periods as $work_period ) {
				$work_period->delete();
			}
		}
	}

	public function count_number_of_connected_services( $agent_id = false ) {
		if ( $this->is_new_record() ) {
			return 0;
		}
		$args = [ 'location_id' => $this->id ];
		if ( $agent_id ) {
			$args['agent_id'] = $agent_id;
		}
		return OsConnectorHelper::count_connections( $args, 'service_id' );
	}

	public function get_connected_agents() {
		$connector = new OsConnectorModel();
		$agent_ids = $connector->select( 'agent_id' )->where( [ 'location_id' => $this->id ] )->group_by( 'agent_id' )->get_results();
		$agents    = [];
		if ( $agent_ids ) {
			foreach ( $agent_ids as $connector_row ) {
				$agents[] = new OsAgentModel( $connector_row->agent_id );
			}
		}
		return $agents;
	}

	public function save_agents_and_services( $agents ) {
		if ( ! $agents ) {
			return true;
		}
		$connections_to_save   = [];
		$connections_to_remove = [];
		foreach ( $agents as $agent_key => $services ) {
			$agent_id = str_replace( 'agent_', '', $agent_key );
			foreach ( $services as $service_key => $service ) {
				$service_id = str_replace( 'service_', '', $service_key );
				$connection = [
					'location_id' => $this->id,
					'agent_id'    => $agent_id,
					'service_id'  => $service_id,
				];
				if ( $service['connected'] == 'yes' ) {
					$connections_to_save[] = $connection;
				} else {
					$connections_to_remove[] = $connection;
				}
			}
		}
		if ( ! empty( $connections_to_save ) ) {
			foreach ( $connections_to_save as $connection_to_save ) {
				OsConnectorHelper::save_connection( $connection_to_save );
			}
		}
		if ( ! empty( $connections_to_remove ) ) {
			foreach ( $connections_to_remove as $connection_to_remove ) {
				OsConnectorHelper::remove_connection( $connection_to_remove );
			}
		}
		return true;
	}

	public function delete( $id = false ) {
		if ( ! $id && isset( $this->id ) ) {
			$id = $this->id;
		}
		if ( $id && $this->db->delete( $this->table_name, array( 'id' => $id ), array( '%d' ) ) ) {
			$this->db->delete( LATEPOINT_TABLE_AGENTS_SERVICES, array( 'location_id' => $id ), array( '%d' ) );
			$this->db->delete( LATEPOINT_TABLE_BOOKINGS, array( 'location_id' => $id ), array( '%d' ) );
			$this->db->delete( LATEPOINT_TABLE_WORK_PERIODS, array( 'location_id' => $id ), array( '%d' ) );
			return true;
		} else {
			return false;
		}
	}

	public function should_be_active() {
		return $this->where( [ 'status' => LATEPOINT_LOCATION_STATUS_ACTIVE ] );
	}

	public function is_active() {
		return ( $this->status == LATEPOINT_LOCATION_STATUS_ACTIVE );
	}


	public function get_selection_image_url() {
		$default_location_image_url = LATEPOINT_IMAGES_URL . 'location-image.png';
		return OsImageHelper::get_image_url_by_id( $this->selection_image_id, 'thumbnail', $default_location_image_url );
	}

	public function has_agent( $agent_id ) {
		return OsConnectorHelper::has_connection(
			[
				'location_id' => $this->id,
				'agent_id'    => $agent_id,
			] 
		);
	}

	public function has_agent_and_service( $agent_id, $service_id ) {
		if ( $this->is_new_record() ) {
			return false;
		}
		return OsConnectorHelper::has_connection(
			[
				'location_id' => $this->id,
				'agent_id'    => $agent_id,
				'service_id'  => $service_id,
			] 
		);
	}

	protected function properties_to_validate() {
		$validations = array(
			'name' => array( 'presence', 'uniqueness' ),
		);
		return $validations;
	}
}
