package pdf;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.URL;
import java.sql.Time;
import java.util.Calendar;
import java.util.Date;
import java.util.Vector;

import org.jdom.Document;
import org.jdom.Element;
import org.jdom.output.XMLOutputter;

import analiseacidentestrabalho.Acidentado;
import analiseacidentestrabalho.AnaliseAcidente;
import analiseacidentestrabalho.Causa;
import analiseacidentestrabalho.Estabelecimento;
import analiseacidentestrabalho.Medida;
import analiseacidentestrabalho.Recomendacao;
import analiseacidentestrabalho.Seccao;
import analiseacidentestrabalho.Utilizador;

import com.evolute.utils.fop.FOPCreator;
import com.evolute.utils.fop.PDFCreator;

public class PdfGenerator 
{
	protected final String imagePath;
	protected final Estabelecimento estabelecimento;
	protected final Utilizador tecnicoSuperior;
	protected final Utilizador medico;
	protected final AnaliseAcidente analiseAcidente;
	protected final Acidentado acidentado;
	protected final Seccao seccao;
	protected final Recomendacao recomendacoes[];
	protected final Medida medidas[];
	protected final Causa causa;
	protected final URL urlSiprp;
	protected final URL urlAuchan;
	//protected Vector<URL> imagens = new Vector<URL>();
        protected Vector imagens = new Vector();
	
	public static void main( String args[] )
		throws Exception
	{
		AnaliseAcidente analise = new AnaliseAcidente();
		analise.setAnalise_nr( "12/3" );
		byte[] pdf =
			new PdfGenerator( "/home/fpalma/Desktop", 
				new Estabelecimento(),
				new Utilizador(),
				new Utilizador(),
				analise, 
				new Acidentado(),
				new Seccao(),
				new Recomendacao[ 0 ],
				new Medida[ 0 ],
				new Causa() ).generatePdf();
		File pdfFile = new File( "/home/fpalma/Desktop/siprp.pdf" );
		pdfFile.createNewFile();
		FileOutputStream fos = new FileOutputStream( pdfFile );
		fos.write( pdf );
		fos.close();
		System.out.println( "DONE" );
	}
	
	public PdfGenerator( 
			String imagePath, 
			Estabelecimento estabelecimento,
			Utilizador tecnicoSuperior,
			Utilizador medico,
			AnaliseAcidente analiseAcidente, 
			Acidentado acidentado,
			Seccao seccao,
			Recomendacao recomendacoes[],
			Medida medidas[],
			Causa causa )
	{
		this.imagePath = imagePath;
		this.estabelecimento = estabelecimento;
		this.tecnicoSuperior = tecnicoSuperior;
		this.medico = medico;
		this.analiseAcidente = analiseAcidente;
		this.acidentado = acidentado;
		this.seccao = seccao;
		this.recomendacoes = recomendacoes;
		this.medidas = medidas;
		this.causa = causa;
		this.urlSiprp = getClass().getResource( "siprp_logo.gif" );
		this.urlAuchan = getClass().getResource( "auchan_logo.gif" );
		carregarURLs();
	}
	
	protected void carregarURLs()
	{
		String fullPath = 
			imagePath + "/"  + 
			analiseAcidente.getAnalise_nr().substring(0,2) +
			analiseAcidente.getAnalise_nr().substring(3);
		File dir = null;
		try
		{
			dir = new File( fullPath );

			if( dir == null || !dir.exists() || !dir.isDirectory() )
			{
				
				return;
			}
			File files[] = dir.listFiles();
			for( int f = 0; f < files.length; f++ )
			{
				imagens.add( files[ f ].toURI().toURL() );
			}
		}
		catch( Exception ex )
		{
			return;
		}
	}
	
	public byte[] generatePdf()
		throws Exception
	{
		Document doc = new Document( createXml() );
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		new XMLOutputter().output( doc, baos );
		ByteArrayOutputStream out = new ByteArrayOutputStream();
		InputStream xmlIn = new ByteArrayInputStream( baos.toByteArray() );
		InputStream xslStream = getClass().getClassLoader().getResourceAsStream( "pdf/analise_acidentes_trabalho.xsl" );
		FOPCreator.getFOPCreator().createFOfromXML( xmlIn, xslStream, out );
		return PDFCreator.getPDFCreator().createPdfFromFo( out.toByteArray() );
	}
	
