package com.fp.armas.rules.save.webservices;

import static com.fp.armas.rules.query.webservices.ConsultaImpresionProceso.QUERY_COLA_SOLICITUD;

import java.sql.Timestamp;
import java.util.Date;
import java.util.List;

import javax.persistence.Query;

import com.fp.common.logger.APPLogger;
import com.fp.dto.rules.TransactionRule;
import com.fp.dto.save.SaveRequest;
import com.fp.persistence.commondb.PersistenceHelper;
import com.fp.persistence.commondb.exception.CommondbException;
import com.fp.persistence.commondb.helper.FormatDates;
import com.fp.persistence.parmas.inte.TarmColadeImpresion;
import com.fp.persistence.parmas.soli.TarmDocumentoHabilitante;
import com.fp.persistence.parmas.soli.TarmSolicitud;
import com.fp.persistence.pcustomer.company.TcustCompany;
import com.fp.persistence.pcustomer.company.TcustCompanyKey;
import com.fp.persistence.pcustomer.gene.TcustPersonDetail;
import com.fp.persistence.pcustomer.gene.TcustPersonDetailKey;
import com.fp.persistence.pcustomer.people.TcustPeople;
import com.fp.persistence.pcustomer.people.TcustPeopleKey;
import com.fp.persistence.pgeneral.image.TgeneFiles;
import com.fp.persistence.pgeneral.image.TgeneFilesDetail;
import com.fp.persistence.pgeneral.image.TgeneFilesDetailKey;
import com.fp.sessionbeans.helper.Sequence;

/**
 * Actualiza los datos del documento habilitante enviado
 * @author dcruz
 *
 */
public class DocumentoDatos extends TransactionRule {

	private static final long serialVersionUID = -951465699701916612L;
	public static final String SQLDOCUMENTOCOLAIMPRESION="SELECT o FROM TarmColadeImpresion o"
			                                           + " WHERE o.cdocumento IN (SELECT i.pk FROM TarmDocumentoHabilitante i  "
			                                                                  + " WHERE i.numerodocumento =:numerodocumento)";
	
	/**
	 * Actualizamos fecha de impresi&oacute;n en la cola de impresion encontrada, actualizamos la foto de la persona o el logo de la compan&iacute;a seg&uacute;n sea el caso
	 */
	@SuppressWarnings("unchecked")
	@Override
	public SaveRequest normalProcess(SaveRequest pRequest) throws Exception {
		System.out.println(".........ACTUALIZA LOS DATOS DEL TARMCOLADEIMPRESION...................");
		String respuesta = "0";
		try {
			byte[] foto = (byte[]) pRequest.get("FOTO");
			String numerosolicitud = (String) pRequest.get("CODIGOSOLICITUD");//numero de solicitud
			String codigotarjeta = (String) pRequest.get("CODIGOTARJETA");
			Date fechaimpresion = (Date) pRequest.get("FECHAIMPRESION");
			//
			System.out.println(SQLDOCUMENTOCOLAIMPRESION+"  "+numerosolicitud);
			
			Query query = PersistenceHelper.getEntityManager().createQuery(SQLDOCUMENTOCOLAIMPRESION);
			query.setParameter("numerodocumento", numerosolicitud);
			
			List<TarmColadeImpresion> ltarmcoladeimpresion = query.getResultList();
			if(ltarmcoladeimpresion != null && !ltarmcoladeimpresion.isEmpty()){//siempre que es un permiso para imprimir en la cola de impresion recupera uno
				TarmColadeImpresion coladeImpresion = ltarmcoladeimpresion.iterator().next();
				coladeImpresion.setFechaimpresion(new Timestamp(fechaimpresion.getTime()));
				coladeImpresion.setCodigotarjeta(codigotarjeta);
				coladeImpresion.setEstadoimpresion("IMPR");
				PersistenceHelper.getEntityManager().merge(coladeImpresion);
				System.out.println("ACTIALIZA LA COLA DE IMPRESION..");
				TarmDocumentoHabilitante documentoHabilitante = TarmDocumentoHabilitante.find(PersistenceHelper.getEntityManager(), coladeImpresion.getCdocumento());
				TarmSolicitud solicitud = TarmSolicitud.find(PersistenceHelper.getEntityManager(), documentoHabilitante.getCsolicitud());
				TcustPersonDetail personDetail = TcustPersonDetail.find(PersistenceHelper.getEntityManager(), new TcustPersonDetailKey(solicitud.getPersoncode(), FormatDates.getDefaultExpiryTimestamp()));
				TgeneFilesDetail fotoLogo = obtenerFoto(personDetail);
				
				if(fotoLogo.getPk() == null){// es un registro nuevo
					TcustCompany company = null;
					TcustPeople people = null;
					if(fotoLogo.getModifiedData().get("DATOASOCIADO") != null && fotoLogo.getModifiedData().get("DATOASOCIADO") instanceof TcustCompany){
						company = (TcustCompany) fotoLogo.getModifiedData().get("DATOASOCIADO");
					} else if(fotoLogo.getModifiedData().get("DATOASOCIADO") != null && fotoLogo.getModifiedData().get("DATOASOCIADO") instanceof TcustPeople){
						people = (TcustPeople) fotoLogo.getModifiedData().get("DATOASOCIADO");
					}
					TgeneFiles tgeneFiles = new TgeneFiles(getCode());
					PersistenceHelper.getEntityManager().persist(tgeneFiles);
					fotoLogo.setPk(new TgeneFilesDetailKey(tgeneFiles.getPk(), FormatDates.getDefaultExpiryTimestamp()));
					fotoLogo.setDatefrom(new Timestamp(System.currentTimeMillis()));
					fotoLogo.setName("FOTO");
					fotoLogo.setCapturedate(new java.sql.Date(System.currentTimeMillis()));
					fotoLogo.setContenttype("image/jpeg");
					fotoLogo.setDescription("LOGO EMPRESA");
					fotoLogo.setImage(foto);
					fotoLogo.setExtension("jpg");
					fotoLogo.setImagesize(foto.length);
					PersistenceHelper.getEntityManager().persist(fotoLogo);
					System.out.println("INSERTA LA FOTO.....");
					//Actualizo en la persona o la compania segun sea el caso
					if(company != null){
						company.setLogo(tgeneFiles.getPk());
						PersistenceHelper.getEntityManager().merge(company);
					} else if(people != null){
						people.setPhotocode(tgeneFiles.getPk());
						PersistenceHelper.getEntityManager().merge(people);
					}
				} else{//actualizo el registro anterior y genero el historial
					TgeneFilesDetail tgeneFilesDetail = new TgeneFilesDetail(new TgeneFilesDetailKey(fotoLogo.getPk().getCode(), new Timestamp(System.currentTimeMillis())));
					tgeneFilesDetail.setDatefrom(fotoLogo.getDatefrom());
					tgeneFilesDetail.setName(fotoLogo.getName());
					tgeneFilesDetail.setCapturedate(fotoLogo.getCapturedate());
					tgeneFilesDetail.setContenttype(fotoLogo.getContenttype());
					tgeneFilesDetail.setDescription(fotoLogo.getDescription());
					tgeneFilesDetail.setImage(fotoLogo.getImage());
					tgeneFilesDetail.setExtension(fotoLogo.getExtension());
					tgeneFilesDetail.setImagesize(fotoLogo.getImagesize());
					PersistenceHelper.getEntityManager().persist(tgeneFilesDetail);
					fotoLogo.setImage(foto);
					fotoLogo.setImagesize(foto.length);
					PersistenceHelper.getEntityManager().merge(fotoLogo);
					System.out.println("ACTUALIZA LA FOTO.....");
				}
				PersistenceHelper.getEntityManager().flush();
			}
		} catch (Throwable e) {
			respuesta = "2";
			APPLogger.getLogger().error(e.getMessage(), e);
		}
		pRequest.getResponse().put("RESPONSESTATUS", respuesta);
		return pRequest;
	}

