﻿/*
 *
 *  * 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 Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;

namespace Usergrid.Notifications.Client
{
    public class EntityResponse : JObject
    {
        private HttpResponseMessage response;

        private EntityResponse(HttpResponseMessage response, JObject jObject)
            : base()
        {
            this.response = response;
            parseResponse(jObject);
        }

        private void parseResponse(JObject jobject)
        {
            foreach (var kv in jobject)
            {
                this[kv.Key] = kv.Value;
            }
        }

        public HttpStatusCode Status
        {
            get { return this.response.StatusCode; }
        }

        public static async Task<EntityResponse> Parse(HttpResponseMessage httpResponseMessage)
        {
            JObject jobject;
            
            using (var stream = await httpResponseMessage.Content.ReadAsStreamAsync())
            {
                using (var reader = new StreamReader(stream, Encoding.UTF8))
                {
                    jobject = JObject.Parse(reader.ReadToEnd());
                }
            }
            
            return new EntityResponse(httpResponseMessage, jobject); 
        }

        public bool StatusIsOk
        {
            get
            {
                return this.Status == HttpStatusCode.OK;
            }
        }
    }
}