	protected Element createXml()
	{
		Element rootElement = new Element( "AnaliseAcidente" );
		Element logoTipoSIPRPElement = new Element( "LogotipoSIPRP" );
		logoTipoSIPRPElement.setText( urlSiprp.toString() );
		rootElement.addContent( logoTipoSIPRPElement );
		Element logoTipoAuchanElement = new Element( "LogotipoAuchan" );
		logoTipoAuchanElement.setText( urlAuchan.toString() );
		rootElement.addContent( logoTipoAuchanElement );
		Element numeroElement = new Element( "Numero" );
		numeroElement.setText( analiseAcidente.getAnalise_nr() );
		rootElement.addContent( numeroElement );
		Date data = analiseAcidente.getData_acidente(); 
		rootElement.addContent( createDataElement( "Data", data ) );
		rootElement.addContent( createEntidadeEmpregadoraElement() ); 
		rootElement.addContent( createSeguroElement() );
		rootElement.addContent( createEmpresaSHSTElement() );
		rootElement.addContent( createAcidentadoElement() );
		rootElement.addContent( createAcidenteElement() );
		rootElement.addContent( createRecomendacoesSIPRPElement() );
		rootElement.addContent( createMedidasElement() );
		rootElement.addContent( createTomadaConhecimentoElement() );
		return rootElement;
	}
	
	protected Element createEntidadeEmpregadoraElement()
	{
		Element entidadeEmpregadoraElement = new Element( "EntidadeEmpregadora" );
		Element identificacaoElement = new Element( "IdentificacaoCompleta" );
		identificacaoElement.setText( "Companhia Portuguesa de Hipermercados, S.A., com sede na Travessa Teixeira J\u00fanior, 1 - 1300-553 Lisboa" );
		entidadeEmpregadoraElement.addContent( identificacaoElement );
		Element actividadeElement = new Element( "Actividade" );
		actividadeElement.setText( "Com\u00e9rcio a Retalho em Supermercados e Hipermercados" );
		entidadeEmpregadoraElement.addContent( actividadeElement );
		Element lojaElement = new Element( "Loja" );
		lojaElement.setText( estabelecimento.getNome() );
		entidadeEmpregadoraElement.addContent( lojaElement );
		return entidadeEmpregadoraElement;
	}
	
	protected Element createSeguroElement()
	{
		Element seguroElement = new Element( "Seguro" );
		Element empresaElement = new Element( "Empresa" );
		empresaElement.setText( "Mapfre Seguros Gerais, S.A." );
		seguroElement.addContent( empresaElement );
		Element apoliceElement = new Element( "Apolice" );
		apoliceElement.setText( "1500591100500" );
		seguroElement.addContent( apoliceElement );
		return seguroElement;
	}
	
	protected Element createEmpresaSHSTElement()
	{
		Element empresaSHSTElement = new Element( "EmpresaSHST" );
		Element identificacaoElement = new Element( "IdentificacaoCompleta" );
		identificacaoElement.setText( 
			"SIPRP - Sociedade Ib\u00e9rica de Preven\u00e7\u00e3o de Riscos Profissionais Lda., "
			+ "com sede no Edif\u00edcio Atrium Saldanha, Pra\u00e7a Duque de Saldanha, 1 - 9\u00ba G"
			+ " - 1050-094 Lisboa " );
		empresaSHSTElement.addContent( identificacaoElement );
		Element tecnicoSuperiorHSTElement = new Element( "TecnicoSuperiorHST" );

		Element nomeTecnicoSuperiorHSTElement = new Element( "Nome" );
		nomeTecnicoSuperiorHSTElement.setText( tecnicoSuperior.getNome() );
		tecnicoSuperiorHSTElement.addContent( nomeTecnicoSuperiorHSTElement );
		Element capElement = new Element( "CAP" );
		capElement.setText( tecnicoSuperior.getCap() );
		tecnicoSuperiorHSTElement.addContent( capElement );
		empresaSHSTElement.addContent( tecnicoSuperiorHSTElement );
		Element medicoTrabalhoElement = new Element( "MedicoTrabalho" );
		Element nomeMedicoTrabalhoElement = new Element( "Nome" );
		nomeMedicoTrabalhoElement.setText( medico.getNome() );
		medicoTrabalhoElement.addContent( nomeMedicoTrabalhoElement );
		Element cedulaElement = new Element( "Cedula" );
		cedulaElement.setText( medico.getNumero_cedula() );
		medicoTrabalhoElement.addContent( cedulaElement );
		empresaSHSTElement.addContent( medicoTrabalhoElement );
		return empresaSHSTElement;
	}
	
