package com.ejie.m62fb.service.registroVPP;
import org.springframework.security.access.prepost.PreAuthorize;

import java.math.BigDecimal;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.PathVariable;

import com.ejie.m62fb.dao.PersonaDao;
import com.ejie.m62fb.model.persona.Persona;
import com.ejie.x38.dto.JQGridRequestDto;
import com.ejie.x38.dto.JQGridResponseDto;
import com.ejie.x38.dto.TableRowDto;
//import com.ejie.x53js.clientesWS.dgp.v3.Atributos;
//import com.ejie.x53js.clientesWS.dgp.v3.Consulta;
//import com.ejie.x53js.clientesWS.dgp.v3.DGPConsultaIdentidad;
//import com.ejie.x53js.clientesWS.dgp.v3.DGPConsultaIdentidad_Service;
//import com.ejie.x53js.clientesWS.dgp.v3.DatosEspecificos;
//import com.ejie.x53js.clientesWS.dgp.v3.DatosGenericos;
//import com.ejie.x53js.clientesWS.dgp.v3.DatosNacimiento;
//import com.ejie.x53js.clientesWS.dgp.v3.Emisor;
//import com.ejie.x53js.clientesWS.dgp.v3.Estado;
//import com.ejie.x53js.clientesWS.dgp.v3.Funcionario;
//import com.ejie.x53js.clientesWS.dgp.v3.Procedimiento;
//import com.ejie.x53js.clientesWS.dgp.v3.Solicitante;
//import com.ejie.x53js.clientesWS.dgp.v3.SolicitudTransmision;
//import com.ejie.x53js.clientesWS.dgp.v3.Solicitudes;
//import com.ejie.x53js.clientesWS.dgp.v3.Titular;
//import com.ejie.x53js.clientesWS.dgp.v3.Transmision;

//import es.redsara.intermediacion.scsp.esquemas.identidad.v3.peticion.Peticion;
//import es.redsara.intermediacion.scsp.esquemas.identidad.v3.respuesta.Respuesta;
//
//import es.redsara.intermediacion.scsp.esquemas.identidad.datosespecificos.Consulta;
//import es.redsara.intermediacion.scsp.esquemas.identidad.datosespecificos.DatosAdicionalesTitular;
//import es.redsara.intermediacion.scsp.esquemas.identidad.datosespecificos.DatosEspecificos;
//import es.redsara.intermediacion.scsp.esquemas.identidad.datosespecificos.TipoTramiteConsulta;
//import es.redsara.intermediacion.scsp.esquemas.identidad.v3.peticion.Atributos;
//import es.redsara.intermediacion.scsp.esquemas.identidad.v3.peticion.DatosGenericos;
//import es.redsara.intermediacion.scsp.esquemas.identidad.v3.peticion.Emisor;
//import es.redsara.intermediacion.scsp.esquemas.identidad.v3.peticion.Estado;
//import es.redsara.intermediacion.scsp.esquemas.identidad.v3.peticion.Funcionario;
//import es.redsara.intermediacion.scsp.esquemas.identidad.v3.peticion.Peticion;
//import es.redsara.intermediacion.scsp.esquemas.identidad.v3.peticion.Procedimiento;
//import es.redsara.intermediacion.scsp.esquemas.identidad.v3.peticion.Solicitante;
//import es.redsara.intermediacion.scsp.esquemas.identidad.v3.peticion.SolicitudTransmision;
//import es.redsara.intermediacion.scsp.esquemas.identidad.v3.peticion.Solicitudes;
//import es.redsara.intermediacion.scsp.esquemas.identidad.v3.peticion.Titular;
//import es.redsara.intermediacion.scsp.esquemas.identidad.v3.peticion.Transmision;
//import es.redsara.intermediacion.scsp.esquemas.identidad.v3.respuesta.Respuesta;

/**
 * PersonaServiceImpl generated by UDA, 24-oct-2012 16:55:00.
 * 
XXXX
 */

