using System.Net;
using System.Text.Json;

/// <summary>
/// Servizio per interagire con l'API OMDB.
/// Semplifica le richieste per ottenere dettagli sui film.
/// </summary>
class OmdbService
{
    private readonly string url;
    private readonly HttpClient httpClient = new();

    public OmdbService()
    {
        var apiKey = File.ReadAllText("APIKey.txt").Trim();
        apiKey = WebUtility.UrlEncode(apiKey);

        url = "http://www.omdbapi.com/?apikey=" + apiKey
            + "&type=movie"
            + "&r=json";
    }

    /// <summary>
    /// Recupera i dettagli di un film dato il suo ID IMDB.
    /// </summary>
    /// <param name="id">ID IMDB del film da cercare.</param>
    /// <returns>Un oggetto Movie con i dettagli del film.</returns>
    public async Task<Movie?> FetchMovieDetail(string id)
    {
        return await FetchAsync<Movie>("i", id);
    }


    /// <summary>
    /// Recupera una lista di film che corrispondono al titolo di ricerca.
    /// </summary>
    /// <param name="searchTitle">Titolo dei film da cercare.</param>
    /// <returns>>Una lista di oggetti Movie che corrispondono alla ricerca.</returns>
    public async Task<MovieSearch?> FetchMovies(string searchTitle)
    {
        return await FetchAsync<MovieSearch>("s", searchTitle);
    }

    /// <summary>
    /// Esegue una richiesta HTTP GET e deserializza la risposta JSON in un oggetto del tipo specificato.
    /// </summary>
    /// <typeparam name="T">Tipo dell'oggetto di ritorno.</typeparam>
    /// <param name="query">Parametro della query HTTP.</param>
    /// <param name="value">Valore del parametro della query HTTP.</param>
    /// <returns>Un oggetto del tipo specificato deserializzato dalla risposta JSON.</returns>
    private async Task<T?> FetchAsync<T>(string query, string value)
    {
        var requestUrl = url + "&" + query + "=" + WebUtility.UrlEncode(value);
        var response = await httpClient.GetStringAsync(requestUrl);
        try {
            return JsonSerializer.Deserialize<T>(response)!;
        } catch (JsonException) {
            return default;
        }
    }
}