<?PHP

require_once 'class.templatepage.php';

class ReviewPage extends TemplatePage {
	public function __construct() {
		parent::__construct();
	}

	public function generate() {
		$this->write_menu( 'music' );
		$review_id = getInt( 'review_id' );
		$table = getString( 'table' );
		$id = getInt( 'id' );
		$edit = getInt( 'edit' );
		$delete = getInt( 'delete' );

		if ( $review_id ) {
			$row = $this->reviewService->getById( $review_id );
			$review = new Review( $this, $row );
		} else {
			$review = new Review( $this );
			$review->set_data( 'table', $table );
			$review->set_data( 'id', $id );
		}

		if ( $review->get_data( 'id' ) ) {
			$this->add_breadcrumb( $this->language( 'breadcrumb-all-music' ), 'music' );
			// Load music
			switch ( $review->get_data( 'table' ) ) {
				case 'music':
					$music = $review->get_data( 'object' );
					$this->add_breadcrumb( $music->get_data( 'piece' )->get_data( 'title', true ), $music->get_data( 'piece' )->get_view() );
					$this->add_breadcrumb( $music->get_data( 'title', true ), $music->get_view() );
					break;
				case 'music_links':
					$music_link = $review->get_data( 'object' );
					if ( $music_link->get_data( 'composer' ) ) {
						$this->add_breadcrumb( $music_link->get_data( 'composer' )->get_name( 'LAST_INITIALS' ), $music_link->get_data( 'composer' )->get_link() );
					}
					$this->add_breadcrumb( $music_link->get_data( 'title', true ), $music_link->get_link() );
					break;
			}

			if ( $review->get_data( 'review_id' ) || ( $edit && !$review_id ) ) {
				$this->add_breadcrumb( $this->language( 'breadcrumb-musicreviews' ), $review->get_link() );

				// Edit/delete musicreview
				if ( $delete ) {
					if ( $this->session->user && $this->session->user->may_edit( $review->get_data( 'author_id' ) ) ) {
						$review->delete();
						$this->redirect( "{$this->base}/{$review->get_link()}" );
					}
				} elseif ( $edit ) {
					// Check they may edit the current review, or they are creating a new one
					if ( ( !$this->session->user && !$review_id ) || ( $this->session->user && $this->session->user->may_edit( $review->get_data( 'author_id' ) ) ) ) {
						if ( $review->get_data( 'table' ) === 'music' ) {
							$this->output( $review->get_data( 'object' )->get_right_thumbnail( true ) );
						}

						if ( $review->get_data( 'review_id' ) ) {
							$this->write_lang_title( 'title-edit-musicreview' );
							$this->output( '<h1>' . $this->language( 'title-edit-musicreview' ) . '</h1>' );
							$this->add_breadcrumb( $this->language( 'title-edit-musicreview' ) );
						} else {
							$review->set_data( 'published', date( 'Y-m-d H:i:s' ) );
							$this->write_lang_title( 'title-new-musicreview' );
							$this->output( '<h1>' . $this->language( 'title-new-musicreview' ) . '</h1>' );
							$this->add_breadcrumb( $this->language( 'breadcrumb-new-musicreview' ) );
							if ( $this->session->user ) {
								$review->set_data( 'author_id', $this->session->user->get_data( 'user_id' ) );
							}
						}

						$form = new Form( $this );
						$form_alt1 = new Form( $this, 'review_text' );
						$form_alt2 = new Form( $this, 'review_rating' );
						if ( $form_alt1->isPostBack() || $form_alt2->isPostBack() ) {
							$form->forcePostBack();
						}

						$form->add_field( new Field( 'hidden', 'locknum', $review->get_data( 'locknum' ) ) );
						if ( $this->session->user ) {
							$form->add_html_field( $this->session->user->get_name(), $this->language( 'label-musicreview-name' ) );
						} else {
							$form->add_field( new Field( 'textbox', 'author_name', $review->get_data( 'score' ), $this->language( 'label-musicreview-name' ), $this->language( 'form-ins-musicreview-name' ) ) );
							$form->add_validator( new Validator( 'author_name', 'stringLength', $this->language( 'form-err-musicreview-name' ), [ 'from' => 1, 'to' => null ] ) );
						}
						$rating = new Field( 'rating', 'score', $review->get_data( 'score' ), $this->language( 'label-musicreview-score' ), $this->language( 'form-ins-musicreview-score', [ 'min-score' => 1, 'max-score' => 5 ] ) );
						$rating->set_range( 1, 5 );
						$form->add_field( $rating );
						$form->add_validator( new Validator( 'score', 'numericRange', $this->language( 'form-err-musicreview-score' ), [ 'from' => 1, 'to' => 5 ] ) );
						$form->add_field( new Field( 'textarea', 'text', $review->get_data( 'text' ), $this->language( 'label-musicreview-text' ), $this->language( 'form-ins-musicreview-text' ) ) );
						$l = $review->get_data( 'lang' ) ? $review->get_data( 'lang' ) : $this->session->set_lang;
						$lang_field = $form->add_field( new Field( 'select', 'lang', $l, $this->language( 'label-message-lang' ), $this->language( 'form-ins-message-lang' ) ) );
						foreach ( $this->db()->language_get_languages() as $lang ) {
							$lang_field->add_option( $lang, $this->language( 'language-name-' . $lang, null, $lang ) );
						}

						$form->add_validator( new Validator( 'text', 'stringLength', $this->language( 'form-err-musicreview-text' ), [ 'from' => 10, 'to' => null ] ) );
						if ( !$this->session->user ) {
							$form->add_field( new Field( 'captcha', 'captcha', '', $this->language( 'label-general-captcha' ), $this->language( 'form-ins-general-captcha' ), true ) );
							$form->add_validator( new Validator( 'captcha', 'captcha', $this->language( 'form-err-general-captcha' ) ) );
						}
						if ( $this->session->user && $this->session->user->get_data( 'admin' ) ) {
							$form->add_field( new Field( 'checkbox', 'approved', $review->get_data( 'approved' ), 'Approved' ) );// $this->language('label-review-approved'), $this->language('form-ins-review-approved')));
							$form->add_field( new Field( 'checkbox', 'nonsense', $review->get_data( 'nonsense' ), 'Nonsense' ) );// $this->language('label-review-nonsense'), $this->language('form-ins-review-nonsense')));
						}
						$form->add_button( $this->language( 'button-post', null, false, false ), 'save', 'check' );
						$form->default_button = 'save';
						$button = $form->add_button( $this->language( 'button-preview', null, false, false ), 'preview', 'search', 'alt' );
						$button->no_validation = true;
						$form->add_link_button( $this->language( 'button-cancel', null, false, false ), 'back', $review->get_link(), 'times', 'alt' );

						// Data received
						if ( $form->isPostBack() && isset( $_POST['lang'] ) ) {
							$form->validate();
							if ( $form->valid && $form->submit_button == 'save' ) {
								unset( $form->data['captcha'] );
								$review->data = array_merge( $review->data, $form->data );
								$translate = $this->translate();
								$detect_lang = $translate->detect( $review->get_data( 'text' ) );
								$review->set_data( 'detect_lang', $detect_lang['language'] );
								# $review->set_data('detect_lang_confidence', $detect_lang['confidence']);
								if ( $review->save() ) {
									$this->redirect( "{$this->base}/{$review->get_link(true, false)}?added=1" );
								} else {
									$this->redirect( "{$this->base}/{$review->get_link(true, false)}?edit=1" );
								}
							}
						} elseif ( $form->isPostBack() ) {
							$form->get_data();
						}
						$this->output(
							'<p>' . $this->language( 'help-musicreview-intro' ) . '</p>' .
							'<div class="clearRight"></div>'
						);

						$form->render();
						if ( $form->submit_button == 'preview' ) {
							$review->data = array_merge( $review->data, $form->data );
							$this->output( '<h2>' . $this->language( 'title-preview' ) . '</h2><hr />' );
							$this->output( '<ul class="reviewList">' . $review->render_listItem( '', true ) . '</ul>' );
						}
					}
				} else {
					$this->output( '<h1>' . $this->language( 'breadcrumb-musicreviews' ) . '</h1>' );
					$this->output( '<ul class="reviewList">' . $review->render_listItem( '', true ) . '</ul>' );
				}
			} else {
				// list reviews for this piece
				if ( !$review->check_redirect() ) {
					$this->redirect( "{$this->base}/{$review->get_link()}", true );
				}

				switch ( $review->get_data( 'table' ) ) {
					case 'music':
						$title = $review->get_data( 'object' )->get_data( 'full_title', true );
						$this->output( $review->get_data( 'object' )->get_right_thumbnail( true ) );
						break;
					case 'music_links':
						$title = $review->get_data( 'object' )->get_data( 'title', true );
						break;
				}
				$this->add_breadcrumb( $this->language( 'breadcrumb-musicreviews' ) );
				$this->write_lang_title( 'title-musicreviews-of', [ 'music-title' => $title ] );
				$this->output(
					'<h1>' . $this->language( 'title-musicreviews-of', [ 'music-title' => $title ] ) . '</h1>' .
					'<div id="reviewPopup">' .
						'<div class="reviewPopup">' .
							'<h2 class="modalOnly">' . $this->language( 'feedback-review-posted' ) . '</h2>' . // Thanks for posting a review!
							'<h3 class="modalOnly">' . $this->language( 'title-like-music' ) . '</h3>' .
							'<div class="nohide">' .
								$this->fb_like_button( $this->livebase . '/' . $review->get_data( 'object' )->get_link() ) .
							'</div>' .
							'<h3 class="modalOnly">' . $this->language( 'title-like-cantorion' ) . '</h3>' .
							'<div class="nohide">' .
								$this->fb_like_button( 'http://facebook.com/Cantorion' ) .
							'</div>' .
						'</div>' .
					'</div>' .
					'<p>' .
						'<a class="button button_alt" href="' . $review->get_data( 'object' )->get_link() . '?reviews">' .
							$this->button_link( $this->language( 'button-back' ), 'arrow-left' ) .
						'</a> ' .
						'<a class="button" href="' . $review->get_data( 'object' )->get_review_link() . '?edit=1">' .
							$this->button_link( $this->language( 'button-add-review' ), 'pencil-alt' ) .
						'</a>' .
					'</p>' .
					'<div class="clearRight"></div>'
				);

				if ( getint( 'added' ) ) {
					$this->output( '
						$( "#reviewPopup" ).clone().modal();//400,215
					', 'script', 'javascript' );
				}

				/*
				$form = new Form($this, null, null, 'get');
				$field = new Field('hidden', 'page', '1');
				$field->persistent = false;
				$form->add_field($field);
				if($form->isPostBack())
					$form->get_data();
				$form->render();

				$per_page = 10;
				$page = isset($form->data['page']) ? $form->data['page'] : 1;
				*/

				list( $rows, $count ) = $this->reviewService->getByTableId( $review->get_data( 'table' ), $review->get_data( 'id' ), 'nonsense, published DESC' );
				if ( $count ) {
					$this->output( '<h3>' . $this->language( 'feedback-musicreviews-found', [ 'number-of-reviews' => $count ] ) . '</h3>' );
					# $paging = new Paging($this, $form, false, $stmt->found_rows, $per_page, $page);
					# $paging->render('top');
					# $this->output('<h4>'.$this->language('feedback-results-range', array('first-result-index' => $paging->first, 'last-result-index' => $paging->last)).'</h4>');
					$this->output(
						'<span class="hreview-aggregate">' .
							'<span class="item">' .
								'<span class="fn">' . $title . '</span>' .
							'</span> ' .
							'<span class="rating">Rating: ' .
								'<span class="average">' . $review->get_data( 'object' )->get_data( 'avg_score', true ) . '</span> out of <span class="best">5</span> ' .
							'</span> ' .
							'based on ' .
							'<span class="count">' . $review->get_data( 'object' )->get_data( 'votes', true ) . '</span> reviews.' .
						'</span>'
					);
					$this->output( '<ul class="reviewList">' );
					foreach ( $rows as $row ) {
						$review = new Review( $this, $row );
						$this->output( $review->render_listItem( $title ) );
					}
					$this->output( '</ul>' );
					# if($paging->pages > 1)
					# $paging->render('bottom');
				} else {
					$this->output( '<p>' . $this->language( 'help-no-reviews' ) . '</p>' );
					Page::not_found();
				}
				$this->output( '
					var $li = $( location.hash + "_id" );
					$li.closest( "ul" ).prepend( $li );
				', 'script', 'javascript' );
			}
		} else {
			$this->redirect( "{$this->base}/music", true );
		}
	}
}
new ReviewPage();
