﻿/*
 *
 *  * Licensed to the Apache Software Foundation (ASF) under one or more
 *  *  contributor license agreements.  The ASF licenses this file to You
 *  * under the Apache License, Version 2.0 (the "License"); you may not
 *  * use this file except in compliance with the License.
 *  * You may obtain a copy of the License at
 *  *
 *  *     http://www.apache.org/licenses/LICENSE-2.0
 *  *
 *  * Unless required by applicable law or agreed to in writing, software
 *  * distributed under the License is distributed on an "AS IS" BASIS,
 *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  * See the License for the specific language governing permissions and
 *  * limitations under the License.  For additional information regarding
 *  * copyright in this work, please see the NOTICE file in the top level
 *  * directory of this distribution.
 *
 */

using System;
using System.Threading.Tasks;
using System.Net;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json;
using System.Net.Http;
using System.Net.Http.Headers;

namespace Usergrid.Notifications.Client
{
 
    /// <summary>
    /// Usergrid client 
    /// </summary>

    public class Usergrid : IUsergridHttpClient, IUsergridClient
    {
        private string appUrl;
        private string token;
        private HttpClient client;
        private IPushClient push;
        private string managementUrl;

        /// <summary>
        /// Constructor
        /// </summary>
        /// <param name="serverUrl"></param>
        /// <param name="org"></param>
        /// <param name="app"></param>
        /// <param name="channel"></param>
        internal Usergrid(string serverUrl, string org, string app, string userId, string password,string notifier)
        {
            string serverUrlWithSlash = serverUrl.EndsWith("/", StringComparison.CurrentCulture) ? serverUrl : serverUrl + "/";
            this.appUrl = String.Format("{0}{1}/{2}/", serverUrlWithSlash, org, app);
            this.managementUrl = serverUrlWithSlash + "management/";
            this.client = new HttpClient();
            Authenticate(userId, password, false).ContinueWith(task => {
                this.push = new PushClient(this, userId, notifier);
            });
        }

        public async Task Authenticate(string user, string password, bool isManagement)
        {
            var jsonObject = new JObject();
            jsonObject.Add("username", user);
            jsonObject.Add("password", password);
            jsonObject.Add("grant_type", "password");
           
            var response = await SendAsync(HttpMethod.Post,"token", jsonObject, isManagement);

            if (response.StatusIsOk)
            {
                this.token = response.GetValue("access_token").Value<String>();
                client.DefaultRequestHeaders.Add("Authorization", "Bearer "+ token);
            }
            else
            {
                throw new Exception("Authentication failed: "+response.ToString());
            }
        }

        private async Task<EntityResponse> GetJsonResponse(HttpResponseMessage response)
        {
            return  await EntityResponse.Parse(response);
        }

        public async Task<EntityResponse> SendAsync(HttpMethod method, string url, object obj)
        {
            return await SendAsync(method, url, obj, false);
        }

        public async Task<EntityResponse> SendAsync(HttpMethod method, string url, object obj, bool useManagementUrl)
        {
            HttpRequestMessage message = new HttpRequestMessage(method, (useManagementUrl ? this.managementUrl : this.appUrl) + url);
            if (obj != null)
            {
                message.Content = getJsonBody(obj);
            }
            message.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue( "application/json"));
            var response = await this.client.SendAsync(message);
            return await EntityResponse.Parse(response);
        }
   
        public IPushClient Push
        {
            get { return push; }
        }

        private HttpContent getJsonBody(Object jsonObject)
        {
            return new StringContent(JsonConvert.SerializeObject(jsonObject));
        }


        public Exception LastException
        {
            get;
            set;
        }
    }

}
