open System
open System.Net.Http
open Newtonsoft.Json

// Definicja typów reprezentujących strukturę danych z API NBP
type KursyWalut =
    { table: string
      no: string
      effectiveDate: string
      rates: Waluta list }
and Waluta =
    { currency: string
      code: string
      mid: decimal }

// Adres URL do API NBP z danymi o kursach walut na dzień dzisiejszy
let apiUrl = "http://api.nbp.pl/api/exchangerates/tables/a/today/"

// Funkcja do pobierania kursów walut z API NBP
let pobierzKursyWalut () =
    async {
        use client = new HttpClient()
        try
            // Wysyłanie żądania GET do API NBP
            let! response = client.GetAsync(apiUrl) |> Async.AwaitTask
            // Odczytanie zawartości odpowiedzi (JSON) i deserializacja do struktury danych
            let! content = response.Content.ReadAsStringAsync() |> Async.AwaitTask
            return Some (JsonConvert.DeserializeObject<KursyWalut list>(content))
        with
        | ex ->
            // Obsługa błędów, jeśli wystąpią
            printfn "Wystąpił błąd: %s" ex.Message
            return None
    }

// Funkcja do wyświetlania kursów walut w konsoli
let wyswietlKursy (kursy: KursyWalut list) =
    kursy
    |> List.iter (fun kursyWalut ->
        printfn "Tabela: %s, Nr: %s, Data: %s" kursyWalut.table kursyWalut.no kursyWalut.effectiveDate
        // Iteracja przez listę kursów i wyświetlanie informacji o każdej walucie
        kursyWalut.rates
        |> List.iter (fun waluta ->
            printfn "Waluta: %s, Kod: %s, Kurs średni: %f" waluta.currency waluta.code waluta.mid))

// Funkcja główna programu
[<EntryPoint>]
let main argv =
    async {
        // Wywołanie funkcji pobierającej kursy walut
        let! wynik = pobierzKursyWalut ()
        // Sprawdzenie wyniku i wywołanie funkcji wyświetlającej kursy
        match wynik with
        | Some kursy -> wyswietlKursy kursy
        | None -> printfn "Brak danych o kursach walut."
    } |> Async.RunSynchronously

    0 // Zwraca kod zakończenia programu
