package com.packtpub.hibernatesearch.domain;

import javax.persistence.Embeddable;

import org.hibernate.search.annotations.Field;

/**
 * Osadzalny obiekt (lub "komponent" w tradycyjnym żargonie Hibernate), przechowujący opinię użytkownika o aplikacji. 
 * Opinia składa się z nazwy użytkownika prezentującego opinię, liczby gwiazdek (maksimum pięć) oznaczających ocenę aplikacji,
 * oraz komentarza.
 * 
 * Adnotacja @Embeddable informuje Hibernate, że czas życia obiektu jest zależny od czasu życia obiektu w którym się zawiera.
 * Innymi słowy, gdy aplikacja zostanie skasowana, razem z nią zostaną skasowane komentarze jej dotyczące.
 *
 * Ponieważ ta klasa nie jest adnotowana za pomocą @Indexed, Hibernate Search nie utworzy dla niej indeksu Lucene.
 * Wszystkie informacje wskazane do indeksowania trafią do indeksu Lucene obiektu w którym się zawiera. 
 */
@Embeddable
public class CustomerReview {

	/**
	 * Nazwa użytkownika osoby wysyłającej komentarz. Adnotacja @Column jest zbędna dla osadzalnych obiektów, 
	 * jednak adnotacja Hibernate Search @Field jest nadal używana by zmapować pole na indeks Lucene dowolnej encji, w której 
	 * obiekt został osadzony (np. App).
	 */	
	@Field
	private String username;
	
	/**
	 * Ocena w skali od 1 do 5 (np. "4 z 5 gwiazdek"). Nie planujemy wyszukiwania na podstawie tej wartości, więc nie użyjemy 
	 * adnotacji @Column ani @Field.
	 */
	private int stars;
	
	/**
	 * Komentarz dotyczący aplikacji.  Adnotacja @Column jest zbędna dla osadzalnych obiektów, 
	 * jednak adnotacja Hibernate Search @Field jest nadal używana by zmapować pole na indeks Lucene dowolnej encji, w której 
	 * obiekt został osadzony (np. App).
	 */	
	@Field
	private String comments;

	/**
	 * Domyślny pusty konstruktor.
	 */
	public CustomerReview() {
	}
	
	/**
	 * Wygodny konstruktor, ustawiający wszystkie wartości pól jednocześnie.
	 */
	public CustomerReview(String username, int stars, String comments) {
		this.username = username;
		this.stars = stars;
		this.comments = comments;
	}

	//
	// GETTERY I SETTERY
	//
	
	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public int getStars() {
		return stars;
	}

	public void setStars(int stars) {
		this.stars = stars;
	}

	public String getComments() {
		return comments;
	}

	public void setComments(String comments) {
		this.comments = comments;
	}
	
}
