package com.packtpub.hibernatesearch.domain;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

import org.hibernate.search.annotations.Field;
import org.hibernate.search.annotations.Indexed;

/**
 * Prosta klasa encji reprezentująca aplikację komputerową ... z nazwą, długim opisem 
 * i nazwą pliku użytego jako ikona.  
 * 
 * Adnotacja @Entity nakazuje Hibernate by zmapowało klasę do tabeli w bazie danych, podczas gdy adnotacja @Indexed 
 * nakazuje narzędziu Hibernate Search by zmapowało ją do indeksu Lucene. 
 */
@Entity
@Indexed
public class App implements Serializable {

	private static final long serialVersionUID = 1L;

	/**
	 * Klucz główny, skonfigurowany tak, by był generowany automatycznie podczas tworzenia nowej instancji
	 */
	@Id
  @GeneratedValue
  private Long id;
	
	/**
	 * Nazwa aplikacji zrozumiała dla ludzi. Adnotacja @Column informuje Hibernate by zmapował to pole do 
	 * kolumny w bazie danych, natomiast adnotacja @Field nazakuje Hibernate Search by zmapował je jako pole 
	 * w indeksie Lucene.
	 */
	@Column
	@Field
  private String name;	
	
	/**
	 * Dłuższy, bardziej szczegółowy opis aplikacji. Adnotacja @Column nazakuje Hibernateowi zmapować to pole do 
	 * kolumny w bazie danych, natomiast adnotacja @Field nakazuje Hibernate Search by zmapował je jako pole  
	 * indeksie Lucene.
	 */
	@Column(length=1000)
	@Field
  private String description;
	
	/**
	 * Nazwa pliku obrazka mającego być powiązanym z aplikacją. Spodziewamy się, że plik będzie istniał w podkatalogu 
	 * "images/apps/<obrazek>".  To pole nie ma adnotacji @Field, ponieważ nie planujemy przeszukiwania aplikacji pod  
	 * kątem nazw plików obrazków.
	 */
	@Column
  private String image;
	
	/**
	 * Domyślny pusty konstruktor.
	 */
	public App() {}
	
	/**
	 * Wygodny konstruktor, ustawiający zawartość wszystkich pól w jednym kroku.
	 */
	public App(String name, String image, String description) {
		this.name = name;
		this.image = image;
		this.description = description;
	}

	//
	// GETTERY I SETTERY
	//
	
	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getDescription() {
		return description;
	}

	public void setDescription(String description) {
		this.description = description;
	}

	public String getImage() {
		return image;
	}

	public void setImage(String image) {
		this.image = image;
	}
	
}
