package org.magic.api.pricers.impl;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Currency;
import java.util.List;

import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.magic.api.beans.MagicCard;
import org.magic.api.beans.MagicEdition;
import org.magic.api.beans.MagicPrice;
import org.magic.api.interfaces.abstracts.AbstractMagicPricesProvider;
import org.magic.tools.RequestBuilder;
import org.magic.tools.RequestBuilder.METHOD;
import org.magic.tools.URLTools;
import org.magic.tools.URLToolsClient;

import com.google.gson.JsonElement;
import com.google.gson.JsonObject;

public class MypCardPricer extends AbstractMagicPricesProvider {

	
	private static final String BASE_URL="https://mypcards.com";
	private URLToolsClient client;
	
	
	@Override
	public STATUT getStatut() {
		return STATUT.BETA;
	}
	
	@Override
	public String getName() {
		return "Mypcards";
	}

	@Override
	protected List<MagicPrice> getLocalePrice(MagicEdition me, MagicCard card) throws IOException {

		List<MagicPrice> list = new ArrayList<>();
		
		String set = card.getCurrentSet().getId();
		
		if(me!=null)
			set=me.getId();
		
		
		if(client==null)
			client=URLTools.newClient();
		
		
		String url=BASE_URL+"/produto/search";
		JsonElement e = RequestBuilder.build().url(url).setClient(client).method(METHOD.GET).addContent("term",card.getName()).toJson();
		JsonObject o = null;
		
		try{
			o=e.getAsJsonArray().get(0).getAsJsonObject();
		}catch(Exception ex)
		{
			logger.error("error getting " +card + " at " + url,ex);
			return new ArrayList<>();
		}
		
		int qtyVariation = o.get("qtd").getAsInt();
		
		if(qtyVariation==1)
		{
			parsingOffers(BASE_URL + "/produto/"+o.get("idproduto").getAsInt()+"/"+o.get("slugnomeptproduto").getAsString(),list);
		}
		else
		{
			Elements divs = RequestBuilder.build().method(METHOD.GET).url(BASE_URL + "/magic").setClient(client).addContent("ProdutoSearch[query]", card.getName()).toHtml().select("div.card");
			
			for(Element div : divs)
			{
				if(div.select("a div").toString().contains("magic_"+set.toLowerCase()+"_"))
				{
					String urlC = BASE_URL +div.select("a").attr("href");
					parsingOffers(urlC, list);
					return list;
				}
			}
		}
		return list;
	}
	
	private void parsingOffers(String urlC, List<MagicPrice> list) throws IOException {
		Elements trs = URLTools.extractHtml(urlC).select("table.table tr[data-key]");
		for(Element tr : trs)
		{
			Elements tds = tr.select("td");
			if(tds.isEmpty())
			{
				logger.debug(getName() + " found no offer");
				return;
			}
			
			MagicPrice mp = new MagicPrice();
				mp.setCountry("Brazil");
				mp.setCurrency(Currency.getInstance("BRL"));
				mp.setSite(getName());
				mp.setSeller(tds.get(1).text());
				mp.setFoil(tds.get(2).html().equalsIgnoreCase("foil"));
				mp.setQuality(tds.get(3).html());
				mp.setValue(Double.parseDouble(tds.get(5).text().replaceAll("R\\$ ", "").replace(",", ".")));
				mp.setUrl(urlC);
				list.add(mp);
		}
		logger.debug(getName() + " found " + list.size() + " offers");
	}
	

}