	protected Element createAcidentadoElement()
	{
		Element acidentadoElement = new Element( "Acidentado" );
		Element nomeElement = new Element( "Nome" );
		nomeElement.setText( acidentado.getNome() );
		acidentadoElement.addContent( nomeElement );
		Element estabelecimentoOrigemElement = new Element( "EstabelecimentoOrigem" );
		Element nomeEstabelecimentoOrigemElement = new Element( "Nome" );
		nomeEstabelecimentoOrigemElement.setText( acidentado.getEstabelecimento_origem() );
		estabelecimentoOrigemElement.addContent( nomeEstabelecimentoOrigemElement );
		acidentadoElement.addContent( estabelecimentoOrigemElement );
		Date dataNascimento = acidentado.getData_nascimento();
		acidentadoElement.addContent( createDataElement( "DataNascimento", dataNascimento ) );
		Element biElement = new Element( "BilheteIdentidade" );
		Element numeroBiElement = new Element( "Numero" );
		numeroBiElement.setText( acidentado.getBilhete_identidade() );
		biElement.addContent( numeroBiElement );
		acidentadoElement.addContent( biElement );
		Element moradaElement = new Element( "Morada" );
		moradaElement.setText( acidentado.getMorada() + ", " + acidentado.getCod_postal() + " " + acidentado.getLocalidade() );
		acidentadoElement.addContent( moradaElement );
		Element telefoneElement = new Element( "Telefone" );
		telefoneElement.setText( acidentado.getContacto_telefonico() );
		acidentadoElement.addContent( telefoneElement );
		Date dataAdmissao = acidentado.getData_admissao();
		acidentadoElement.addContent( createDataElement( "DataAdmissao", dataAdmissao ) );
		Element funcaoElement = new Element( "Funcao" );
		funcaoElement.setText( acidentado.getFuncao() );
		acidentadoElement.addContent( funcaoElement );
		Element turnoElement = new Element( "Turno" );
		String turno = acidentado.getTurno();
		if( "m".equals( turno ) )
		{
			turno = "Manh\u00e3";
		}
		else if( "t".equals( turno ) )
		{
			turno = "Tarde";
		}
		else if( "n".equals( turno ) )
		{
			turno = "Noite";
		}
		turnoElement.setText( turno );
		acidentadoElement.addContent( turnoElement );
		Element superiorElement = new Element( "Superior" );
		Element nomeSuperiorElement = new Element( "Nome" );
		nomeSuperiorElement.setText( acidentado.getNome_superior_hierarquico() );
		superiorElement.addContent( nomeSuperiorElement );
		Element emailSuperiorElement = new Element( "Email" );
		emailSuperiorElement.setText( acidentado.getEmail_superior_hierarquico() );
		superiorElement.addContent( emailSuperiorElement );
		acidentadoElement.addContent( superiorElement );
		return acidentadoElement;
	}
	
