<?php

class OsLocationCategoryModel extends OsModel {
	public $id,
	  $name,
	  $parent_id,
	  $selection_image_id,
	  $order_number,
	  $short_description;

	function __construct( $id = false ) {
		parent::__construct();
		$this->table_name = LATEPOINT_TABLE_LOCATION_CATEGORIES;
		$this->nice_names = array(
			'name'               => __( 'Location Category Name', 'latepoint' ),
			'short_description'  => __( 'Location Category Short Description', 'latepoint' ),
			'selection_image_id' => __( 'Location Category Selection Image', 'latepoint' ),
		);

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

	public function generate_data_vars(): array {
		return [
			'id'   => $this->id,
			'name' => $this->name,
		];
	}

	public function count_locations() {
		$location         = new OsLocationModel();
		$total_location   = $location->filter_allowed_records()->where( [ 'category_id' => $this->id ] )->should_be_active()->count();
		$child_categories = new OsLocationCategoryModel();
		$child_categories = $child_categories->where( [ 'parent_id' => $this->id ] )->get_results_as_models();
		if ( $child_categories ) {
			foreach ( $child_categories as $child_category ) {
				$total_location = $total_location + $child_category->count_locations();
			}
		}
		return $total_location;
	}

	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->update( LATEPOINT_TABLE_SERVICES, array( 'category_id' => 0 ), array( 'category_id' => $id ), array( '%d' ) );
			$this->db->update( $this->table_name, array( 'parent_id' => null ), array( 'parent_id' => $id ), array( '%d' ) );
			return true;
		} else {
			return false;
		}
	}

	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 );
	}

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

	public function index_for_select() {
		$categories            = $this->db->get_results( 'SELECT id, name FROM ' . $this->table_name );
		$categories_for_select = array();

		$categories_for_select[] = array(
			'value' => 0,
			'label' => __( 'Not categorized', 'latepoint' ),
		);
		foreach ( $categories as $category ) {
			$categories_for_select[] = array(
				'value' => $category->id,
				'label' => $category->name,
			);
		}

		return $categories_for_select;
	}

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


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

	public function get_active_locations( $filter_allowed_records = false ) {
		if ( ! isset( $this->active_locations ) ) {
			$location = new OsLocationModel();
			if ( $filter_allowed_records ) {
				$location->filter_allowed_records();
			}
			$location->should_be_active()->where( array( 'category_id' => $this->id ) )->order_by( 'order_number asc' );
			$this->active_locations = $location->get_results_as_models();
		}
		return $this->active_locations;
	}

	public function get_disabled_locations( $filter_allowed_records = false ) {
		if ( ! isset( $this->disabled_locations ) ) {
			$location = new OsLocationModel();
			if ( $filter_allowed_records ) {
				$location->filter_allowed_records();
			}
			$location->where(
				array(
					'category_id' => $this->id,
					'status'      => LATEPOINT_LOCATION_STATUS_DISABLED,
				) 
			)->order_by( 'order_number asc' );
			$this->disabled_locations = $location->get_results_as_models();
		}
		return $this->disabled_locations;
	}

	protected function get_locations( $filter_allowed_records = false ) {
		if ( ! isset( $this->locations ) ) {
			$location = new OsLocationModel();
			if ( $filter_allowed_records ) {
				$location->filter_allowed_records();
			}
			$this->locations = $location->where( array( 'category_id' => $this->id ) )->order_by( 'order_number asc' )->get_results_as_models();
		}
		return $this->locations;
	}
}
