package es.pulsoft.controlador.entity;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import javax.validation.constraints.Email;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;


/*
 Ejercicio ORM con Hibernate Clase Director

Objetivo:
Mapear las entidades Director y Escuela utilizando Hibernate con una relación uno a uno.

Requisitos:

    Entidad Director:
        Atributos: id, nombre, correo, escuela.
        Relación uno a uno con la entidad Escuela.

    Entidad Escuela:
        Atributos: id, nombre, director.
        Relación uno a uno con la entidad Director.

    Operaciones:
        Crear un director con su escuela asociada.
        Consultar un director y su escuela.
        Eliminar un director y su escuela (usando cascada).

Tareas:

    Crea las clases Director y Escuela, mapeándolas a las tablas correspondientes.
    Configura la relación uno a uno entre Director y Escuela.
    Realiza operaciones CRUD con Hibernate.

Consejo:
Utiliza CascadeType.ALL y FetchType.LAZY en la relación entre las entidades.
 */
@Entity
@Table(name = "director")
public class Director {

    /**
     * Identificador único del director.
     * Este campo es generado automáticamente por la base de datos.
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private int id;

    /**
     * Nombre del director.
     */
    @NotBlank(message="El campo nombre no puede quedar en blanco")
    @Size( min = 6, max=15 ,message="El nombre tiene que tener entre 6 y 15 caracteres")
    @Column(name = "nombre")
    private String nombre;

    /**
     * Correo electrónico del director.
     */
    @NotBlank(message="El campo email no puede quedar vacio")
	@Email
    @Column(name = "correo")
    private String correo;

    /**
     * Relación uno a uno con la entidad Escuela.
     * Un director está asociado a una única escuela.
     * La relación es mapeada por el campo "director" en la entidad Escuela.
     */
    @OneToOne(mappedBy = "director", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    private Escuela escuela;

    /**
     * Constructor por defecto de la clase Director.
     * Requerido por JPA.
     */
    public Director() {
    }

    /**
     * Constructor que inicializa un director con nombre y correo.
     *
     * @param nombre El nombre del director.
     * @param correo El correo electrónico del director.
     */
    public Director(String nombre, String correo) {
        this.nombre = nombre;
        this.correo = correo;
    }

    /**
     * Obtiene el identificador único del director.
     *
     * @return El identificador del director.
     */
    public int getId() {
        return id;
    }

    /**
     * Establece el identificador único del director.
     *
     * @param id El identificador del director.
     */
    public void setId(int id) {
        this.id = id;
    }

    /**
     * Obtiene el nombre del director.
     *
     * @return El nombre del director.
     */
    public String getNombre() {
        return nombre;
    }

    /**
     * Establece el nombre del director.
     *
     * @param nombre El nombre del director.
     */
    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    /**
     * Obtiene el correo electrónico del director.
     *
     * @return El correo electrónico del director.
     */
    public String getCorreo() {
        return correo;
    }

    /**
     * Establece el correo electrónico del director.
     *
     * @param correo El correo electrónico del director.
     */
    public void setCorreo(String correo) {
        this.correo = correo;
    }

    /**
     * Obtiene la escuela asociada al director.
     *
     * @return La escuela asociada al director.
     */
    public Escuela getEscuela() {
        return escuela;
    }

    /**
     * Establece la escuela asociada al director.
     *
     * @param escuela La escuela asociada al director.
     */
    public void setEscuela(Escuela escuela) {
        this.escuela = escuela;
    }

    /**
     * Devuelve una representación en cadena de texto del objeto Director.
     *
     * @return Una cadena que representa al director, incluyendo su ID, nombre y correo.
     */
    @Override
    public String toString() {
        return "\nId=" + id + "\nNombre=" + nombre + "\nCorreo=" + correo;
    }
}