using System;
using System.Threading.Tasks;
using RestSharp;
using HorseRacingPredictor.Football.Database;
using HorseRacingPredictor.Football.API;
using League = HorseRacingPredictor.Football.API.League;
using Fixture = HorseRacingPredictor.Football.API.Fixture;

namespace HorseRacingPredictor.Football.Manager
{
    internal class API : HorseRacingPredictor.Manager.API
    {
        // Configurazione dell'API
        protected const string ApiKey = "f3795ccef056c5478d316162517d9970";
        protected const string KeyHeader = "x-rapidapi-key";
        protected const string HostHeader = "x-rapidapi-host";
        protected const string HostValue = "v3.football.api-sports.io";
        protected const string BaseUrl = "https://v3.football.api-sports.io";

        // Repository per le risposte API
        private readonly APIResponse _apiResponseRepository;

        // Costruttore
        public API()
        {
            _apiResponseRepository = new APIResponse();
        }

        // Tipi di API per il salvataggio nel database
        public static class ApiTypes
        {
            public const string Fixtures = "FootballFixtures";
            public const string Odds = "FootballOdds";
            public const string Predictions = "FootballPredictions";
            public const string Leagues = "FootballLeagues";
            public const string Teams = "FootballTeams";
        }

        /// <summary>
        /// Esegue una richiesta API, salva la risposta nel database e restituisce la risposta
        /// </summary>
        protected RestResponse ExecuteRequest(string endpoint, string apiType = null, string parameters = null)
        {
            string url = $"{BaseUrl}/{endpoint}";
            var response = ExecuteApiRequest(url, ApiKey, KeyHeader, HostHeader, HostValue);

            // Salva la risposta su file per debug (non bloccare in caso di errore)
            try
            {
                SaveResponseToFile(url, response.Content, "FootballApiResponses");
            }
            catch (Exception ex)
            {
                Console.WriteLine($"Avviso: impossibile salvare risposta su file: {ex.Message}");
            }

            // Salva la risposta nel database (non bloccare in caso di errore)
            if (apiType != null)
            {
                try
                {
                    _apiResponseRepository.InsertApiResponse(apiType, endpoint, parameters, response);
                }
                catch (Exception ex)
                {
                    Console.WriteLine($"Avviso: impossibile salvare risposta nel database: {ex.Message}");
                }
            }

            return response;
        }

        /// <summary>
        /// Versione asincrona di ExecuteRequest
        /// </summary>
        protected async Task<RestResponse> ExecuteRequestAsync(string endpoint, string apiType = null, string parameters = null)
        {
            string url = $"{BaseUrl}/{endpoint}";
            var response = await ExecuteApiRequestAsync(url, ApiKey, KeyHeader, HostHeader, HostValue);

            // Salva la risposta su file per debug (non bloccare in caso di errore)
            try
            {
                SaveResponseToFile(url, response.Content, "FootballApiResponses");
            }
            catch (Exception ex)
            {
                Console.WriteLine($"Avviso: impossibile salvare risposta su file: {ex.Message}");
            }

            // Salva la risposta nel database (non bloccare in caso di errore)
            if (apiType != null)
            {
                try
                {
                    _apiResponseRepository.InsertApiResponse(apiType, endpoint, parameters, response);
                }
                catch (Exception ex)
                {
                    Console.WriteLine($"Avviso: impossibile salvare risposta nel database: {ex.Message}");
                }
            }

            return response;
        }

        #region Leagues

        /// <summary>
        /// Ottiene informazioni sui campionati
        /// </summary>
        public RestResponse GetLeagues()
        {
            return new League().GetLeagues();
        }

        /// <summary>
        /// Versione asincrona di GetLeagues
        /// </summary>
        public async Task<RestResponse> GetLeaguesAsync()
        {
            return await new League().GetLeaguesAsync();
        }

        /// <summary>
        /// Ottiene informazioni su una specifica stagione di una lega
        /// </summary>
        public RestResponse GetLeagueBySeason(int leagueId, int season)
        {
            return new League().GetLeagueBySeason(leagueId, season);
        }

        #endregion

        #region Fixtures

        /// <summary>
        /// Ottiene le partite per una data specifica
        /// </summary>
        public RestResponse GetFixturesByDate(DateTime date)
        {
            return new Fixture().GetFixturesByDate(date);
        }

        /// <summary>
        /// Versione asincrona di GetFixturesByDate
        /// </summary>
        public async Task<RestResponse> GetFixturesByDateAsync(DateTime date)
        {
            return await new Fixture().GetFixturesByDateAsync(date);
        }

        /// <summary>
        /// Ottiene le partite per un ID specifico
        /// </summary>
        public RestResponse GetFixtureById(int fixtureId)
        {
            return new Fixture().GetFixtureById(fixtureId);
        }

        #endregion
    }
}
