package modelo;

import java.util.ArrayList; 
import java.util.Observable;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.DOMImplementation;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Text;

// <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
// #[regen=yes,id=DCE.6152FD4C-6D23-B415-B6AA-5E3083D32571]
// </editor-fold> 
public class DocumentoReq extends Observable{

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.B5397BD3-C4F1-EAF8-6B24-D8DD6FA987FC]
    // </editor-fold> 
    private ArrayList<CasodeUso> mCasodeUso=new ArrayList();
    private ArrayList<Requisito> mRequisito=new ArrayList();
    private ArrayList<Reunion> mReunion=new ArrayList();
    private ArrayList<Organizacion> mOrganizacion=new ArrayList();
    private ArrayList<Objetivo> mObjetivo=new ArrayList();


    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.1D51ABF1-2DD9-82E3-126D-173DEB5FADBA]
    // </editor-fold> 
    public DocumentoReq () {
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.A9A64C79-62B1-D6C4-FB8A-BCD4EF81E5C4]
    // </editor-fold> 
    public ArrayList<CasodeUso> getmCasodeUso () {
        return mCasodeUso;
    }


    public ArrayList<Reunion> getmReunion () {
        return mReunion;
    }

    public Objetivo newObj( String Nombre, String Concepto, String Importancia, String Urgencia, String EstadoDesarrollo, String Estabilidad ) {
        Objetivo auxObj = new Objetivo();

        auxObj.setNombre(Nombre);
        auxObj.setDescripcion(Concepto);
        auxObj.setImportancia(Importancia);
        auxObj.setUrgencia(Urgencia);
        auxObj.setEstado_desarrollo(EstadoDesarrollo);
        auxObj.setEstabilidad(Estabilidad);

        this.getmObjetivo().add(auxObj);
        return auxObj;
    }

    public Organizacion newOrg(String NombreOrg, String Direccion, String Telefono, String Fax, String Participante) {
        ////Creo la instancia
        Organizacion auxOrg=new Organizacion();
        //// Asigno los valores a los atributos
        auxOrg.setNombre(NombreOrg);
        auxOrg.setDireccion(Direccion);
        auxOrg.setTelefono(Telefono);
        auxOrg.setFax(Fax);
        //auxOrg.setParticipantes(Participantes);
        //// Enlazo el CasodeUso a la lista de CU que tiene el documento
        this.getmOrganizacion().add(auxOrg);
        return auxOrg;
    }

    public Reunion newReunion(String Nombre, String Lugar, String Fecha, String Hora, String Asistentes, String Resultados) {

        ////Creo la instancia
        Reunion auxReu=new Reunion();
        //// Asigno los valores a los atributos
        auxReu.setNombre(Nombre);
        auxReu.setLugar(Lugar);
        auxReu.setFecha(Fecha);
        auxReu.setHora(Hora);
        auxReu.setPartcipantes_asistentes(Asistentes);
        auxReu.setResultados(Resultados);
        //// Enlazo el CasodeUso a la lista de CU que tiene el documento
        this.getmReunion().add(auxReu);
        return auxReu;
    }
    
    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.53D39B7F-03CC-D44E-1C6A-CB6F6C02538E]
    // </editor-fold> 
    public void setmCasodeUso (ArrayList<CasodeUso> val) {
        this.mCasodeUso = val;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.3DF3139E-17FC-1508-86A3-908C60405553]
    // </editor-fold> 
    public CasodeUso nuevoCU (String nombreCU, boolean esAbstracto,String eventoActivacion, int frecuencia, String unidadFrecuencia, String precondicion, String postcondicion, String importancia, String urgencia, String estadodesarrollo, String estabilidad) {

        //// Creo la instancia
        CasodeUso auxCU=new CasodeUso();
        //// Asigno los valores a los atributos
        auxCU.setNombre(nombreCU);
        auxCU.setEsAbstracto(esAbstracto);
        auxCU.setEventoActivacion(eventoActivacion);
        auxCU.setFrecuencia(frecuencia);
        auxCU.setUnidadFrecuencia(unidadFrecuencia);
        auxCU.setPrecondicion(precondicion);
        auxCU.setPostcondicion(postcondicion);
        auxCU.setImportancia(importancia);
        auxCU.setUrgencia(urgencia);
        auxCU.setEstadodeDesarrollo(estadodesarrollo);
        auxCU.setEstabilidad(estabilidad);
        
        //// Enlazo el CasodeUso a la lista de CU que tiene el documento
        this.getmCasodeUso().add(auxCU);
        return auxCU;
    }
    
    public void actualizar() {
        setChanged();
        notifyObservers();
    }

    public ReqRestriccion newRRes(String nombreRRes, String descripcionRRes, String importancia, String urgencia, String estadodesarrollo, String estabilidad) {
        ReqRestriccion auxRRes = new ReqRestriccion();
        
        auxRRes.setNombre(nombreRRes);
        auxRRes.setDescripcion(descripcionRRes);
        auxRRes.setImportancia(importancia);
        auxRRes.setUrgencia(urgencia);
        auxRRes.setEstado_desarrollo(estadodesarrollo);
        auxRRes.setEstabilidad(estabilidad);
        
        this.getmRequisito().add(auxRRes);
        return auxRRes;
    }

    /**
     * @return the mRequisito
     */
    public ArrayList<Requisito> getmRequisito() {
        return mRequisito;
    }

    /**
     * @param mRequisito the mRequisito to set
     */
    public void setmRequisito(ArrayList<Requisito> mRequisito) {
        this.mRequisito = mRequisito;
    }

    public ReqInformacion newRInf(String nombre, String concepto, int vmax, int vmedio, String importancia, String urgencia, String estadodesarrollo, String estabilidad, String unimax, String unimedio) {
        ReqInformacion auxRInf = new ReqInformacion();
        
        auxRInf.setNombre(nombre);
        auxRInf.setConcepto(concepto);
        auxRInf.setValor_maximo(vmax);
        auxRInf.setValor_medio(vmedio);
        auxRInf.setImportancia(importancia);
        auxRInf.setUrgencia(urgencia);
        auxRInf.setEstado_desarrollo(estadodesarrollo);
        auxRInf.setEstabilidad(estabilidad);
        auxRInf.setUnidad_maximo(unimax);
        auxRInf.setValor_medio(vmedio);
        
        this.getmRequisito().add(auxRInf);
        return auxRInf;
    }

    public ReqFuncional newRFun(String nombre, String descripcion, String importancia, String urgencia, String estadodesarrollo, String estabilidad) {
        ReqFuncional auxRFun = new ReqFuncional();
        
        auxRFun.setNombre(nombre);
        auxRFun.setDescripcion(descripcion);
        auxRFun.setImportancia(importancia);
        auxRFun.setUrgencia(urgencia);
        auxRFun.setEstado_desarrollo(estadodesarrollo);
        auxRFun.setEstabilidad(estabilidad);
        
        this.getmRequisito().add(auxRFun);
        return auxRFun;
    }
    

    public ReqNoFuncional newRNoFun(String nombre, String descripcion, String importancia, String urgencia, String estadodesarrollo, String estabilidad) {
        ReqNoFuncional auxRNoFun = new ReqNoFuncional();
        
        auxRNoFun.setNombre(nombre);
        auxRNoFun.setDescripcion(descripcion);
        auxRNoFun.setImportancia(importancia);
        auxRNoFun.setUrgencia(urgencia);
        auxRNoFun.setEstado_desarrollo(estadodesarrollo);
        auxRNoFun.setEstabilidad(estabilidad);
        
        this.getmRequisito().add(auxRNoFun);
        return auxRNoFun;
    }
    
    public void CasodeUsotoXML(CasodeUso cu, Result result, Document document, Element raiz){
        try {
        Element elementoA = document.createElement("CasodeUso"); //creamos un nuevo elemento
        Element elemento1= document.createElement("nombre"); //creamos un nuevo elemento
        Text text1 = document.createTextNode(cu.getNombre()); //Ingresamos la info
        Element elemento2= document.createElement("esAbstracto"); //creamos un nuevo elemento
        Text text2 = document.createTextNode("NO"); //Ingresamos la info
        Element elemento3= document.createElement("eventoActivacion"); //creamos un nuevo elemento
        Text text3 = document.createTextNode(cu.getEventoActivacion()); //Ingresamos la info
        Element elemento4= document.createElement("frecuencia"); //creamos un nuevo elemento
        Text text4 = document.createTextNode(String.valueOf(cu.getFrecuencia())); //Ingresamos la info
        Element elemento5= document.createElement("unidadFrecuencia"); //creamos un nuevo elemento
        Text text5 = document.createTextNode(cu.getUnidadFrecuencia()); //Ingresamos la info
        Element elemento6= document.createElement("precondicion"); //creamos un nuevo elemento
        Text text6 = document.createTextNode(cu.getPrecondicion()); //Ingresamos la info
        Element elemento7= document.createElement("postcondicion"); //creamos un nuevo elemento
        Text text7 = document.createTextNode(cu.getPostcondicion()); //Ingresamos la info
        elemento1.appendChild(text1);
        elemento2.appendChild(text2);
        elemento3.appendChild(text3);
        elemento4.appendChild(text4);
        elemento5.appendChild(text5);
        elemento6.appendChild(text6);
        elemento7.appendChild(text7);
        elementoA.appendChild(elemento1);
        elementoA.appendChild(elemento2);
        elementoA.appendChild(elemento3);
        elementoA.appendChild(elemento4);
        elementoA.appendChild(elemento5);
        elementoA.appendChild(elemento6);
        elementoA.appendChild(elemento7);
        raiz.appendChild(elementoA);
        Source source = new DOMSource(document);
        Result console= new StreamResult(System.out);
        Transformer transformer = TransformerFactory.newInstance().newTransformer();
        transformer.transform(source, result);
        transformer.transform(source, console);
        }catch(Exception e){
        System.err.println("Error: "+e);
        }
    }
    
    public void ReuniontoXML(Reunion reu){
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        try{
        DocumentBuilder builder = factory.newDocumentBuilder();
        DOMImplementation implementation = builder.getDOMImplementation();
        Document document = implementation.createDocument(null, "xml", null);
        
        Element raiz = document.createElement("Documento"); // creamos el elemento raiz
        document.setXmlVersion("1.0"); // asignamos la version de nuestro XML
        
        document.getDocumentElement().appendChild(raiz); //pegamos la raiz al documento
        Element elementoA = document.createElement("Reunion"); //creamos un nuevo elemento
        Element elemento1= document.createElement("nombre"); //creamos un nuevo elemento
        Text text1 = document.createTextNode(reu.getNombre()); //Ingresamos la info
        Element elemento2= document.createElement("lugar"); //creamos un nuevo elemento
        Text text2 = document.createTextNode(reu.getLugar()); //Ingresamos la info
        Element elemento3= document.createElement("fecha"); //creamos un nuevo elemento
        Text text3 = document.createTextNode(reu.getFecha()); //Ingresamos la info
        Element elemento4= document.createElement("hora"); //creamos un nuevo elemento
        Text text4 = document.createTextNode(reu.getHora()); //Ingresamos la info
        Element elemento5= document.createElement("participantes"); //creamos un nuevo elemento
        Text text5 = document.createTextNode(reu.getPartcipantes_asistentes()); //Ingresamos la info
        Element elemento6= document.createElement("resultados"); //creamos un nuevo elemento
        Text text6 = document.createTextNode(reu.getResultados()); //Ingresamos la info
        elemento1.appendChild(text1);
        elemento2.appendChild(text2);
        elemento3.appendChild(text3);
        elemento4.appendChild(text4);
        elemento5.appendChild(text5);
        elemento6.appendChild(text6);
        elementoA.appendChild(elemento1);
        elementoA.appendChild(elemento2);
        elementoA.appendChild(elemento3);
        elementoA.appendChild(elemento4);
        elementoA.appendChild(elemento5);
        elementoA.appendChild(elemento6);
        raiz.appendChild(elementoA); 
        Source source = new DOMSource(document);
        Result result = new StreamResult(new java.io.File("resultado.xml")); //nombre del archivo
        Result console= new StreamResult(System.out);
        Transformer transformer = TransformerFactory.newInstance().newTransformer();
        transformer.transform(source, result);
        transformer.transform(source, console);
        }catch(Exception e){
        System.err.println("Error: "+e);
        }
    }
    
    public void OrganizaciontoXML(Organizacion org){
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        try{
        DocumentBuilder builder = factory.newDocumentBuilder();
        DOMImplementation implementation = builder.getDOMImplementation();
        Document document = implementation.createDocument(null, "xml", null);
        
        Element raiz = document.createElement("Documento"); // creamos el elemento raiz
        document.setXmlVersion("1.0"); // asignamos la version de nuestro XML
        
        document.getDocumentElement().appendChild(raiz); //pegamos la raiz al documento
        Element elementoA = document.createElement("Organizacion"); //creamos un nuevo elemento
        Element elemento1= document.createElement("nombre"); //creamos un nuevo elemento
        Text text1 = document.createTextNode(org.getNombre()); //Ingresamos la info
        Element elemento2= document.createElement("direccion"); //creamos un nuevo elemento
        Text text2 = document.createTextNode(org.getDireccion()); //Ingresamos la info
        Element elemento3= document.createElement("telefono"); //creamos un nuevo elemento
        Text text3 = document.createTextNode(org.getTelefono()); //Ingresamos la info
        Element elemento4= document.createElement("fax"); //creamos un nuevo elemento
        Text text4 = document.createTextNode(org.getFax()); //Ingresamos la info
        elemento1.appendChild(text1);
        elemento2.appendChild(text2);
        elemento3.appendChild(text3);
        elemento4.appendChild(text4);
        elementoA.appendChild(elemento1);
        elementoA.appendChild(elemento2);
        elementoA.appendChild(elemento3);
        elementoA.appendChild(elemento4);
        raiz.appendChild(elementoA); 
        Source source = new DOMSource(document);
        Result result = new StreamResult(new java.io.File("resultado.xml")); //nombre del archivo
        Result console= new StreamResult(System.out);
        Transformer transformer = TransformerFactory.newInstance().newTransformer();
        transformer.transform(source, result);
        transformer.transform(source, console);
        }catch(Exception e){
        System.err.println("Error: "+e);
        }
    }
    
    public void PasotoXML(PasoCU pas, Result result, Document document, Element raiz){
        try {
        Element elementoA = document.createElement("PasoCU"); //creamos un nuevo elemento
        Element elemento1= document.createElement("accion"); //creamos un nuevo elemento
        Text text1 = document.createTextNode(pas.getAccion()); //Ingresamos la info
        Element elemento2= document.createElement("condicion"); //creamos un nuevo elemento
        Text text2 = document.createTextNode(pas.getCondicion()); //Ingresamos la info
        elemento1.appendChild(text1);
        elemento2.appendChild(text2);
        elementoA.appendChild(elemento1);
        elementoA.appendChild(elemento2);
        raiz.appendChild(elementoA);
        Source source = new DOMSource(document);
        Result console= new StreamResult(System.out);
        Transformer transformer = TransformerFactory.newInstance().newTransformer();
        transformer.transform(source, result);
        transformer.transform(source, console);
        }catch(Exception e){
        System.err.println("Error: "+e);
        }
    }
    
    public void ParticipantetoXML(Participante par){
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        try{
        DocumentBuilder builder = factory.newDocumentBuilder();
        DOMImplementation implementation = builder.getDOMImplementation();
        Document document = implementation.createDocument(null, "xml", null);
        
        Element raiz = document.createElement("Documento"); // creamos el elemento raiz
        document.setXmlVersion("1.0"); // asignamos la version de nuestro XML
        
        document.getDocumentElement().appendChild(raiz); //pegamos la raiz al documento
        Element elementoA = document.createElement("Participante"); //creamos un nuevo elemento
        Element elemento1= document.createElement("nombre"); //creamos un nuevo elemento
        Text text1 = document.createTextNode(""); //Ingresamos la info
        Element elemento2= document.createElement("rol"); //creamos un nuevo elemento
        Text text2 = document.createTextNode(""); //Ingresamos la info

        elemento1.appendChild(text1);
        elemento2.appendChild(text2);

        elementoA.appendChild(elemento1);
        elementoA.appendChild(elemento2);

        raiz.appendChild(elementoA); 
        Source source = new DOMSource(document);
        Result result = new StreamResult(new java.io.File("resultado.xml")); //nombre del archivo
        Result console= new StreamResult(System.out);
        Transformer transformer = TransformerFactory.newInstance().newTransformer();
        transformer.transform(source, result);
        transformer.transform(source, console);
        }catch(Exception e){
        System.err.println("Error: "+e);
        }
    }
    
    public void ObjetivotoXML(Objetivo obj){
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        try{
        DocumentBuilder builder = factory.newDocumentBuilder();
        DOMImplementation implementation = builder.getDOMImplementation();
        Document document = implementation.createDocument(null, "xml", null);
        
        Element raiz = document.createElement("Documento"); // creamos el elemento raiz
        document.setXmlVersion("1.0"); // asignamos la version de nuestro XML
        
        document.getDocumentElement().appendChild(raiz); //pegamos la raiz al documento
        Element elementoA = document.createElement("Objetivo"); //creamos un nuevo elemento
        Element elemento1= document.createElement("nombre"); //creamos un nuevo elemento
        Text text1 = document.createTextNode(obj.getNombre()); //Ingresamos la info
        Element elemento2= document.createElement("descripcion"); //creamos un nuevo elemento
        Text text2 = document.createTextNode(obj.getDescripcion()); //Ingresamos la info
        Element elemento3= document.createElement("prioridad"); //creamos un nuevo elemento
        Text text3 = document.createTextNode(""); //Ingresamos la info
        Element elemento4= document.createElement("importancia"); //creamos un nuevo elemento
        Text text4 = document.createTextNode(""); //Ingresamos la info
        Element elemento5= document.createElement("urgencia"); //creamos un nuevo elemento
        Text text5 = document.createTextNode(""); //Ingresamos la info
        Element elemento6= document.createElement("estado_desarrollo"); //creamos un nuevo elemento
        Text text6 = document.createTextNode(""); //Ingresamos la info
        Element elemento7= document.createElement("estabilidad"); //creamos un nuevo elemento
        Text text7 = document.createTextNode(""); //Ingresamos la info
        elemento1.appendChild(text1);
        elemento2.appendChild(text2);
        elemento3.appendChild(text3);
        elemento4.appendChild(text4);
        elemento5.appendChild(text5);
        elemento6.appendChild(text6);
        elemento7.appendChild(text7);
        elementoA.appendChild(elemento1);
        elementoA.appendChild(elemento2);
        elementoA.appendChild(elemento3);
        elementoA.appendChild(elemento4);
        elementoA.appendChild(elemento5);
        elementoA.appendChild(elemento6);
        elementoA.appendChild(elemento7);
        raiz.appendChild(elementoA); 
        Source source = new DOMSource(document);
        Result result = new StreamResult(new java.io.File("resultado.xml")); //nombre del archivo
        Result console= new StreamResult(System.out);
        Transformer transformer = TransformerFactory.newInstance().newTransformer();
        transformer.transform(source, result);
        transformer.transform(source, console);
        }catch(Exception e){
        System.err.println("Error: "+e);
        }
    }
    
    public CasodeUso BuscarCU (String ident) {
      int id = Integer.parseInt(ident);  
      boolean encontrado=false;
      int i=0;
      CasodeUso cu = null;
      while((!encontrado)&&(i<mCasodeUso.size())) {
          if(mCasodeUso.get(i).getNumero_id()==id) {
               encontrado=true;
               cu=mCasodeUso.get(i);
          } 
          i++;
         }
      return cu;
    }
    
    public Reunion BuscarREU (String ident) {
      int id = Integer.parseInt(ident);  
      boolean encontrado=false;
      int i=0;
      Reunion reu = null;
      while((!encontrado)&&(i<mReunion.size())) {
          if(mReunion.get(i).getNumero_id()==id) {
               encontrado=true;
               reu=mReunion.get(i);
          } 
          i++;
         }
      return reu;
    }
    
    public Organizacion BuscarORG (String ident) {
      int id = Integer.parseInt(ident);  
      boolean encontrado=false;
      int i=0;
      Organizacion org = null;
      while((!encontrado)&&(i<mOrganizacion.size())) {
          if(mOrganizacion.get(i).getNumero_id()==id) {
               encontrado=true;
               org=mOrganizacion.get(i);
          } 
          i++;
         }
      return org;
    }

    public PasoCU BuscarPAS (String ident) {
      int id = Integer.parseInt(ident);
      boolean encontrado=false;
      int i=0;
      int j=0;
      PasoCU pas = null;
      while((!encontrado)&&(i<mCasodeUso.size())) {
          while((!encontrado)&&(i<mCasodeUso.get(i).getPasoCU().size())) {
              if(mCasodeUso.get(i).getPasoCU().get(j).getNumero_id()==id) {
                   encontrado=true;
                   pas=mCasodeUso.get(i).getPasoCU().get(j);
              }
              j++;
          }
          i++;
      }
      return pas;
    }
    
    public Participante BuscarPAR (String ident) {
      int id = Integer.parseInt(ident);
      boolean encontrado=false;
      int i=0;
      int j=0;
      Participante par = null;
      while((!encontrado)&&(i<mOrganizacion.size())) {
          while((!encontrado)&&(i<mOrganizacion.get(i).getParticipantes().size())) {
              if(mOrganizacion.get(i).getParticipantes().get(j).getNumero_id()==id) {
                   encontrado=true;
                   par=mOrganizacion.get(i).getParticipantes().get(j);
              }
              j++;
          }
          i++;
      }
      return par;
    }
    
    public Objetivo BuscarOBJ (String ident) {
      int id = Integer.parseInt(ident);  
      boolean encontrado=false;
      int i=0;
      Objetivo obj = null;
      while((!encontrado)&&(i<mObjetivo.size())) {
          if(mObjetivo.get(i).getNumero_id()==id) {
               encontrado=true;
               obj=mObjetivo.get(i);
          } 
          i++;
         }
      return obj;
    }

    /**
     * @param mReunion the mReunion to set
     */
    public void setmReunion(ArrayList<Reunion> mReunion) {
        this.mReunion = mReunion;
    }

    /**
     * @return the mOrganizacion
     */
    public ArrayList<Organizacion> getmOrganizacion() {
        return mOrganizacion;
    }

    /**
     * @param mOrganizacion the mOrganizacion to set
     */
    public void setmOrganizacion(ArrayList<Organizacion> mOrganizacion) {
        this.mOrganizacion = mOrganizacion;
    }

    /**
     * @return the mObjetivo
     */
    public ArrayList<Objetivo> getmObjetivo() {
        return mObjetivo;
    }

    /**
     * @param mObjetivo the mObjetivo to set
     */
    public void setMObjetivo(ArrayList<Objetivo> mObjetivo) {
        this.mObjetivo = mObjetivo;
    }

}

