package modelo;

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

/**
 * Clase PasoC, clase que crea un paso
 * @author MW3 Software
 */

// <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
// #[regen=yes,id=DCE.7FDF4208-649D-738E-9BFF-7D4A34B4DC60]
// </editor-fold>
@Entity
@Table(name="PASOSCU")
public class PasoCU extends Observable implements Serializable {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="PASOid")
    private long id;

    /**
     * Numero del Paso
     */
    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.D7B1A86C-47B0-A2EA-506D-1245C447069F]
    // </editor-fold> 
    private int numeroPaso;

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.B5C5B85D-3441-DC9F-9805-81863D6C8CDA]
    // </editor-fold> 
    /**
     * descripcion del paso
     */
    private String descripcionPas;

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.B5D3B3E4-9106-D340-9620-50D5B1378494]
    // </editor-fold> 
    /**
     * Lista de excepcion que tiene un paso
     */
    @OneToMany(mappedBy = "pasoCU")
    private List<ExcepcionCU> mExcepcionCU= new ArrayList();
    /**
     * Caso de Uso al que pertenece el paso
     */
    @ManyToOne
    private CasodeUso casodeUso;


    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.F35BC728-068F-B7C4-C95E-03AE93C5D7A5]
    // </editor-fold> 
    public PasoCU () {
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.EA66F6C4-EE9F-6116-8BCF-CCC935A8AB9E]
    // </editor-fold> 
    /**
     * Metodo que devuelve la lista de excepciones
     * @return devuelve la Lista de excepcion del paso
     */
    public List<ExcepcionCU> getExcepcionCU () {
        return mExcepcionCU;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.C2E9169B-2292-E65A-89D2-1B2A6E02BBC9]
    // </editor-fold> 

    /**
     * Metodo que almacena la lista de excepciones
     * @param val Nuevo valor de la lista de exepciones del paso
     */
    public void setExcepcionCU (List<ExcepcionCU> val) {
         this.mExcepcionCU=val;
         //Notificamos que ha habido un cambio
         this.setChanged();
         this.notifyObservers();
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.5322A9D0-0B1E-3690-CEF2-DC42B035DF61]
    // </editor-fold> 
    /**
     * Metodo que devuelve la descripcion
     * @return devuelve la descripcion del paso
     */
    public String getDescripcionPas () {
        return descripcionPas;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.822114DA-FF74-1A4D-831C-BA345E58A464]
    // </editor-fold> 
    /**
     * Metodo que almacena la descripcion
     * @param val Nuevo valor de descripcion del paso
     */
    public void setDescripcionPas (String val) {
        this.descripcionPas = val;
        //Notificamos que ha habido un cambio
         this.setChanged();
         this.notifyObservers();
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.E315E858-F072-74BC-E406-C7E5E3EC0B5A]
    // </editor-fold> 
    /**
     * Metodo que devuelve el numero del paso
     * @return devuelve el numero del paso
     */
    public int getNumeroPaso () {
        return numeroPaso;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.6204143C-87C3-710D-1C9B-D35BDA9358E9]
    // </editor-fold> 
    /**
     * Metodo que almacena la numero del paso
     * @param val Nuevo valor de NumeroPaso del paso
     */
    public void setNumeroPaso (int val) {
        this.numeroPaso = val;
        //Notificamos que ha habido un cambio
         this.setChanged();
         this.notifyObservers();
    }

    /**
     * metodo que crea una excepcion
     * @param numeroExcep Numero de la excepcion
     * @param paso Paso al que pertenece la Excepcion
     * @param DescExcep Descripcion de la Excepcion
     * @return la excepcion creada
     */
    public ExcepcionCU nuevaExcepcion(int numeroExcep,int paso, String DescExcep) {

        ExcepcionCU auxExcepcion=new ExcepcionCU();
        //// Asigno los valores a los atributos
        auxExcepcion.setNumeroExcep(numeroExcep);
        auxExcepcion.setDescripcionExcep(DescExcep);
        auxExcepcion.setPasoCU(this);
        auxExcepcion.setPaso(paso);
        this.getExcepcionCU().add(auxExcepcion);//Error!!!!

         guardar(auxExcepcion);
        //Notificamos que ha habido un cambio
         this.setChanged();
         this.notifyObservers();
        return auxExcepcion;
    }

    /**
     * Metodo que devuelve el caso de Uso al que pertenece el paso
     * @return devuelve el caso de uso a que pertenece el paso
     */
    public CasodeUso getCasodeUso() {
        return casodeUso;
    }

    /**
     * Metodo que almacena el caso de uso al que pertenece
     * @param casodeUso Nuevo valor del Caso de Uso al que pertenece el paso
     */
    public void setCasodeUso(CasodeUso casodeUso) {
        this.casodeUso = casodeUso;
    }

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

    @Override
    public String toString() {
        return super.toString();
    }

    @Override
    public int hashCode() {
        int hash = 5;
        hash = 89 * hash + (int) (this.id ^ (this.id >>> 32));
        return hash;
    }

    /**
     *  alamcena un objeto en la Base de Datos
     * @param el Objeto a almacenar en la BD
     */
    public void guardar(Object object) {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("ProyectoISG2PU");
        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();
        }
    }

}

