package modelo;

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

/**
 * Clase Caso de Uso, crea un caso de Uso
 * @author MW3 Software
 */
// <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
// #[regen=yes,id=DCE.D9002932-E6B4-19C4-A7CA-6F8912E92A60]
// </editor-fold>
//Presistencia
@Entity
@Table(name="CASOUSO")
public class CasodeUso extends Observable implements Serializable
{
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="CUid")
    private long id;
    /**
     * Nombre del CU
     */
    private String nombre;
    /**
     * Identifica si es Abstracto
     */
    private boolean esAbstracto;
    /**
     * Condicion necesaria para que se active el CU
     */
    private String eventoActivacion;
    /**
     * Frecuencia con que se ejecuta el CU
     */
    private int frecuencia;
    /**
     * Unidad en la que viene expresada la frecuencia
     */
    private String unidadFrecuencia;
    /**
     * Como estaba antes de ejecutarse el CU
     */
    private String precondicion;
    /**
     * Como queda el sistema despues de ejecutarse el CU
     */
    private String postcondicion;
    /**
     * Importancia del CU
     */
    private String importancia;
    /**
     * Urgencia del CU
     */
    private String urgencia;
    /**
     * Estado del CU
     */
    private String estadodeDesarrollo;
    /**
     * Estabilidad del CU
     */
    private String estabilidad;
    /**
     * Lista que almacena los Pasos que compone el CU
     */
    @OneToMany(mappedBy = "casodeUso")
    private List<PasoCU> mPasoCU = new ArrayList();
    /**
     * Lista que almace la rastreabilidad del CU
     */
    @Transient
    private ArrayList<String> destinoRastreable = new ArrayList();


    public CasodeUso () {
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.9CED973A-587A-95B7-D34C-68DF4FD9CE45]
    // </editor-fold>
    /**
     * metodo que devuelve un boolean
     * @return devuelve si es Abstracto
     */
    public boolean getEsAbstracto () {
        return esAbstracto;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.E79E33BA-A908-B7A1-B5DF-8E475CD9C0C7]
    // </editor-fold>
    /**
     * metodo que almacena si es Boolean
     * @param val TRUE si es Abstracto y FALSE si no lo es
     */
    public void setEsAbstracto (boolean val) {
        this.esAbstracto=val;
        //Notificamos que ha habido un cambio
        this.setChanged();
        this.notifyObservers();
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.F1EDE286-B05F-B72E-AAC4-0C3D790FF06F]
    // </editor-fold>
    /**
     * Metodo que devuelve la Estabilidad
     * @return devuelve la estabilidad del CU
     */
    public String getEstabilidad () {
        return estabilidad;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.52133F2B-9971-388F-28F7-7D408EA71AFF]
    // </editor-fold>
    /**
     * Metodo que almacena la estabilidad
     * @param val Nuevo valor de estabilidad del CU
     */
    public void setEstabilidad (String val) {
         this.estabilidad=val;
         //Notificamos que ha habido un cambio
         this.setChanged();
         this.notifyObservers();
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.6E78E0DC-5BE2-F814-5699-26B3D81744D0]
    // </editor-fold>
    /**
     * Metodo que devuelve el estado de Desarrollo
     * @return devuelve el estado de Desarrollo
     */
    public String getEstadodeDesarrollo () {
        return estadodeDesarrollo;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.9D9141A0-C0F5-00A1-E382-6CD9696B69E8]
    // </editor-fold>
    /**
     * Metodo que almacena el estado de desarrollo
     * @param val nuevo valor de Estado de Desarrollo del CU
     */
    public void setEstadodeDesarrollo (String val) {
         this.estadodeDesarrollo=val;
         //Notificamos que ha habido un cambio
         this.setChanged();
         this.notifyObservers();
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.14AA07AA-C61E-092E-943E-C9EDC3CFC971]
    // </editor-fold>
    /**
     * Metodo que devuelve el Evento de activacion
     * @return devuelve el Evento de activacion
     */
    public String getEventoActivacion () {
        return eventoActivacion;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.A3F817E5-8C01-914A-2EDD-404064D3B69E]
    // </editor-fold> 
    /**
     * Metodo que almacena el Evento de Activacion
     * @param val nuevo valor de evento de activacion del CU
     */
    public void setEventoActivacion (String val) {
         this.eventoActivacion=val;
         //Notificamos que ha habido un cambio
         this.setChanged();
         this.notifyObservers();
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.EACD2C12-563E-4373-2BF6-3DA2041B9555]
    // </editor-fold> 
    /**
     * Metodo que devuelve la frecuencia
     * @return devuelve la frecuencia
     */
    public int getFrecuencia () {
        return frecuencia;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.FA9BC7C6-7F31-C2AF-165C-9130740AC9FC]
    // </editor-fold> 
    /**
     * Metodo que almacena la frecuencia
     * @param val nuevo valor de Frecuencia del CU
     */
    public void setFrecuencia (int val) {
         this.frecuencia=val;
         //Notificamos que ha habido un cambio
         this.setChanged();
         this.notifyObservers();
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.7D75FDD1-C08D-86AD-FB96-DDC0F26F7450]
    // </editor-fold> 
    /**
     * Metodo que devuelve la importancia
     * @return devuelve la importancia
     */
    public String getImportancia () {
        return importancia;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.673AAEF8-5700-D4EB-E054-33669E36C6D9]
    // </editor-fold>
    /**
     * Metodo que almacena la importancia
     * @param val nuevo valor de Importancia del CU
     */
    public void setImportancia (String val) {
         this.importancia=val;
         //Notificamos que ha habido un cambio
         this.setChanged();
         this.notifyObservers();
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.9A639630-B530-E890-B25B-FE22CE02F73C]
    // </editor-fold>
    /**
     * Metodo que devuelve la Lista de pasos
     * @return devuelve la Lista de Pasos que pertenecen al CU
     */
    public List<PasoCU> getPasoCU () {
        return mPasoCU;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.911309DC-BC2B-D02A-0207-067A96949766]
    // </editor-fold> 
    /**
     * Metodo que almacena la Lista de pasos
     * @param val nuevo valor de PasoCU del CU
     */
    public void setPasoCU (List<PasoCU> val) {
         this.mPasoCU=val;
         //Notificamos que ha habido un cambio
         this.setChanged();
         this.notifyObservers();
    }

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

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

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

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.7B5456C9-1C26-78C2-3152-DE6CEC53B606]
    // </editor-fold>
    /**
     * Metodo que devuelve el nombre
     * @return devuelve el nombre
     */
    public String getNombre () {
        return nombre;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.A80A5255-5E6C-2790-1268-F597723CCF4C]
    // </editor-fold> 
    /**
     * Metodo que almacena el nombre
     * @param val nuevo valor de Nombre del CU
     */
    public void setNombre (String val) {
         this.nombre=val;
         //Notificamos que ha habido un cambio
         this.setChanged();
         this.notifyObservers();
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.3270D35A-C6DF-41A9-5899-443AE32F0BA5]
    // </editor-fold> 
    /**
     * Metodo que devuelve la Postcondicion
     * @return devuelve la Postcondicion
     */
    public String getPostcondicion () {
        return postcondicion;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.6240D65A-1800-82D4-C30C-D31F08F21042]
    // </editor-fold> 
    /**
     * Metodo que almacena la Postcondicion
     * @param val nuevo valor de Postcondicion del CU
     */
    public void setPostcondicion (String val) {
         this.postcondicion=val;
         //Notificamos que ha habido un cambio
         this.setChanged();
         this.notifyObservers();
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.94EE016E-C9DE-37C8-68C7-42BAB5882A75]
    // </editor-fold> 
    /**
     * Metodo que devuelve la Precondicion
     * @return devuelve la Precondicion
     */
    public String getPrecondicion () {
        return precondicion;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.BDD82028-D967-4CEA-AD8A-257209FAF8EE]
    // </editor-fold> 
    /**
     * Metodo que almacena la Precondicion
     * @param val nuevo valor de Precondicion del CU
     */
    public void setPrecondicion (String val) {
         this.precondicion=val;
         //Notificamos que ha habido un cambio
         this.setChanged();
         this.notifyObservers();
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.B1ED3419-A305-1372-1035-9CA73B2552DE]
    // </editor-fold> 
    /**
     * Metodo que devuelve la Unidad de Frecuencia
     * @return devuelve la Unidad de Frecuencia
     */
    public String getUnidadFrecuencia () {
        return unidadFrecuencia;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.B9B8F18F-AF4A-D67A-5B00-D76D3B986CAD]
    // </editor-fold> 
    /**
     * Metodo que almacena la unidad de frecuencia
     * @param val nuevo valor de Unidad de frecuencia del CU
     */
    public void setUnidadFrecuencia (String val) {
         this.unidadFrecuencia=val;
         //Notificamos que ha habido un cambio
         this.setChanged();
         this.notifyObservers();
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.16DB92DB-BE86-5945-B03E-128DB59F903D]
    // </editor-fold> 
    /**
     * Metodo que devuelve la Urgencia
     * @return devuelve la urgencia
     */
    public String getUrgencia () {
        return urgencia;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.D1E2F321-6138-90D0-3C54-457839D8992F]
    // </editor-fold> 
    /**
     * Metodo que almacena la urgencua
     * @param val nuevo valor de Urgencia del CU
     */
    public void setUrgencia (String val) {
         this.urgencia=val;
         //Notificamos que ha habido un cambio
         this.setChanged();
         this.notifyObservers();
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.9FBC5779-0551-F7C2-612B-4E2E0618BC7C]
    // </editor-fold>
    /**
     * Metodo que crea un Paso de un CU
     * @param numeroPaso Numero del Paso a insertar
     * @param DescPaso Descripcion del Paso a insertar
     * @return el Paso creado
     */
    public PasoCU nuevoPaso (int numeroPaso, String DescPaso) {

        PasoCU auxPaso=new PasoCU();
        //// Asigno los valores a los atributos
        auxPaso.setNumeroPaso(numeroPaso);
        auxPaso.setDescripcionPas(DescPaso);
        auxPaso.setCasodeUso(this);
        this.getPasoCU().add(auxPaso);//Error!!!!

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

    /**
     * Metodo que devuelve una Lista de Elementos Rastreables
     * @return devuelve una lista de elementos rastreables
     */
    public ArrayList<String> getdestinoRastreable() {
        return destinoRastreable;
    }

    /**
     * Metodo que almacena una lista de elementos rastreables
     * @param ElementoRastre nuevo valor de la Lista de elementos rastreables del CU
     */
    public void setDestinoRastreable(ArrayList<String> destinoRastreable) {
        this.destinoRastreable = destinoRastreable;
        //Notificamos que ha habido un cambio
        this.setChanged();
        this.notifyObservers();
    }

    /**
     * Metodo que guarda en la Base de Datos "Persistencia"
     * @param Objeto a Insertar 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();
        }
    }

}

