using System;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using Acumatica.RESTClient.Client;
namespace uri_import.AClasses
{

    public class RestService : IDisposable
    {
        private readonly HttpClient _httpClient;
        private readonly string _acumaticaBaseUrl;

        public RestService(string acumaticaBaseUrl)
        {
            _acumaticaBaseUrl = acumaticaBaseUrl;
            _httpClient = new HttpClient(new HttpClientHandler
            {
                UseCookies = true,
                CookieContainer = new System.Net.CookieContainer()
            })
            {
                BaseAddress = new Uri(acumaticaBaseUrl + "/entity/Default/20_200_001/"),
                DefaultRequestHeaders = { Accept = { MediaTypeWithQualityHeaderValue.Parse("text/json") } }
            };

        }

        public RestService(string acumaticaBaseUrl, string userName, string password, string tenant, string locale)
        {
            _acumaticaBaseUrl = acumaticaBaseUrl;
            _httpClient = new HttpClient(new HttpClientHandler
            {
                UseCookies = true,
                CookieContainer = new System.Net.CookieContainer()
            })
            {
                BaseAddress = new Uri(acumaticaBaseUrl + "/entity/Default/20_200_001/"),
                DefaultRequestHeaders = { Accept = { MediaTypeWithQualityHeaderValue.Parse("text/json") } }
            };
            _httpClient.PostAsJsonAsync(acumaticaBaseUrl + "/entity/auth/login", new
            {
                name = userName,
                password = password,
                tenant = tenant,
                locale = locale
            }).Result
            .EnsureSuccessStatusCode();
        }

        public string PutFile(string acumaticaBaseUrl, string entityName, string keys, string fileName, System.IO.Stream file)
        {
            string endPoint = string.Format("{0}/{1}/{2}/{3}/files/{4}", acumaticaBaseUrl, "/entity/Default/20.200.001/", entityName, keys, fileName);// +"/entity/Default/20.200.001/" + entityName + "/" + keys + "/files/" + fileName;
            var res = _httpClient.PutAsync(endPoint, new StreamContent(file)).Result.EnsureSuccessStatusCode();
            return res.Content.ReadAsStringAsync().Result;
        }

        void IDisposable.Dispose()
        {
            _httpClient.PostAsync(_acumaticaBaseUrl + "/entity/auth/logout",
                new ByteArrayContent(new byte[0])).Wait();
            _httpClient.Dispose();
        }
    }
}