package modelo;

import java.io.Serializable;
import java.util.ArrayList; 
import java.util.List;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Persistence;
import javax.persistence.Table;
import javax.persistence.Transient;
/**
 * Clase que guarda los casos de uso.
 * 
 */
@Entity
@Table(name="CDU")
public class CasodeUso /*extends Rastreable*/ implements Serializable {
    @Id
    @Column(name="ID")
    @GeneratedValue(strategy=GenerationType.AUTO)
    /**
     * Atributo autogenerado, para ser la clave primera de la tabla CDU en 
     * la base de datos.
     */
    private Long id;
    /**
     * Atributo que contiene el número que identifica al objeto CasodeUso
     */
    private int numero_id;
    /**
     * Atributo que contiene el nombre asignado al caso de uso.
     */
    private String nombre;
    /**
     * Atributo que guarda si el caso de uso puede representarse, o si
     * por el contrario es un caso de uso abstracto
     */
    private boolean esAbstracto;
    /**
     * Atributo que guarda la acción que desencadena la ejecución del caso de uso
     */
    private String eventoActivacion;
    /**
     * Atributo que guarda el número de veces que se realiza el caso de uso.
     */
    private int frecuencia;
    /**
     * Atributo que la unidad de medida de la frecuencia con la que se 
     * realiza el caso de uso.
     */
    private String unidadFrecuencia;
    /**
     * Atributo que almacena la precondición que debe darse para la realizacion
     * del caso de uso
     */
    private String precondicion;
    /**
     * Atributo que almacena la postcondición que se da tras la realizacion
     * del caso de uso
     */
    private String postcondicion;
    /**
     * Atributo que guarda la importancia del caso de uso.
     */
    private String importancia;
    /**
     * Atributo que almacena la urgencia del caso de uso.
     */
    private String urgencia;
    /**
     * Atributo que almacena el estado de desarrollo del caso de uso.
     */
    private String estadodeDesarrollo;
    /**
     * Atributo que almacena la estabilidad del caso de uso.
     */
    private String estabilidad;
     /**
     * Este parámetro estático, lleva la cuenta del número de casos de uso
     * que se han creado, para poder reconocerlos unívocamente.
     */
    static int n_instancia=0;
    @OneToMany(mappedBy = "mCasodeUso")
    /**
     * Lista que guarda los pasos asociados a este caso de uso.
     */
    private List<PasoCU> mPasoCU=new ArrayList();
    
    
    /**
     * Constructor de la clase que inicializala frecuencia y guarda el número de identificación.
     */

    public CasodeUso () {
        frecuencia=0;
        n_instancia++;
        numero_id=n_instancia;
    }

    /**
     * Método que devuelve si el caso de uso es abstracto o no.
     * @return esAbstracto.
     */
    public boolean getEsAbstracto () {
        return esAbstracto;
    }

    /**
     * Método que guarda si el caso de uso es abstracto o no.
     * @param val si es o no abstracto
     */
    public void setEsAbstracto (boolean val) {
        this.esAbstracto = val;
    }

    /**
     * Método que devuelve la estabilidad del caso de uso.
     * @return estabilidad
     */
    public String getEstabilidad () {
        return estabilidad;
    }

    /**
     * Método que guarda la estabilidad
     * @param val, que es la estabilidad
     */
    public void setEstabilidad (String val) {
        this.estabilidad = val;
    }

    /**
     * 
     * @return estado de desarrollo.
     */
    public String getEstadodeDesarrollo () {
        return estadodeDesarrollo;
    }

    /**
     * 
     * @param val estado de desarrollo.
     */
    public void setEstadodeDesarrollo (String val) {
        this.estadodeDesarrollo = val;
    }

    /**
     * 
     * @return evento de activación
     */
    public String getEventoActivacion () {
        return eventoActivacion;
    }

    /**
     * 
     * @param val, evento de activación
     */
    public void setEventoActivacion (String val) {
        this.eventoActivacion = val;
    }