@Service(value = "personaService")
public class PersonaServiceImpl implements PersonaService {

	@Autowired
	private PersonaDao personaDao;
	
	/**
	 * Inserts a single row in the Persona table.
	 * 
	 * @param persona
	 *            Persona
	 * @return Persona
	 */
	@Transactional(rollbackFor = Throwable.class)
@PreAuthorize("hasPermission('PERSONA_SERVICE','SecureService','create')")
	public Persona add(Persona persona) {
		return this.personaDao.add(persona);
	}

	/**
	 * Updates a single row in the Persona table.
	 * 
	 * @param persona
	 *            Persona
	 * @return Persona
	 */
	@Transactional(rollbackFor = Throwable.class)
@PreAuthorize("hasPermission('PERSONA_SERVICE','SecureService','write')")
	public Persona update(Persona persona) {
		personaDao.findForUpdate(persona);
		return this.personaDao.update(persona);
	}
	/**
	 * Filter method in the Persona table.
	 *
	 * @param filterElemento Persona
	 * @param jqGridRequestDto JQGridRequestDto
	 * @param startsWith Boolean
	 * @return JQGridResponseDto<Elemento>
	 */	
@PreAuthorize("hasPermission('PERSONA_SERVICE','SecureService','read')")
	public JQGridResponseDto< Persona> filter(Persona filterPersona, JQGridRequestDto jqGridRequestDto,  Boolean startsWith){
		List<Persona> listaPersona =  this.personaDao.findAllLike(filterPersona, jqGridRequestDto, false);
		Long recordNum =  this.personaDao.findAllLikeCount(filterPersona != null ? filterPersona: new Persona (),false);
		if (jqGridRequestDto.getMultiselection().getSelectedIds()!=null){
			List< TableRowDto< Persona>> reorderSelection = this.personaDao.reorderSelection(filterPersona, jqGridRequestDto, startsWith);
			return new JQGridResponseDto<Persona>(jqGridRequestDto, recordNum, listaPersona, reorderSelection);
		}
		return new JQGridResponseDto<Persona>(jqGridRequestDto, recordNum, listaPersona);   
	}
    
	/**
	 * Finds a single row in the Persona table.
	 * 
	 * @param persona
	 *            Persona
	 * @return Persona
	 */
@PreAuthorize("hasPermission('PERSONA_SERVICE','SecureService','read')")
	public Persona find(Persona persona) {
		return this.personaDao.find(persona);
	}

//	/**
//	 * Finds a List of rows in the Persona table.
//	 * 
//	 * @param persona
//	 *            Persona
//	 * @param pagination
//	 *            Pagination
//	 * @return List
//	 */
//	public List<Persona> findAll(Persona persona, Pagination pagination) {
//		return this.personaDao.findAll(persona, pagination);
//	}

//	/**
//	 * Counts rows in the Persona table.
//	 * 
//	 * @param persona
//	 *            Persona
//	 * @return Long
//	 */
//	public Long findAllCount(Persona persona) {
//		return this.personaDao.findAllCount(persona);
//	}

	/**
	 * Finds rows in the Persona table using like.
	 * 
	 * @param persona
	 *            Persona
	 * @param pagination
	 *            Pagination
	 * @param startsWith
	 *            Boolean
	 * @return List
	 */
@PreAuthorize("hasPermission('PERSONA_SERVICE','SecureService','read')")
	public List<Persona> findAllLike(Persona filterPersona, JQGridRequestDto jqGridRequestDto,  Boolean startsWith) {
		return this.personaDao.findAllLike(filterPersona, jqGridRequestDto, false);
	}

/**
 * Finds rows in the Persona table .
 * 
 * @param persona
 *            Persona
 * @param pagination
 *            Pagination
 * @return List
 */
@PreAuthorize("hasPermission('PERSONA_SERVICE','SecureService','read')")
public List<Persona> findAll(Persona filterPersona, JQGridRequestDto jqGridRequestDto) {
	return this.personaDao.findAll(filterPersona, jqGridRequestDto);
}
	/**
	 * Counts rows in the Persona table using like.
	 * 
	 * @param persona
	 *            Persona
	 * @param startsWith
	 *            Boolean
	 * @return Long
	 */
@PreAuthorize("hasPermission('PERSONA_SERVICE','SecureService','read')")
	public Long findAllLikeCount(Persona persona, Boolean startsWith) {
		return this.personaDao.findAllLikeCount(persona, startsWith);
	}

