<?php

class WPML_TF_Feedback_Collection extends WPML_TF_Collection {

	private $order;
	private $filter_value;

	public function reduce_collection( $offset, $length ) {
		$this->collection = array_slice( $this->collection, $offset, $length, true );
	}

	public function sort_collection( $property, $order ) {
		$this->order = $order;
		$method      = 'compare_by_' . $property;

		if ( method_exists( $this, $method ) ) {
			@uasort( $this->collection, array( $this, $method ) );
		}
	}

	private function compare_by_pending( WPML_TF_Feedback $a, WPML_TF_Feedback $b ) {
		if ( $a->is_pending() && ! $b->is_pending() ) {
			$compare = -1;
		} elseif ( ! $a->is_pending() && $b->is_pending() ) {
			$compare = 1;
		} else {
			$compare = $this->compare_by_id( $a, $b );
		}

		return $compare;
	}

	private function compare_by_feedback( WPML_TF_Feedback $a, WPML_TF_Feedback $b ) {
		if ( 'asc' === $this->order ) {
			$compare = strcasecmp( $a->get_content(), $b->get_content() );
		} else {
			$compare = strcasecmp( $b->get_content(), $a->get_content() );
		}

		if ( 0 === $compare ) {
			$compare = $this->compare_by_id( $a, $b );
		}

		return $compare;
	}

	private function compare_by_rating( WPML_TF_Feedback $a, WPML_TF_Feedback $b ) {
		if ( 'asc' === $this->order ) {
			$compare = $a->get_rating() - $b->get_rating();
		} else {
			$compare = $b->get_rating() - $a->get_rating();
		}

		if ( 0 === $compare ) {
			$compare = $this->compare_by_id( $a, $b );
		}

		return $compare;
	}

	private function compare_by_status( WPML_TF_Feedback $a, WPML_TF_Feedback $b ) {
		if ( 'asc' === $this->order ) {
			$compare = strcmp( $a->get_text_status(), $b->get_text_status() );
		} else {
			$compare = strcmp( $b->get_text_status(), $a->get_text_status() );
		}

		if ( 0 === $compare ) {
			$compare = $this->compare_by_id( $a, $b );
		}

		return $compare;
	}

	private function compare_by_document_title( WPML_TF_Feedback $a, WPML_TF_Feedback $b ) {
		if ( 'asc' === $this->order ) {
			$compare = strcasecmp( $a->get_document_information()->get_title(), $b->get_document_information()->get_title() );
		} else {
			$compare = strcasecmp( $b->get_document_information()->get_title(), $a->get_document_information()->get_title() );
		}

		if ( 0 === $compare ) {
			$compare = $this->compare_by_id( $a, $b );
		}

		return $compare;
	}

	private function compare_by_date( WPML_TF_Feedback $a, WPML_TF_Feedback $b ) {
		if ( 'asc' === $this->order ) {
			$compare = strtotime( $a->get_date_created() ) - strtotime( $b->get_date_created() );
		} else {
			$compare = strtotime( $b->get_date_created() ) - strtotime( $a->get_date_created() );
		}

		if ( 0 === $compare ) {
			$compare = $this->compare_by_id( $a, $b );
		}

		return $compare;
	}

	private function compare_by_id( WPML_TF_Feedback $a, WPML_TF_Feedback $b ) {
		if ( 'asc' === $this->order ) {
			return $a->get_id() - $b->get_id();
		} else {
			return $b->get_id() - $a->get_id();
		}
	}

	public function link_messages_to_feedback( WPML_TF_Message_Collection $message_collection ) {
		foreach ( $message_collection as $message ) {
			if ( array_key_exists( $message->get_feedback_id(), $this->collection ) ) {
				$this->collection[ $message->get_feedback_id() ]->add_message( $message );
			}
		}
	}

	public function filter_by( $property, $value ) {
		$this->filter_value = $value;
		$method             = 'filter_by_' . $property;

		if ( method_exists( $this, $method ) ) {
			$this->collection = array_filter( $this->collection, array( $this, $method ) );
		}
	}

	private function filter_by_status( WPML_TF_Feedback $feedback ) {
		if ( $feedback->get_status() === $this->filter_value ) {
			return true;
		}

		return false;
	}

	private function filter_by_language( WPML_TF_Feedback $feedback ) {
		if ( $feedback->get_language_to() === $this->filter_value ) {
			return true;
		}

		return false;
	}

	private function filter_by_post_id( WPML_TF_Feedback $feedback ) {
		if ( 0 === strpos( $feedback->get_document_type(), 'post_' )
		     && $feedback->get_document_id() === (int) $this->filter_value
		) {
			return true;
		}

		return false;
	}

	public function remove_trashed() {
		foreach ( $this->collection as $id => $feedback ) {
			if ( 'trash' === $feedback->get_status() ) {
				unset( $this->collection[ $id ] );
			}
		}
	}
}
