package modelo;

import java.io.Serializable;
import java.util.ArrayList; 
import java.util.List;
import javax.persistence.*;

@Entity
@Table(name="PAS")
/**
 * Claseque guarda los pasos a seguir en los casos de uso
 */
public class PasoCU implements Serializable{
    @Id
    @Column(name="ID")
    @GeneratedValue(strategy=GenerationType.AUTO)
    /**
     * Clave primaria para la Base de datos.
     */
    private Long id;
    /**
     * Identificador único
     */
    private int numero_id;
    /**
     * Guarda si el paso es o no condicional
     */
    private boolean esCondicional;
    /**
     * Guarda si tiene la condición del paso
     */
    private String condicion;
    /**
     * Guarda si la accion es o no del sistema
     */
    private boolean accion_sistema;
    /**
     * Guarda si la accion es o no del actor
     */
    private boolean accion_actor;
    /**
     * Guarda la acción que realiza el paso
     */
    private String accion;
    /**
     * Guarda en caso de que sea el actor, cual es el que desarrolla el paso
     */
    private String actor;
    /**
     * Este parámetro estático, lleva la cuenta del número de paso
     * que se han creado, para poder reconocerlos unívocamente.
     */
    
    static int n_instancia=0;
    @ManyToOne
    /**
     * Objeto que contiene este paso. 
     */
    private CasodeUso mCasodeUso;
    @OneToMany(mappedBy = "mPasoCU")
    /**
     * Listado de excepciones de cada paso.
     */
    private List<ExcepcionCU> mExcepcionCU=new ArrayList();

    /**
     * Constructor que guarda e inicializa el identificador
     */
    public PasoCU () {
        n_instancia++;
        numero_id=n_instancia;
    }
    /**
     * 
     * @return ExcepcionCU
     */


    public List<ExcepcionCU> getExcepcionCU () {
        return mExcepcionCU;
    }

    /**
     * 
     * @param val 
     */
    public void setExcepcionCU (ArrayList<ExcepcionCU> val) {
        this.mExcepcionCU = val;
    }

    /**
     * @return the esCondicional
     */
    public boolean isEsCondicional() {
        return esCondicional;
    }

    /**
     * @param esCondicional the esCondicional to set
     */
    public void setEsCondicional(boolean esCondicional) {
        this.esCondicional = esCondicional;
    }

    /**
     * @return the condicion
     */
    public String getCondicion() {
        return condicion;
    }

    /**
     * @param condicion the condicion to set
     */
    public void setCondicion(String condicion) {
        this.condicion = condicion;
    }

    /**
     * @return the accion_sistema
     */
    public boolean isAccion_sistema() {
        return accion_sistema;
    }

    /**
     * @param accion_sistema the accion_sistema to set
     */
    public void setAccion_sistema(boolean accion_sistema) {
        this.accion_sistema = accion_sistema;
    }

    /**
     * @return the accion_actor
     */
    public boolean isAccion_actor() {
        return accion_actor;
    }

    /**
     * @param accion_actor the accion_actor to set
     */
    public void setAccion_actor(boolean accion_actor) {
        this.accion_actor = accion_actor;
    }

    /**
     * @return the accion
     */
    public String getAccion() {
        return accion;
    }

    /**
     * @param accion the accion to set
     */
    public void setAccion(String accion) {
        this.accion = accion;
    }
    
    /**
     * Método que crea y guarda una excepcion en su paso correcpondiente
     * @param aux_accion
     * @param aux_condicion
     * @param aux_sistema
     * @param aux_actor
     * @param terminacion
     * @param actor
     * @return Excepcion
     */
    public ExcepcionCU nuevoExcepcion (String aux_accion, String aux_condicion, boolean aux_sistema, boolean aux_actor, String terminacion, String actor) {
        //// Creo la instancia
        ExcepcionCU auxExcepcion=new ExcepcionCU();
        //// Asigno los valores a los atributos
        auxExcepcion.setAccion(aux_accion);
        auxExcepcion.setCondicion(aux_condicion);
        auxExcepcion.setTerminacion(terminacion);
        auxExcepcion.setAccion_sistema(aux_sistema);
        auxExcepcion.setAccion_actor(aux_actor);
        auxExcepcion.setActor(actor);
        auxExcepcion.setmPasoCU(this);
        //// Enlazo el CasodeUso a la lista de CU que tiene el documento
        this.getExcepcionCU().add(auxExcepcion);
        persist(auxExcepcion);
        return auxExcepcion;
    }

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

    /**
     * @return the actor
     */
    public String getActor() {
        return actor;
    }

    /**
     * @param actor the actor to set
     */
    public void setActor(String actor) {
        this.actor = actor;
    }

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

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

    @Override
    public String toString() {
        return "PasoCU{" + "numero_id=" + numero_id + '}';
    }

    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();
        }
    }

    /**
     * @return the mCasodeUso
     */
    public CasodeUso getmCasodeUso() {
        return mCasodeUso;
    }

    /**
     * @param mCasodeUso the mCasodeUso to set
     */
    public void setmCasodeUso(CasodeUso mCasodeUso) {
        this.mCasodeUso = mCasodeUso;
    }

    

    

    

}