	protected Element createAcidenteElement()
	{
		Element acidenteElement = new Element( "Acidente" );
		Element averiguadorElement = new Element( "Averiguador" );
		Element nomeAveriguadorElement = new Element( "Nome" );
		nomeAveriguadorElement.setText( analiseAcidente.getAveriguador() );
		averiguadorElement.addContent( nomeAveriguadorElement );
		acidenteElement.addContent( averiguadorElement );
		Date dataOcorrencia = analiseAcidente.getData_acidente();
		acidenteElement.addContent( createDataElement( "DataOcorrencia", dataOcorrencia ) );
		Time horaOcorrencia = analiseAcidente.getHora_acidente();
		acidenteElement.addContent( createHoraElement( "HoraOcorrencia", horaOcorrencia ) );
		Element horasTrabalhadasElement = new Element( "HorasTrabalhadas" );
		horasTrabalhadasElement.setText( "" + analiseAcidente.getHoras_turno() );
		acidenteElement.addContent( horasTrabalhadasElement );
		Element localElement = new Element( "Local" );
		Element seccaoElement = new Element( "Seccao" );
		seccaoElement.setText( seccao.getDescricao() );
		localElement.addContent( seccaoElement );
		Element localEspecificoElement = new Element( "LocalEspecifico" );
		localEspecificoElement.setText( analiseAcidente.getLocal_trabalho() );
		localElement.addContent( localEspecificoElement );
		acidenteElement.addContent( localElement );
		Element actividadeElement = new Element( "Actividade" );
		Element descricaoActividadeElement = new Element( "Descricao" );
		descricaoActividadeElement.setText( analiseAcidente.getTarefa() );
		actividadeElement.addContent( descricaoActividadeElement );
		Element objectosActividadeElement = new Element( "Objectos" );
		objectosActividadeElement.setText( analiseAcidente.getSubstancias() );
		actividadeElement.addContent( objectosActividadeElement );
		Element condicoesActividadeElement = new Element( "Condicoes" );
		condicoesActividadeElement.setText( analiseAcidente.getCondicoes() );
		actividadeElement.addContent( condicoesActividadeElement );
		acidenteElement.addContent( actividadeElement );
		Element testemunhasElement = new Element( "Testemunhas" );
		testemunhasElement.setText( analiseAcidente.getTestemunhas() ); 
		acidenteElement.addContent( testemunhasElement );
		Element causasElement = new Element( "Causas" );
		causasElement.setText( causa.getCausa() );
		acidenteElement.addContent( causasElement );
		Element descricaoElement = new Element( "Descricao" );
		descricaoElement.setText( analiseAcidente.getDescricao() );
		acidenteElement.addContent( descricaoElement );
		Element imagensElement = new Element( "Imagens" );
		if( imagens.size() > 0 )
		{
			Element temImagensElement = new Element( "TemImagens" );
			temImagensElement.setText( "y" );
			imagensElement.addContent( temImagensElement );
			for( int i = 0; i < imagens.size(); i++ )
			{
				String imagem = imagens.get( i ).toString();
				Element imagemElement = new Element( "Imagem" );
				imagemElement.setText( imagem );
				imagensElement.addContent( imagemElement );
			}
		}
		acidenteElement.addContent( imagensElement );
		Element conclusoesElement = new Element( "Conclusoes" );
		conclusoesElement.setText( analiseAcidente.getConclusoes() );
		acidenteElement.addContent( conclusoesElement );
		Element accoesTomadasElement = new Element( "AccoesTomadas" );
		accoesTomadasElement.setText( analiseAcidente.getAccoes() );
		acidenteElement.addContent( accoesTomadasElement );
		Element formacaoSHSTElement = new Element( "FormacaoSHST" );
		Element teveFormacaoSHSTElement = new Element( "TeveFormacao" );
		teveFormacaoSHSTElement.setText( analiseAcidente.getFormacao_shst() );
		formacaoSHSTElement.addContent( teveFormacaoSHSTElement );
		Element motivoFormacaoSHSTElement = new Element( "Motivo" );
		motivoFormacaoSHSTElement.setText( analiseAcidente.getFormacao_shst_nao_porque() );
		formacaoSHSTElement.addContent( motivoFormacaoSHSTElement );
		acidenteElement.addContent( formacaoSHSTElement );
		Element outrasOcorrenciasMesmoPostoElement = new Element( "OutrasOcorrenciasMesmoPosto" );
		Element quantidadeOutrasOcorrenciasMesmoPostoElement = new Element( "Quantidade" );
		boolean outrasOcorrenciasMesmoPosto = "y".equals( analiseAcidente.getOutros_acidentes_com_colaborador() );
		quantidadeOutrasOcorrenciasMesmoPostoElement.setText(
				outrasOcorrenciasMesmoPosto ? "" + analiseAcidente.getNr_acidentes_com_colaborador() : "0" );
		outrasOcorrenciasMesmoPostoElement.addContent( quantidadeOutrasOcorrenciasMesmoPostoElement );
		Element relatoriosOutrasOcorrenciasMesmoPostoElement = new Element( "Relatorios" );
		Integer relatorioMesmoPosto1 = analiseAcidente.getNr_relatorio_acidente_colaborador1();
		Integer relatorioMesmoPosto2 = analiseAcidente.getNr_relatorio_acidente_colaborador2();
		Integer relatorioMesmoPosto3 = analiseAcidente.getNr_relatorio_acidente_colaborador3();
		Integer relatorioMesmoPosto4 = analiseAcidente.getNr_relatorio_acidente_colaborador4();
		String numerosRelatoriosOutrasOcorrenciasMesmoPosto[] = 
			new String[]{
				relatorioMesmoPosto1 != null ? "" + relatorioMesmoPosto1 : null,
				relatorioMesmoPosto2 != null ? "" + relatorioMesmoPosto2 : null,
				relatorioMesmoPosto3 != null ? "" + relatorioMesmoPosto3 : null,
				relatorioMesmoPosto4 != null ? "" + relatorioMesmoPosto4 : null
		};
		for( int r = 0; r < numerosRelatoriosOutrasOcorrenciasMesmoPosto.length; r++ )
		{
			if( numerosRelatoriosOutrasOcorrenciasMesmoPosto[ r ] == null )
			{
				continue;
			}
			String numeroRelatorio = numerosRelatoriosOutrasOcorrenciasMesmoPosto[ r ];
			Element relatorioElement = new Element( "Relatorio" );
			relatorioElement.setText( numeroRelatorio );
			relatoriosOutrasOcorrenciasMesmoPostoElement.addContent( relatorioElement );
		}
		outrasOcorrenciasMesmoPostoElement.addContent( relatoriosOutrasOcorrenciasMesmoPostoElement );
		acidenteElement.addContent( outrasOcorrenciasMesmoPostoElement );
		Element outrasOcorrenciasOutrosTrabalhadoresElement = new Element( "OutrasOcorrenciasOutrosTrabalhadores" );
		Element quantidadeOutrasOcorrenciasOutrosTrabalhadoresElement = new Element( "Quantidade" );
		boolean outrasOcorrenciasOutrosTrabalhadores = "y".equals( analiseAcidente.getAcidentes_outros_colaboradores() );
		quantidadeOutrasOcorrenciasOutrosTrabalhadoresElement.setText(
				outrasOcorrenciasOutrosTrabalhadores ? "" + analiseAcidente.getNr_acidentes_outros_colaboradores() : "0" );
		outrasOcorrenciasOutrosTrabalhadoresElement.addContent( quantidadeOutrasOcorrenciasOutrosTrabalhadoresElement );
		Element relatoriosOutrasOcorrenciasOutrosTrabalhadoresElement = new Element( "Relatorios" );
		Integer relatorioOtrosTrabalhadores1 = analiseAcidente.getNr_relatorio_acidente_outros_colaboradores1();
		Integer relatorioOtrosTrabalhadores2 = analiseAcidente.getNr_relatorio_acidente_outros_colaboradores2();
		Integer relatorioOtrosTrabalhadores3 = analiseAcidente.getNr_relatorio_acidente_outros_colaboradores3();
		Integer relatorioOtrosTrabalhadores4 = analiseAcidente.getNr_relatorio_acidente_outros_colaboradores4();
		String numerosRelatoriosOutrasOcorrenciasOutrosTrabalhadores[] = 
			new String[]{
				relatorioOtrosTrabalhadores1 != null ? "" + relatorioOtrosTrabalhadores1 : null,
				relatorioOtrosTrabalhadores2 != null ? "" + relatorioOtrosTrabalhadores2 : null,
				relatorioOtrosTrabalhadores3 != null ? "" + relatorioOtrosTrabalhadores3 : null,
				relatorioOtrosTrabalhadores4 != null ? "" + relatorioOtrosTrabalhadores4 : null
		};
		for( int r = 0; r < numerosRelatoriosOutrasOcorrenciasOutrosTrabalhadores.length; r++ )
		{
			if( numerosRelatoriosOutrasOcorrenciasOutrosTrabalhadores[ r ] == null )
			{
				continue;
			}
			String numeroRelatorio = numerosRelatoriosOutrasOcorrenciasOutrosTrabalhadores[ r ];
			Element relatorioElement = new Element( "Relatorio" );
			relatorioElement.setText( numeroRelatorio );
			relatoriosOutrasOcorrenciasOutrosTrabalhadoresElement.addContent( relatorioElement );
		}
		outrasOcorrenciasOutrosTrabalhadoresElement.addContent( relatoriosOutrasOcorrenciasOutrosTrabalhadoresElement );
		acidenteElement.addContent( outrasOcorrenciasOutrosTrabalhadoresElement );
		Element lesaoElement = new Element( "Lesao" );
		Element areasLesaoElement = new Element( "Areas" );
		boolean cabeca = "y".equals( analiseAcidente.getLesao_cabeca() );
		boolean pescoco = "y".equals( analiseAcidente.getLesao_pescoco() );
		boolean tronco = "y".equals( analiseAcidente.getLesao_tronco() );
		boolean superiorDireito = "y".equals( analiseAcidente.getLesao_membro_sup_dir() );
		String detalheSuperiorDireito = analiseAcidente.getEspecif1();
		boolean superiorEsquerdo = "y".equals( analiseAcidente.getLesao_membro_sup_esq() );
		String detalheSuperiorEsquerdo = analiseAcidente.getEspecif2();
		boolean inferiorDireito = "y".equals( analiseAcidente.getLesao_membro_inf_dir() );
		String detalheInferiorDireito = analiseAcidente.getEspecif3();
		boolean inferiorEsquerdo = "y".equals( analiseAcidente.getLesao_membro_inf_esq() );
		String detalheInferiorEsquerdo = analiseAcidente.getEspecif4();
		String areasLesao[][] = 
			new String[][]{
				cabeca ? new String[] { "Cabe\u00e7a", "" } : null,
				pescoco ? new String[] { "Pesco\u00e7o", "" } : null,
				tronco ? new String[] { "Tronco", "" } : null,
				superiorDireito ? new String[] { "Membro Superior Direito", detalheSuperiorDireito } : null,
				superiorEsquerdo ? new String[] { "Membro Superior Esquerdo", detalheSuperiorEsquerdo } : null,
				inferiorDireito ? new String[] { "Membro Inferior Direito", detalheInferiorDireito } : null,
				inferiorEsquerdo ? new String[] { "Membro Inferior Esquerdo", detalheInferiorEsquerdo } : null,
		};
		for( int a = 0; a < areasLesao.length; a++ )
		{
			if( areasLesao[ a ] == null )
			{
				continue;
			}
			String area[] = areasLesao[ a ];
			Element areaLesaoElement = new Element( "Area" );
			Element nomeAreaLesaoElement = new Element( "Nome" );
			nomeAreaLesaoElement.setText( area[ 0 ] );
			areaLesaoElement.addContent( nomeAreaLesaoElement );
			Element detalheAreaLesaoElement = new Element( "Detalhe" );
			detalheAreaLesaoElement.setText( area[ 1 ] );
			areaLesaoElement.addContent( detalheAreaLesaoElement );
			areasLesaoElement.addContent( areaLesaoElement );
		}
		lesaoElement.addContent( areasLesaoElement );
		Element tipoLesaoElement = new Element( "Tipo" );
		tipoLesaoElement.setText( analiseAcidente.getTipo_lesao() );
		lesaoElement.addContent( tipoLesaoElement );
		acidenteElement.addContent( lesaoElement );
		Element incapacidadeElement = new Element( "Incapacidade" );
		Element tipoIncapacidadeElement = new Element( "Tipo" );
		String tipoIncapacidade = analiseAcidente.getTipo_incapacidade();
		if( "n".equals( tipoIncapacidade ) )
		{
			tipoIncapacidade = "Nenhuma";
		}
		else if( "t".equals( tipoIncapacidade ) )
		{
			tipoIncapacidade = "Tempor\u00e1ria";
		}
		else if( "p".equals( tipoIncapacidade ) )
		{
			tipoIncapacidade = "Permanente";
		}
		tipoIncapacidadeElement.setText( tipoIncapacidade );
		incapacidadeElement.addContent( tipoIncapacidadeElement );
		Element coeficienteIncapacidadeElement = new Element( "Coeficiente" );
		coeficienteIncapacidadeElement.setText( "" + analiseAcidente.getCoef_incapacidade() );
		incapacidadeElement.addContent( coeficienteIncapacidadeElement );
		Date dataAvaliacao = analiseAcidente.getData_aval_incapacidade();
		incapacidadeElement.addContent( createDataElement( "DataAvaliacao", dataAvaliacao ) );
		Date dataRevisao = analiseAcidente.getData_rev_incapacidade();
		incapacidadeElement.addContent( createDataElement( "DataRevisao", dataRevisao ) );
		Element periodoIncapacidadeElement = new Element( "PeriodoIncapacidade" );
		Date inicioIncapacidade = analiseAcidente.getPeriodo_incapacidade_de();
		periodoIncapacidadeElement.addContent( createDataElement( "Inicio", inicioIncapacidade ) );
		Date fimIncapacidade = analiseAcidente.getPeriodo_incapacidade_a();
		periodoIncapacidadeElement.addContent( createDataElement( "Fim", fimIncapacidade ) );
		incapacidadeElement.addContent( periodoIncapacidadeElement );
		acidenteElement.addContent( incapacidadeElement );
		return acidenteElement;
	}
	
