package waluty;

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

import jakarta.json.Json;
import jakarta.json.JsonArray;
import jakarta.json.JsonObject;
import jakarta.json.JsonReader;
import jakarta.json.JsonValue;

public class PobieranieJSON implements Pobieranie {

	private static final String ADRES = "http://api.nbp.pl/api/exchangerates/tables";

	public Tabela pobierzBiezaceKursy() {
		return pobierzJsonZAdresu(ADRES + "/a/?format=json");
	}
	
	public Tabela pobierzArchiwalneKursy(String data) {
		return pobierzJsonZAdresu(ADRES + "/a/" + data + "?format=json");
	}

	private Tabela pobierzJsonZAdresu(String adres) {
		try {
			URL url = new URL(adres);
			try(InputStream input = url.openStream()) {
				return wczytajStream(input);
			}
		} catch (IOException e) {
			e.printStackTrace();
			return null;
		}
	}

	private static Tabela wczytajStream(InputStream input) {
		try(JsonReader reader = Json.createReader(input)) {
			// dokument zawiera [tablicę], a ta tablica zawiera {obiekt}
			JsonArray array = reader.readArray();
			JsonObject tabela = array.getJsonObject(0);
			String typ = tabela.getString("table");
			String numer = tabela.getString("no");
			LocalDate data = LocalDate.parse(tabela.getString("effectiveDate"));
			JsonArray waluty = tabela.getJsonArray("rates");
			
			Tabela wynikowaTabela = new Tabela(typ, numer, data);
			for(JsonValue jsonValue : waluty) {
				JsonObject jsonObject = jsonValue.asJsonObject();
				Waluta waluta = new Waluta(jsonObject.getString("code"),
						jsonObject.getString("currency"),
						jsonObject.getJsonNumber("mid").bigDecimalValue());
				wynikowaTabela.dodajWalute(waluta);
			}
			
			return wynikowaTabela;
		}
	}
}