	@Override
	public SaveRequest reverseProcess(SaveRequest pRequest) throws Exception {
		return pRequest;
	}

	/**
	 * Retorna la foto de la persona si es que esta existe
	 * @param personDetail
	 * @return El detalle del achivo imagen que se ha guardado, o un archivo vac&iacute;o sin pk para que pueda ser guardado en la base de datos
	 * @throws CommondbException
	 * @throws Exception
	 */
	private TgeneFilesDetail obtenerFoto(TcustPersonDetail personDetail) throws CommondbException, Exception{
		TcustCompany company = null;
		TcustPeople people = null;
		TgeneFilesDetail result = null;
		switch(personDetail.getIdentification().length()){
			case 13:
				company = TcustCompany.find(PersistenceHelper.getEntityManager(), new TcustCompanyKey(personDetail.getPk().getPersoncode(), FormatDates.getDefaultExpiryTimestamp()));
				break;
			default:
				people = TcustPeople.find(PersistenceHelper.getEntityManager(), new TcustPeopleKey(personDetail.getPk().getPersoncode(), FormatDates.getDefaultExpiryTimestamp()));
				break;
		}
		if(company != null){
			result = TgeneFilesDetail.find(PersistenceHelper.getEntityManager(), new TgeneFilesDetailKey(company.getLogo(), FormatDates.getDefaultExpiryTimestamp()));
//			result.getModifiedData().put("DATOASOCIADO", company);
		} else if(people != null){
			result = TgeneFilesDetail.find(PersistenceHelper.getEntityManager(), new TgeneFilesDetailKey(people.getPhotocode(), FormatDates.getDefaultExpiryTimestamp()));
//			result.getModifiedData().put("DATOASOCIADO", people);
		}
		if(result == null){
			result = new TgeneFilesDetail();
		} 
		result.getModifiedData().put("DATOASOCIADO", company != null ? company : people);
		return result;
	}
	
	/**
	 * Retorna el secuencial para ingresar en la tabla {@link TgeneFiles}
	 * @return
	 * @throws Exception
	 */
	private Integer getCode() throws Exception{
		Sequence secuenciaCode = new Sequence();
		return Integer.valueOf(secuenciaCode.getNextValue("CODE").toString());
	}
}