	protected Element createRecomendacoesSIPRPElement()
	{
		Element recomendacoesSIPRPElement = new Element( "RecomendacoesSIPRP" );
		for( int r = 0; r < recomendacoes.length; r++ )
		{
			Element recomendacaoElement = new Element( "Recomendacao" );
			recomendacaoElement.setText( recomendacoes[ r ].getRecomendacao() );
			recomendacoesSIPRPElement.addContent( recomendacaoElement );
		}
		
		return recomendacoesSIPRPElement;
	}
	
	protected Element createMedidasElement()
	{
		Element medidasElement = new Element( "MedidasAdoptar" );
		for( int m = 0; m < medidas.length; m++ )
		{
			Element medidaElement = new Element( "Medida" );
			medidaElement.setText( medidas[ m ].getMedida() );
			medidasElement.addContent( medidaElement );
		}
		return medidasElement;
	}
	
	protected Element createTomadaConhecimentoElement()
	{
		Element tomadaConhecimentoElement = new Element( "TomadaConhecimento" );
		tomadaConhecimentoElement.addContent( 
			createAssinaturaElement( "DepartamentoSeguranca", 
					analiseAcidente.getAveriguador(),
					analiseAcidente.getData_inicio_processo() ) );
		tomadaConhecimentoElement.addContent( 
			createAssinaturaElement( "TecnicoHST", 
					analiseAcidente.getNome_resp_consolidacao(), 
					analiseAcidente.getData_consolidacao() ) );
		tomadaConhecimentoElement.addContent( 
			createAssinaturaElement( "ResponsavelSeguranca", 
					analiseAcidente.getNome_resp_seg(), 
					analiseAcidente.getData_assinatura_seg() ) );
		tomadaConhecimentoElement.addContent( 
			createAssinaturaElement( "ResponsavelRH", 
					analiseAcidente.getNome_resp_rh(), 
					analiseAcidente.getData_assinatura_rh() ) );
		tomadaConhecimentoElement.addContent( 
			createAssinaturaElement( "SuperiorHierarquico", 
					acidentado.getNome_superior_hierarquico(), 
					acidentado.getData_email_superior_hierarquico() ) );
		return tomadaConhecimentoElement;
	}
	
