using System.Collections.Generic;
using System.IO;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading;
using System.Threading.Tasks;
using InternshipSystem.Api.Options;
using Microsoft.Extensions.Options;
using Newtonsoft.Json;
using JsonConverter = System.Text.Json.Serialization.JsonConverter;

namespace InternshipSystem.Api.Controllers
{
    public class GutCasClient
    {
        private readonly HttpClient _client;
        private readonly SecurityOptions _securityOptions;

        public GutCasClient(HttpClient client, IOptions<SecurityOptions> options)
        {
            _securityOptions = options.Value;

            client.BaseAddress = _securityOptions.BaseUrl;
            _client = client;
        }

        public async Task<string> GetCasTokenAsync(string code, CancellationToken cancellationToken)
        {
            var request = new HttpRequestMessage
            {
                Method = HttpMethod.Post,
                Content = new FormUrlEncodedContent(new Dictionary<string, string>
                {
                    { "grant_type", "authorization_code" },
                    { "client_id", _securityOptions.ClientId },
                    { "client_secret", _securityOptions.Secret },
                    { "redirect_uri", _securityOptions.RedirectUrl.ToString() },
                    { "code", code }
                }),
                RequestUri = _securityOptions.TokenPath
            };

            var response = await _client.SendAsync(request, cancellationToken);
            var content = await response.Content.ReadAsStringAsync();

            var value = JsonConvert.DeserializeObject<Dictionary<string, object>>(content);

            return value["access_token"].ToString();
        }


        public async Task<CasUserData> GetProfileAsync(string token, CancellationToken cancellationToken)
        {
            var request = new HttpRequestMessage
            {
                Method = HttpMethod.Get,
                Content = new StringContent(string.Empty),
                RequestUri = _securityOptions.ProfilePath
            };
            
            request.Headers.Authorization = AuthenticationHeaderValue.Parse($"Bearer {token}");
            request.Content.Headers.ContentType = MediaTypeHeaderValue.Parse("application/json");

            var response = await _client.SendAsync(request, cancellationToken);
            var content = await response.Content.ReadAsStringAsync();

            var result = JsonConvert.DeserializeObject<CasUserProfile>(content);
                
            return result.Attributes;
        }
    }
}