package waluty.model;

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 {
	private static final String ADRES_BAZOWY = "http://api.nbp.pl/api/exchangerates/tables/";
	
	private PobieranieJSON() {
		// aby nikt nie utworzył obiektu tej klasy
	}
	
	public static Tabela pobierzAktualneKursy() throws BladPobieraniaWalut {
		return pobierzJsonZAdresu(ADRES_BAZOWY + "/a/?format=json");
	}

	public static Tabela pobierzKursyArchiwalne(String data) throws BladPobieraniaWalut {
		return pobierzJsonZAdresu(ADRES_BAZOWY + "/a/" + data + "?format=json");
	}

	public static Tabela pobierzKursyArchiwalne(LocalDate data) throws BladPobieraniaWalut {
		return pobierzKursyArchiwalne(data.toString());
	}

	private static Tabela pobierzJsonZAdresu(String adres) throws BladPobieraniaWalut {
		try {
			URL url = new URL(adres);
			try(InputStream input = url.openStream()) {
				return wczytajStream(input);
			}
		} catch (IOException e) {
			throw new BladPobieraniaWalut("Błąd pobierania tabeli", e);
		}
	}

	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 numer = tabela.getString("no");
			LocalDate data = LocalDate.parse(tabela.getString("effectiveDate"));
			JsonArray waluty = tabela.getJsonArray("rates");
			
			Tabela wynikowaTabela = new Tabela(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;
		}
	}

}