	/**
	 * Deletes a single row in the Persona table.
	 * 
	 * @param persona
	 *            Persona
	 * @return
	 */
	@Transactional(rollbackFor = Throwable.class)
@PreAuthorize("hasPermission('PERSONA_SERVICE','SecureService','delete')")
	public void remove(Persona persona) {
		this.personaDao.remove(persona);
	}

	/**
	 * Deletes multiple rows in the Persona table.
	 * 
	 * @param personaList
	 *            List
	 * @return
	 */
	@Transactional(rollbackFor = Throwable.class)
@PreAuthorize("hasPermission('PERSONA_SERVICE','SecureService','read')")
	public void removeMultiple(List<Persona> personaList) {
		for (Persona personaAux : personaList) {
			this.personaDao.remove(personaAux);
		}
	}
	
	/**
	 * Inserta una petición para llamar al SVDI
	 * @param persona
	 * @return
	 */
	public String insertPeticionSVDI(String tipoCodigoId, String codigoId,
			 String apellido1, String fechaNacimiento){
		String idPeticion = this.personaDao.insertPeticionSVDI(tipoCodigoId,codigoId,apellido1,fechaNacimiento);
		return idPeticion;
	}
	/**
	 * Devuelve el resultado de una petición del SVDI
	 * @param persona
	 * @return
	 */
	public Persona getResultadoSVDI(String idPeticion){
		Persona persona = this.personaDao.getResultadoSVDI( idPeticion);
		return persona;
	}
//	/**
//	 * LLama al servicio web de interoperabilidad SVDI
//	 * @param persona
//	 * @return
//	 * @throws MalformedURLException 
//	 */
//	public Persona getDatosSVDI (Persona persona) throws MalformedURLException{
////		// ***************************///
//        URL urlSVDI = null;
//        urlSVDI = new URL (UtilProperties.getProperty("x53js.svdi"));
//        final QName DEFAULT_QNAME = new QName("http://www.map.es/xml-schemas",
//	      "x53jsGetDatosIdentidadV3");
//        Peticion peticionSVDI = new Peticion();
//        Respuesta respuestaSVDI = new Respuesta();
////        com.ejie.x53js.clientesWS.dgp.v3.Peticion peticionSVDI = new com.ejie.x53js.clientesWS.dgp.v3.Peticion();
////        com.ejie.x53js.clientesWS.dgp.v3.Respuesta respuestaSVDI = new com.ejie.x53js.clientesWS.dgp.v3.Respuesta();
////
//        X53JsGetDatosIdentidadV3 serviceSVDI = new X53JsGetDatosIdentidadV3(urlSVDI, DEFAULT_QNAME);
////        javax.xml.ws.Service serviceSVDI = DGPConsultaIdentidad_Service.create(urlSVDI,
////                    DEFAULT_QNAME);
//        HeaderHandlerResolver handlerResolverSVDI = new HeaderHandlerResolver();
//        serviceSVDI.setHandlerResolver(handlerResolverSVDI);
////
//         
//        DatosIdentidadPortType proxyPort = serviceSVDI.getGetDatosIdentidadPort();
////        DGPConsultaIdentidad serviceSVDI_impl = serviceSVDI.
////                    .getPort(DGPConsultaIdentidad.class);
////        //Atributos de la petición
////
//        Atributos atributosPetSVDI =new Atributos();
////      -	IdPeticion: identificador único asociado a la petición que se envía.
//        atributosPetSVDI.setIdPeticion("M62FB-SVDI");
////      -	NumElementos: nº de elementos consultados. Su valor siempre será 1.
//        atributosPetSVDI.setNumElementos(1);
////      -	TimeStamp: fecha y hora del envío de la petición.          
//        atributosPetSVDI.setTimeStamp((new Date()).toString());
//        Estado estado = new Estado();
////      -	Estado/CodigoEstado: en la petición su valor será 0001.
//        estado.setCodigoEstado("0001");
////      -	Estado/LietralError: en la petición su valor será PENDIENTE.
//        estado.setLiteralError("PENDIENTE");
//        atributosPetSVDI.setEstado(estado);
////      -	CodigoCertificado: código del servicio que se está consultando SVDISFWS01
//        atributosPetSVDI.setCodigoCertificado("SVDISFWS01");
//        
//        peticionSVDI.setAtributos(atributosPetSVDI);
////        
//////        DatosGenericos 
//////        -	Emisor: Nif y Nombre del emisor del servicio.
//        DatosGenericos datosGenericos = new DatosGenericos();
////        //Emisor
//        Emisor emisor=new Emisor();
//////    	o	NifEmisor: su valor será S2811001C.
//        emisor.setNifEmisor("S2811001C");
//////    	o	NombreEmisor: su valor será Dirección General de la Policía.
//        emisor.setNombreEmisor("Dirección General de la Policía");
////        
//        datosGenericos.setEmisor(emisor);
//////        -	Solicitante: Datos del organismo que consulta el servicio.
//        Solicitante solicitante =  new Solicitante();
////    	//        o	IdentificadorSolicitante: Nif del organismo solicitante. Obligatorio.
//        solicitante.setIdentificadorSolicitante("22711553L");
////    	//        o	NombreSolicitante: Nombre del organismo solicitante. Obligatorio.
//        solicitante.setNombreSolicitante("Eusko Jaurlaritza - Gobierno Vasco");
////    	//        o	UnidadTramitadora: Departamento o unidad tramitadora que realiza la consulta. 
////        //							   Obligatorio de cara al negocio del servicio, aunque en el esquema esté definido como opcional.
//        solicitante.setUnidadTramitadora("DEPARTAMENTO DE EMPLEO Y POLITICAS SOCIALES");
////        
////        //      		  o	Procedimiento (Obligatorio de cara al negocio del servicio)
////			//        	CodProcedimiento: Código de autorización asignado por la DACIMA. Obligatorio. Será un valor fijo asociado a cada procedimiento de tramitación que acceda al servicio.
////			//        	NombreProcedimiento: Nombre del procedimiento de tramitación o administrativo para el que se accede al servicio. Opcional. 
//        Procedimiento procedimiento = new Procedimiento();
//        procedimiento.setCodProcedimiento("SVDI_000029");
//        solicitante.setProcedimiento(procedimiento);
////        
////    	//       o	Finalidad: Texto normativo asociado al procedimiento o trámite para el que se realiza la consulta al servicio. Obligatorio.
//        solicitante.setFinalidad("Solicitud de ayudas");
////    	//        o	Consentimiento: Consentimiento de la persona interesada cuyos datos se vayan a consultar, salvo que una norma de rango de ley autorice dicha consulta. 
//////        			Obligatorio. Valores posibles: Si ó Ley.
//        solicitante.setConsentimiento("Si");
////
////    	//        o	Funcionario
////    		//        	NombreCompletoFuncionario: Nombre y apellidos del empleado público o tramitador que realiza la consulta al servicio. 
//////        Si se trata de una aplicación contendrá el nombre de la persona responsable de la aplicación. Obligatorio.
//        Funcionario funcionario= new Funcionario();
//        funcionario.setNifFuncionario("22711553L");
////		//        	NifFuncionario: DNI del empleado público o tramitador que realiza la consulta al servicio. Si se trata de una aplicación contendrá el DNI de la persona responsable de la aplicación. Obligatorio.
//        funcionario.setNombreCompletoFuncionario("MARIO YOLDI");	
//        solicitante.setFuncionario(funcionario);
////        
////        //        o	IdExpediente: Identificador o Nº de expediente asociado a la solicitud o al nº de documento para el que se realiza la consulta. 
////        //Obligatorio de cara al negocio del servicio
//        solicitante.setIdExpediente("-");
////        
//        datosGenericos.setSolicitante(solicitante);
//////        -	Titular: Datos del titular para el que se realiza la consulta.
//        Titular titular = new Titular();
////        //        o	TipoDocumentacion: Tipo de documento del titular que se quiere consultar: (/DNI/NIE/Pasaporte). Obligatorio.
//        titular.setTipoDocumentacion("DNI");
////		//        o	Documentacion: Nº del documento del titular. Obligatorio.
//        titular.setDocumentacion("30000529L");
////		//        o	NombreCompleto: Nombre completo del titular que se consulta. Opcional.
////        
////		//        o	Nombre: Nombre del titular que se consulta. Opcional.
////		//        o	Apellido1: Primer apellido del titular que se consulta. Opcional.
//        titular.setApellido1("GARCIA");
////		//        o	Apellido2: Segundo apellido del titular que se consulta. Opcional.
////        //titular.setApellido2("PLATA");
////
//        datosGenericos.setTitular(titular);
//////        
//////        -	Transmision: Datos relacionados con la solicitud.
////	//        o	CodigoCertificado: su valor será SVDISFWS01.
////	//        o	IdSolicitud: su valor coincidirá con el del campo IdPeticion de la rama Atributos.
//        Transmision transmision = new Transmision();
//        transmision.setCodigoCertificado(atributosPetSVDI.getCodigoCertificado());
//        transmision.setIdSolicitud(atributosPetSVDI.getIdPeticion());
////       
//        datosGenericos.setTransmision(transmision);
//////        DatosEspecificos 
//        DatosEspecificos datosEspecificos =  new DatosEspecificos() ;
//        TipoTramiteConsulta tipoTramiteConsulta = new TipoTramiteConsulta();
//        tipoTramiteConsulta.setTipoTramite("CONSULTA");
//        Consulta consulta = new Consulta();
//        consulta.setTipoTramiteConsulta(tipoTramiteConsulta);
//        DatosAdicionalesTitular  datosAdicionalesTitular = new DatosAdicionalesTitular();
//        datosAdicionalesTitular.setFechaNacimiento("19440410");
//        consulta.setDatosAdicionalesTitular(datosAdicionalesTitular);
//        datosEspecificos.setConsulta(consulta);
////        
//        Solicitudes solicitudesPetSVDI = new Solicitudes();
//        SolicitudTransmision solicitudTransmision = new SolicitudTransmision();
//        solicitudTransmision.setDatosEspecificos(datosEspecificos);
//        solicitudTransmision.setDatosGenericos(datosGenericos);
//
//        solicitudesPetSVDI.setSolicitudTransmision(solicitudTransmision);
//        peticionSVDI.setSolicitudes(solicitudesPetSVDI);
//
//        respuestaSVDI = proxyPort.getDatosIdentidadWS(peticionSVDI);
////        respuestaSVDI = serviceSVDI_impl.peticionSincrona(peticionSVDI);
////        respuestaSVDI.getAtributosResp();
////
//        String parametrosSalida = respuestaSVDI.getTransmisiones()
//        .getTransmisionDatos().getDatosEspecificos().getRetorno()
//        .getEstadoResultado().getCodigoEstado()
//        + " - "
//        + respuestaSVDI.getTransmisiones().getTransmisionDatos()
//                   .getDatosEspecificos().getRetorno()
//                   .getEstadoResultado().getLiteralError();
////
////
//		return persona;
//	}
}
