package com.rjconsultores.ventaboletos.rest.pricing;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

import org.apache.commons.lang.StringUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import com.rjconsultores.ventaboletos.constantes.Constantes;
import com.rjconsultores.ventaboletos.enums.PricingOperacaoWS;
import com.rjconsultores.ventaboletos.rest.bean.ParamsAlterarPricing;
import com.rjconsultores.ventaboletos.rest.returns.PricingRetorno;
import com.rjconsultores.ventaboletos.rest.service.AlteraPricingService;
import com.rjconsultores.ventaboletos.utilerias.DateUtil;
import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado;
import com.rjconsultores.ventaboletos.vo.pricing.Pricing;
import com.rjconsultores.ventaboletos.web.utilerias.spring.AppContext;

//@Path("pricing")
// FIXME: Este EndPoint foi movido para a RJ API
public class AlteraPricingRS {
	
	private static Logger log = LogManager.getLogger(AlteraPricingRS.class);

//	@POST
//	@Consumes({ MediaType.APPLICATION_JSON })
//	@Produces({ MediaType.APPLICATION_JSON })
//	@Path("recuperarPricing")
	public Response recuperarPricing(ParamsAlterarPricing params) {
		PricingRetorno pricingRetorno = new PricingRetorno();
		try {
			AlteraPricingService service = (AlteraPricingService) AppContext.getApplicationContext().getBean("alteraPricingService");
			
			Date dataViagemInicio = null;
			Date dataViagemFim = null;
			if(StringUtils.isNotBlank(params.getDataViagemInicio())) {
				dataViagemInicio = DateUtil.inicioFecha(DateUtil.getDateFromString(params.getDataViagemInicio(), "dd/MM/yyyy"));
			}
			
			if(StringUtils.isNotBlank(params.getDataViagemFim())) {
				dataViagemFim = DateUtil.inicioFecha(DateUtil.getDateFromString(params.getDataViagemFim(), "dd/MM/yyyy"));
			}
			
			List<Pricing> pricings = new ArrayList<Pricing>();
			pricings.addAll(service.buscar(params.getPricingId(), params.getNomepricing(), params.getEmpresaId(),
					dataViagemInicio, dataViagemFim, params.getOrigemId(), params.getDestinoId()));
			
			pricingRetorno.setPricings(pricings);
			return Response.ok(pricingRetorno, MediaType.APPLICATION_JSON + Constantes.CHARSET_UTF8).build();
		} catch (Exception e) {
			log.error(e.getMessage(), e);
			return Response.noContent().build();
		}
	}
	
//	@POST
//	@Consumes({ MediaType.APPLICATION_JSON })
//	@Produces({ MediaType.APPLICATION_JSON })
//	@Path("alterarPricing")
	public Response alterarPricing(ParamsAlterarPricing params) {
		String retorno = "Tipo Operação não identificada";
		AlteraPricingService service = (AlteraPricingService) AppContext.getApplicationContext().getBean("alteraPricingService");
		
		if(isUsuarioValido()) {
			if(params != null && params.getPricings() != null) {
				for (Pricing pricing : params.getPricings()) {
					if(PricingOperacaoWS.INCLUIR.toString().equals(pricing.getPricingoperacao())) {
						retorno = service.incluir(pricing);
					} else if(PricingOperacaoWS.ALTERAR.toString().equals(pricing.getPricingoperacao())) {
						retorno = service.alterar(pricing);
					} else if(PricingOperacaoWS.EXCLUIR.toString().equals(pricing.getPricingoperacao())) {
						retorno = service.excluir(pricing);
					} else if(PricingOperacaoWS.INATIVAR.toString().equals(pricing.getPricingoperacao())) {
						retorno = service.inativar(pricing);
					}
				}
			}
		} else {
			retorno = "Usuário da operação não identificado ou inválido";
		}
		
		return Response.ok(retorno, MediaType.APPLICATION_JSON + Constantes.CHARSET_UTF8).build();
	}
	
//	@POST
//	@Consumes({ MediaType.APPLICATION_JSON })
//	@Produces({ MediaType.APPLICATION_JSON })
//	@Path("excluirPricingDiasFimViagem")
	public Response excluirPricingDiasFimViagem(ParamsAlterarPricing params) {
		String retorno = "Dias Fim Viagem informado é inválido.";
		if(isUsuarioValido()) {
			if(params.getDiasFimViagem() != null || params.getDiasFimViagem() > 0) {
				AlteraPricingService service = (AlteraPricingService) AppContext.getApplicationContext().getBean("alteraPricingService");
				retorno = service.excluir(params.getDiasFimViagem());
			}
		} else {
			retorno = "Usuário da operação não identificado ou inválido";
		}
		return Response.ok(retorno, MediaType.APPLICATION_JSON + Constantes.CHARSET_UTF8).build();
	}
	
	private boolean isUsuarioValido() {
		return UsuarioLogado.getUsuarioLogado() != null;
	}
	
}
