package br.com.caelum.stella.frete;
import java.io.IOException;
import java.io.StringReader;
import java.util.Properties;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import br.com.caelum.stella.frete.entity.Encomenda;
import br.com.caelum.stella.frete.entity.Frete;
import br.com.caelum.stella.frete.enums.Servico;
import br.com.caelum.stella.frete.exception.CorreiosException;
import br.com.caelum.stella.frete.ws.CorreiosService;
public class CalculoFreteCorreio {
public static Frete calcularFrete( Encomenda encomenda, Servico tipoFrete) throws CorreiosException {
Properties parameters = new Properties();
parameters.setProperty("nCdEmpresa", encomenda.getCodigoEmpresa());
parameters.setProperty("sDsSenha", encomenda.getSenha());
parameters.setProperty("nCdServico", tipoFrete.toString());
parameters.setProperty("sCepOrigem", encomenda.getCepOrigem());
parameters.setProperty("sCepDestino", encomenda.getCepDestino());
parameters.setProperty("nVlPeso", encomenda.getPeso());
parameters.setProperty("nCdFormato", encomenda.getFormato().toString());
parameters.setProperty("nVlComprimento", encomenda.getComprimento());
parameters.setProperty("nVlAltura", encomenda.getAltura());
parameters.setProperty("nVlLargura", encomenda.getLargura());
parameters.setProperty("nVlDiametro", encomenda.getDiametro());
parameters.setProperty("sCdMaoPropria", encomenda.getMaoPropria());
parameters.setProperty("nVlValorDeclarado", encomenda.getValorDeclarado());
parameters.setProperty("sCdAvisoRecebimento", encomenda.getAvisoRecebimento());
parameters.setProperty("StrRetorno", "xml");
InputSource is = new InputSource();
DocumentBuilder db;
Document doc = null;
try {
db = DocumentBuilderFactory.newInstance().newDocumentBuilder();
is.setCharacterStream(new StringReader(CorreiosService.sendRequest(parameters)));
doc = db.parse(is);
Node servicos = doc.getFirstChild();
JAXBContext jc = JAXBContext.newInstance(Frete.class);
Unmarshaller u = jc.createUnmarshaller();
Frete frete = u.unmarshal( servicos.getFirstChild(), Frete.class).getValue();
if (frete.getErro()!= 0){
throw new CorreiosException(frete.getErro(), frete.getMensagemErro());
}
return frete;
} catch (JAXBException e) {
e.printStackTrace();
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}