package com.example.demo.waluty;

import java.io.IOException;
import java.io.InputStream;
import java.math.BigDecimal;
import java.net.URL;
import java.time.LocalDate;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;

import org.springframework.stereotype.Component;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

/* Adnotacje @Component, @Service, @Repository, a także @Controller i @RestController
 * powodują, że:
 * 1) podczas startu aplikacji Spring tworzy obiekt tej klasy (pojedynczą sztukę, czyli "singleton")
 * 2) ten obiekt będzie dostępny dla innych jako "komponent" ("bean") i będzie go wstrzykiwać
 */
@Component
public class PobieranieXML {
    
    public TabelaWalut pobierzTabele(String data) {
        String adres = "https://api.nbp.pl/api/exchangerates/tables/a";
        if(data != null) {
            adres += "/" + data;
        }
        adres += "?format=xml";
        try {
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            DocumentBuilder db = dbf.newDocumentBuilder();
            Document doc = null;
            URL url = new URL(adres);
            try (InputStream in = url.openStream()) {
                doc = db.parse(in);
            }
            
            XPathFactory xpf = XPathFactory.newInstance();
            XPath xpath = xpf.newXPath();

            // String numer = xpath.evaluate(
            // "/ArrayOfExchangeRatesTable/ExchangeRatesTable/No", doc);

            String nazwaTabeli = xpath.evaluate("//Table", doc);
            String numerTabeli = xpath.evaluate("//No", doc);
            LocalDate dataTabeli = LocalDate.parse(xpath.evaluate("//EffectiveDate", doc));

            TabelaWalut tabela = new TabelaWalut(nazwaTabeli, numerTabeli, dataTabeli);

            NodeList rates = (NodeList) xpath.evaluate("//Rate", doc, XPathConstants.NODESET);
            final int n = rates.getLength();
            for (int i = 0; i < n; i++) {
                Node rate = rates.item(i);
                String kod = xpath.evaluate("Code", rate);
                String nazwa = xpath.evaluate("Currency", rate);
                BigDecimal kurs = new BigDecimal(xpath.evaluate("Mid", rate));
                Waluta waluta = new Waluta(kod, nazwa, kurs);
                tabela.dodajWalute(waluta);
            }

            return tabela;
        } catch (ParserConfigurationException | SAXException | XPathExpressionException | IOException e) {
            e.printStackTrace();
            return null;
        }
    }
}
