package xyz.danielcortes.models;

import java.time.Year;
import java.util.Set;
import javax.persistence.Column;
import javax.persistence.Convert;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import xyz.danielcortes.framework.YearAttributeConverter;

@Entity
@Table(name = "libro")
public class Libro {

  @Id
  @GeneratedValue(strategy=GenerationType.IDENTITY)
  @Column(name = "id", nullable = false)
  private Integer id;

  @Column(name = "serie", unique = true)
  private String serie;

  @Column(name = "isbn", nullable = false)
  private String isbn;

  @Column(name = "titulo")
  private String titulo;

  @Column(name = "numero_paginas", nullable = false)
  private int numeroPaginas;

  @Column(name = "precio_referencia", nullable = false)
  private int precioReferencia;

  @Column(name = "ano_publicacion", columnDefinition = "int")
  @Convert(converter = YearAttributeConverter.class)
  private Year anoPublicacion;

  @ManyToMany
  @JoinTable(
      name = "libro_idioma",
      joinColumns = @JoinColumn(name = "libro_id", referencedColumnName = "id"),
      inverseJoinColumns = @JoinColumn(name = "idioma_id", referencedColumnName = "id")
  )
  private Set<Idioma> idiomas;

  @ManyToMany
  @JoinTable(
      name = "libro_autor",
      joinColumns = @JoinColumn(name = "libro_id", referencedColumnName = "id"),
      inverseJoinColumns = @JoinColumn(name = "autor_id", referencedColumnName = "id")
  )
  private Set<Autor> autores;

  @ManyToMany
  @JoinTable(
      name = "libro_categoria",
      joinColumns = @JoinColumn(name = "libro_id", referencedColumnName = "id"),
      inverseJoinColumns = @JoinColumn(name = "categoria_id", referencedColumnName = "id")
  )
  private Set<Categoria> categorias;

  @ManyToOne
  @JoinColumn(name = "editorial_id")
  private Editorial editorial;

  @ManyToOne
  @JoinColumn(name = "estado_id")
  private Estado estado;

  public Integer getId() {
    return id;
  }

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

  public String getSerie() {
    return serie;
  }

  public void setSerie(String serie) {
    this.serie = serie;
  }

  public String getIsbn() {
    return isbn;
  }

  public void setIsbn(String isbn) {
    this.isbn = isbn;
  }

  public String getTitulo() {
    return titulo;
  }

  public void setTitulo(String titulo) {
    this.titulo = titulo;
  }

  public int getNumeroPaginas() {
    return numeroPaginas;
  }

  public void setNumeroPaginas(int numeroPaginas) {
    this.numeroPaginas = numeroPaginas;
  }

  public int getPrecioReferencia() {
    return precioReferencia;
  }

  public void setPrecioReferencia(int precioReferencia) {
    this.precioReferencia = precioReferencia;
  }

  public Year getAnoPublicacion() {
    return anoPublicacion;
  }

  public void setAnoPublicacion(Year anoPublicacion) {
    this.anoPublicacion = anoPublicacion;
  }

  public Set<Idioma> getIdiomas() {
    return idiomas;
  }

  public void setIdiomas(Set<Idioma> idiomas) {
    this.idiomas = idiomas;
  }

  public Set<Autor> getAutores() {
    return autores;
  }

  public void setAutores(Set<Autor> autores) {
    this.autores = autores;
  }

  public Set<Categoria> getCategorias() {
    return categorias;
  }

  public void setCategorias(Set<Categoria> categorias) {
    this.categorias = categorias;
  }

  public Editorial getEditorial() {
    return editorial;
  }

  public void setEditorial(Editorial editorial) {
    this.editorial = editorial;
  }

  public Estado getEstado() {
    return estado;
  }

  public void setEstado(Estado estado) {
    this.estado = estado;
  }

  @Override
  public String toString() {
    return this.serie + " " + this.isbn + " " + this.titulo;
  }
}