	protected Element createAssinaturaElement( String nome, String nomeStr, Date data )
	{
		Element assinaturaElement = new Element( nome );
		Element nomeElement = new Element( "Nome" );
		nomeElement.setText( nomeStr );
		assinaturaElement.addContent( nomeElement );
		assinaturaElement.addContent( createDataElement( "Data", data ) );
		return assinaturaElement;
	}
	
	protected Element createDataElement( String nome, Date data )
	{
		Element dataElement = new Element( nome );
		
		Element anoElement = new Element( "Ano" );
		dataElement.addContent( anoElement );
		Element mesElement = new Element( "Mes" );
		dataElement.addContent( mesElement );
		Element diaElement = new Element( "Dia" );
		dataElement.addContent( diaElement );
		
		if( data != null )
		{
			Calendar cal = Calendar.getInstance();
			cal.setTime( data );
			anoElement.setText( "" + cal.get( Calendar.YEAR ) );
			int mes = cal.get( Calendar.MONTH ) + 1;
			mesElement.setText( mes > 9 ? ( "" + mes ) : ( "0" + mes ) );
			int dia = cal.get( Calendar.DAY_OF_MONTH );
			diaElement.setText( dia > 9 ? ( "" + dia ) : ( "0" + dia ) );
		}
		
		return dataElement;
	}
	
	protected Element createHoraElement( String nome, Date hora )
	{
		Element horaElement = new Element( nome );
		Element horasElement = new Element( "Horas" );
		horaElement.addContent( horasElement );
		Element minutosElement = new Element( "Minutos" );
		horaElement.addContent( minutosElement );
		if( hora != null )
		{
			Calendar cal = Calendar.getInstance();
			cal.setTime( hora );
			int horas = cal.get( Calendar.HOUR_OF_DAY );
			horasElement.setText( horas > 9 ? ( "" + horas ) : ( "0" + horas ) );
			int minutos = cal.get( Calendar.MINUTE );
			minutosElement.setText( minutos > 9 ? ( "" + minutos ) : ( "0" + minutos ) );
		}
		return horaElement;
	}
}
