package es.pulsoft.controlador.entity;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

/*
 Ejercicio ORM con Hibernate - Entidad Escuela

Objetivo:
Crear la entidad Escuela y mapearla a la tabla correspondiente en la base de datos utilizando Hibernate.

Requisitos:

    Entidad Escuela:
        Atributos:
            id: Clave primaria (autogenerada).
            nombre: Nombre de la escuela.
            direccion: Dirección de la escuela.

    Relación:
        La entidad Escuela debe tener una relación uno a uno con la entidad Director mediante la anotación @OneToOne.

Instrucciones:

    Implementa la clase Escuela y mapea los atributos a la base de datos utilizando anotaciones de JPA.
    Configura la relación con la entidad Director usando la anotación @OneToOne y @JoinColumn.
 */
@Entity
@Table(name = "escuela")
public class Escuela {

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

    /**
     * Nombre de la escuela.
     */
    @Column(name = "nombre")
    @NotBlank(message="El nombre es obligatorio")
    @Size(min=3, max=20, message="El nombre debe tener entre {min} y {max} caracteres")
    private String nombre;

    @Column(name = "direccion")
    @NotBlank(message="La dirección es obligatoria")
    @Size(min=3, max=20, message="La dirección debe tener entre {min} y {max} caracteres")
    private String direccion;

    @OneToOne
    @JoinColumn(name = "director_id", unique = true)
    @NotNull(message="Debe seleccionar un director")
    private Director director;

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

    /**
     * Constructor que inicializa una escuela con nombre, dirección y director.
     *
     * @param nombre El nombre de la escuela.
     * @param direccion La dirección de la escuela.
     * @param director El director asociado a la escuela.
     */
    public Escuela(String nombre, String direccion, Director director) {
        this.nombre = nombre;
        this.direccion = direccion;
        this.director = director; // Asociamos el director directamente
    }

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

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

    /**
     * Obtiene el nombre de la escuela.
     *
     * @return El nombre de la escuela.
     */
    public String getNombre() {
        return nombre;
    }

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

    /**
     * Obtiene la dirección de la escuela.
     *
     * @return La dirección de la escuela.
     */
    public String getDireccion() {
        return direccion;
    }

    /**
     * Establece la dirección de la escuela.
     *
     * @param direccion La dirección de la escuela.
     */
    public void setDireccion(String direccion) {
        this.direccion = direccion;
    }

    /**
     * Obtiene el director asociado a la escuela.
     *
     * @return El director asociado.
     */
    public Director getDirector() {
        return director;
    }

    /**
     * Establece el director asociado a la escuela.
     *
     * @param director El director asociado a la escuela.
     */
    public void setDirector(Director director) {
        this.director = director;
    }

    /**
     * Devuelve una representación en cadena de texto de la escuela,
     * incluyendo su ID, nombre, dirección y los datos del director asociado.
     *
     * @return Una cadena que representa la escuela y su director.
     */
    @Override
    public String toString() {
        return "Id=" + id + "\nNombre=" + nombre + "\nDireccion=" + direccion + "\nDatos del Director: " + director;
    }
}