    /**
     * 
     * @return frecuencia 
     */
    public int getFrecuencia () {
        return frecuencia;
    }

    /**
     * 
     * @param val, frecuencia.
     */
    public void setFrecuencia (int val) {
        this.frecuencia = val;
    }

    /**
     * 
     * @return importancia
     */
    public String getImportancia () {
        return importancia;
    }

    /**
     * 
     * @param val, importancia
     */
    public void setImportancia (String val) {
        this.importancia = val;
    }

    /**
     * 
     * @return listado de pasos del caso de uso
     */
    public List<PasoCU> getPasoCU () {
        return mPasoCU;
    }

    /**
     * 
     * @param val, listado de pasos del caso de uso. 
     */
    public void setPasoCU (ArrayList<PasoCU> val) {
        this.mPasoCU = val;
    }

    /**
     * 
     * @return nombre 
     */
    public String getNombre () {
        return nombre;
    }

    /**
     * 
     * @param val, nombre
     */
    public void setNombre (String val) {
        this.nombre = val;
    }

    /**
     * 
     * @return Postcondición
     */
    public String getPostcondicion () {
        return postcondicion;
    }

    /**
     * 
     * @param val, postcondicion
     */
    public void setPostcondicion (String val) {
        this.postcondicion = val;
    }

    /**
     * 
     * @return precondicion
     */
    public String getPrecondicion () {
        return precondicion;
    }

    /**
     * 
     * @param val , precondicion
     */
    public void setPrecondicion (String val) {
        this.precondicion = val;
    }

    /**
     * 
     * @return Unidad de Frecuencia
     */
    public String getUnidadFrecuencia () {
        return unidadFrecuencia;
    }

    /**
     * 
     * @param val, Unidad de frecuencia
     */
    public void setUnidadFrecuencia (String val) {
        this.unidadFrecuencia = val;
    }

    /**
     * 
     * @return Urgencia
     */
    public String getUrgencia () {
        return urgencia;
    }

    /**
     * 
     * @param val, urgencia 
     */
    public void setUrgencia (String val) {
        this.urgencia = val;
    }

/**
 * Método que se encarga de crear un paso y guardarlo en el vector de pasos.
 * @param condicional del paso
 * @param condicion del paso
 * @param a_sistema del paso
 * @param a_actor del paso
 * @param accion del paso
 * @param actor del paso
 * @return PasoCu creado.
 */
    public PasoCU nuevoPaso (boolean condicional, String condicion, boolean a_sistema, boolean a_actor, String accion, String actor) {
            //// Creo la instancia
            PasoCU auxPaso=new PasoCU();
            //// Asigno los valores a los atributos
            auxPaso.setEsCondicional(condicional);
            auxPaso.setCondicion(condicion);
            auxPaso.setAccion_sistema(a_sistema);
            auxPaso.setAccion_actor(a_actor);
            auxPaso.setAccion(accion);
            auxPaso.setActor(actor);
            auxPaso.setmCasodeUso(this);
            //// Enlazo el CasodeUso a la lista de CU que tiene el documento
            this.getPasoCU().add(auxPaso);
            persist(auxPaso);

            return auxPaso;
        }

    /**
     * @return the numero_id
     */
    public int getNumero_id() {
        return numero_id;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final CasodeUso other = (CasodeUso) obj;
        if (this.numero_id != other.numero_id) {
            return false;
        }
        return true;
    }

    @Override
    public int hashCode() {
        int hash = 7;
        hash = 41 * hash + this.numero_id;
        return hash;
    }

    @Override
    public String toString() {
        return "[CDU]-"+numero_id+" "+nombre;
    }

    public void persist(Object object) {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("HGRequisitosPU");
        EntityManager em = emf.createEntityManager();
        em.getTransaction().begin();
        try {
            em.persist(object);
            em.getTransaction().commit();
        } catch (Exception e) {
            e.printStackTrace();
            em.getTransaction().rollback();
        } finally {
            em.close();
        }
    }

    
}