package com.rjconsultores.ventaboletos.rest;

import java.util.HashMap;

import org.apache.commons.lang.WordUtils;
import org.apache.http.HttpStatus;
import org.apache.http.entity.ContentType;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import com.google.gson.Gson;
import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.enums.TipoEnvioRest;
import com.rjconsultores.ventaboletos.rest.generic.GenericRest;
import com.rjconsultores.ventaboletos.rest.generic.RetornoGenericRest;
import com.rjconsultores.ventaboletos.vo.mercadopago.PosVO;
import com.rjconsultores.ventaboletos.vo.mercadopago.RetornoErro;
import com.rjconsultores.ventaboletos.vo.mercadopago.RetornoPosVO;
import com.rjconsultores.ventaboletos.vo.mercadopago.RetornoStoreVO;
import com.rjconsultores.ventaboletos.vo.mercadopago.StoreVO;
import com.rjconsultores.ventaboletos.vo.mercadopago.StoreVO.Location;

public class MercadoPagoService {

	private static final Logger log = LogManager.getLogger(MercadoPagoService.class);

	private static MercadoPagoService instance;

	private MercadoPagoService() {
	}

	public static synchronized MercadoPagoService getInstance() {
		if (instance == null) {
			instance = new MercadoPagoService();
		}
		return instance;
	}

	public Object cadastrarStoreMercadoPago(Empresa empresa, String nomeStore, String idStoreMercadoPago,
			String userIdMercadoPago, String urlApiMercadoPago, String tokenMercadoPago) {

		try {
			StoreVO consulta = new StoreVO();

			consulta.setName(nomeStore);
			consulta.setExternal_id(idStoreMercadoPago);

			Location item = new Location();
			item.setStreet_number(empresa.getNumero());
			item.setStreet_name(empresa.getLogradouro());
			item.setCity_name(WordUtils.capitalize(empresa.getCidade().getNombciudad().toLowerCase()));
			item.setState_name(WordUtils.capitalize(empresa.getCidade().getEstado().getNombestado().toLowerCase()));
			item.setLatitude(empresa.getLatitude());
			item.setLongitude(empresa.getLongitude());
			item.setReference(empresa.getComplemento());

			consulta.setLocation(item);

			HashMap<String, String> headers = new HashMap<String, String>();
			headers.put("Authorization", "Bearer " + tokenMercadoPago);
			headers.put("Accept", "application/json");
			headers.put("Content-type", "application/json");

			String userId = userIdMercadoPago;

			RetornoGenericRest<?> resposta = GenericRest.getInstance().fazerChamada(
					urlApiMercadoPago + "/users/" + userId + "/stores", TipoEnvioRest.POST,
					new Gson().toJson(consulta).toString(), ContentType.APPLICATION_JSON, headers, StoreVO.class,
					Object.class);

			if (resposta != null && (resposta.getStatusResposta().equals(HttpStatus.SC_OK)
					|| resposta.getStatusResposta().equals(HttpStatus.SC_CREATED))) {
				return (StoreVO) resposta.getConteudo();
			} else {
				return resposta.getConteudoErro();
			}

		} catch (Exception e) {
			log.error("erro ao enviar requisicao ", e);
		}

		return null;
	}

	public Object cadastrarPOSMercadoPago(String nomePOS, StoreVO storeVO, String idPOSMercadoPago,
			String urlApiMercadoPago, String tokenMercadoPago) {

		try {
			PosVO consulta = new PosVO();

			consulta.setName(nomePOS);
			consulta.setFixed_amount(false);

			if (storeVO != null) {
				consulta.setStore_id(storeVO.getId());
				consulta.setExternal_store_id(storeVO.getExternal_id());
			}

			consulta.setExternal_id(idPOSMercadoPago);
			consulta.setCategory(5611203);

			HashMap<String, String> headers = new HashMap<String, String>();
			headers.put("Authorization", "Bearer " + tokenMercadoPago);
			headers.put("Accept", "application/json");
			headers.put("Content-type", "application/json");

			RetornoGenericRest<?> resposta = GenericRest.getInstance().fazerChamada(urlApiMercadoPago + "/pos",
					TipoEnvioRest.POST, new Gson().toJson(consulta).toString(), ContentType.APPLICATION_JSON, headers,
					PosVO.class, RetornoErro.class);

			if (resposta != null && (resposta.getStatusResposta().equals(HttpStatus.SC_OK)
					|| resposta.getStatusResposta().equals(HttpStatus.SC_CREATED))) {
				return (PosVO) resposta.getConteudo();
			} else {
				return resposta.getConteudoErro();
			}

		} catch (Exception e) {
			log.error("erro ao enviar requisicao ", e);
		}

		return null;
	}

	public RetornoStoreVO retornarStoreMercadoPago(String userIdMercadoPago, String urlApiMercadoPago,
			String tokenMercadoPago) {

		try {

			HashMap<String, String> headers = new HashMap<String, String>();
			headers.put("Authorization", "Bearer " + tokenMercadoPago);
			headers.put("Accept", "application/json");
			headers.put("Content-type", "application/json");

			String userId = userIdMercadoPago;

			RetornoGenericRest<?> resposta = GenericRest.getInstance().fazerChamada(
					urlApiMercadoPago + "/users/" + userId + "/stores/search", TipoEnvioRest.GET, null,
					ContentType.APPLICATION_JSON, headers, RetornoStoreVO.class, RetornoErro.class);

			if (resposta != null && (resposta.getStatusResposta().equals(HttpStatus.SC_OK)
					|| resposta.getStatusResposta().equals(HttpStatus.SC_CREATED))) {
				return (RetornoStoreVO) resposta.getConteudo();
			}

		} catch (Exception e) {
			log.error("erro ao enviar requisicao ", e);
		}

		return null;
	}

	public RetornoPosVO retornarPosMercadoPago(String urlApiMercadoPago, String tokenMercadoPago) {

		try {

			HashMap<String, String> headers = new HashMap<String, String>();
			headers.put("Authorization", "Bearer " + tokenMercadoPago);
			headers.put("Accept", "application/json");
			headers.put("Content-type", "application/json");

			RetornoGenericRest<?> resposta = GenericRest.getInstance().fazerChamada(urlApiMercadoPago + "/pos",
					TipoEnvioRest.GET, null, ContentType.APPLICATION_JSON, headers, RetornoPosVO.class,
					RetornoErro.class);

			if (resposta != null && (resposta.getStatusResposta().equals(HttpStatus.SC_OK)
					|| resposta.getStatusResposta().equals(HttpStatus.SC_CREATED))) {
				return (RetornoPosVO) resposta.getConteudo();
			}

		} catch (Exception e) {
			log.error("erro ao enviar requisicao ", e);
		}

		return null;
	}

}
