using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using System.Web.Script.Serialization;

namespace DiversDemos {

  class ProduitDeListe {
    public int ProductId { get; set; }
    public string ProductName { get; set; }
  }

  class ProduitDetaillé {
    public int ProductID { get; set; }
    public string ProductName { get; set; }
    public string CategoryName { get; set; }
    public string Description { get; set; }
    public decimal? UnitPrice { get; set; }
    public short? UnitsInStock { get; set; }
  }

  class ExempleProductsWebApiClientDotNet : IDisposable {
    private JavaScriptSerializer Serialiseur; // Référencer System.Web.Extensions
    private HttpClient Client;
    public ExempleProductsWebApiClientDotNet() {
      Serialiseur = new JavaScriptSerializer();
      Client = new HttpClient();
      Client.BaseAddress = new Uri( "http://localhost:52599/api/ExempleProductsWebApi/" );
      Client.DefaultRequestHeaders.Accept.Clear();
      Client.DefaultRequestHeaders.Accept.Add( new MediaTypeWithQualityHeaderValue( "application/json" ) );
    }
    public IList<ProduitDeListe> ListerProduits() {
      HttpResponseMessage reponse = Client.GetAsync( string.Empty ).Result;
      reponse.EnsureSuccessStatusCode();
      string chaineJson = reponse.Content.ReadAsStringAsync().Result;
      return Serialiseur.Deserialize<List<ProduitDeListe>>( chaineJson );
    }
    public ProduitDetaillé LireProduit( int id ) {
      var json = Client.GetStringAsync( id.ToString() ).Result;
      return Serialiseur.Deserialize<ProduitDetaillé>( json );
    }
    public Uri AjouterProduit( ProduitDeListe p ) {
      string json = Serialiseur.Serialize( p );
      var reponse = Client.PostAsync( string.Empty, new StringContent( json, Encoding.UTF8, "application/json" ) ).Result;
      reponse.EnsureSuccessStatusCode();
      var produitRetourné = Serialiseur.Deserialize<ProduitDeListe>( reponse.Content.ReadAsStringAsync().Result );
      p.ProductId = produitRetourné.ProductId;
      return reponse.Headers.Location;
    }
    public void Dispose() {
      Client.Dispose();
    }
  }
}
