using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
using RestEase;
using SharedLibraryCore.Helpers;

namespace IW4MAdmin.Application.API.Master
{
    public class AuthenticationId
    {
        [JsonProperty("id")]
        public string Id { get; set; }
    }

    public class TokenId
    {
        [JsonProperty("access_token")]
        public string AccessToken { get; set; }
    }

    public class VersionInfo
    {
        [JsonProperty("current-version-stable")]
        [JsonConverter(typeof(BuildNumberJsonConverter))]
        public BuildNumber CurrentVersionStable { get; set; }

        [JsonProperty("current-version-prerelease")]
        [JsonConverter(typeof(BuildNumberJsonConverter))]
        public BuildNumber CurrentVersionPrerelease { get; set; }
    }

    public class ResultMessage
    {
        [JsonProperty("message")]
        public string Message { get; set; }
    }

    public class Endpoint
    {
#if !DEBUG
        private static readonly IMasterApi api = RestClient.For<IMasterApi>("http://api.raidmax.org:5000");
#else
        private static readonly IMasterApi api = RestClient.For<IMasterApi>("http://127.0.0.1");
#endif
        public static IMasterApi Get() => api;
    }

    /// <summary>
    /// Defines the capabilities of the master API
    /// </summary>
    [Header("User-Agent", "IW4MAdmin-RestEase")]
    public interface IMasterApi
    {
        [Header("Authorization")]
        string AuthorizationToken { get; set; }

        [Post("authenticate")]
        Task<TokenId> Authenticate([Body] AuthenticationId Id);

        [Post("instance/")]
        [AllowAnyStatusCode]
        Task<Response<ResultMessage>> AddInstance([Body] ApiInstance instance);

        [Put("instance/{id}")]
        [AllowAnyStatusCode]
        Task<Response<ResultMessage>> UpdateInstance([Path] string id, [Body] ApiInstance instance);

        [Get("version/{apiVersion}")]
        Task<VersionInfo> GetVersion([Path] int apiVersion);

        [Get("localization")]
        Task<List<SharedLibraryCore.Localization.Layout>> GetLocalization();

        [Get("localization/{languageTag}")]
        Task<SharedLibraryCore.Localization.Layout> GetLocalization([Path("languageTag")] string languageTag);
    }
}