using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.Configuration;

using com.amazon.webservices;

public partial class AsynchronousAmazonBookControl : System.Web.UI.UserControl
{
   private string _isbn = "";

   /// <summary>
   /// Jeśli kontrolka jest wczytywana po raz pierwszy, załaduj dane i ukryj panel z recenzjami
   /// </summary>
   protected void Page_Load(object sender, EventArgs e)
   {
      if (!IsPostBack)
      {
         lnkReviews.Text = "Pokaż recenzje";
         panReviews.Visible = false;
         RefreshControlFromAmazon();
      }
   }

   /// <summary>
   /// Wczytuje kontrolkę z danymi o książce określonej numerem isbn
   /// </summary>
   public void RefreshControlFromAmazon()
   {
      try
      {
         // utwórz klasę pośredniczącą usługi web Amazon
         AWSECommerceService ecs = new AWSECommerceService(); 

         // Utwórz obiekt szukania elementu w witrynie Amazon
         ItemLookup itemLookup = new ItemLookup();
         // Zapełnij klucz dostępu do witryny Amazon na podstawie pliku Web.config
         itemLookup.AWSAccessKeyId = WebConfigurationManager.AppSettings["AWSaccessKey"];

         // Utwórz obiekt żądania szukania elementu w witrynie Amazon i zapełnij go
         ItemLookupRequest amazonRequest = new ItemLookupRequest();
         // Określ, jaki rodzaj informacji chcesz uzyskać
         amazonRequest.ResponseGroup = new string[] { "ItemAttributes", "Reviews", "Images" };
         // określ numer isbn szukanego elementu
         amazonRequest.ItemId = new string[] { ISBN };
         amazonRequest.IdType = ItemLookupRequestIdType.ASIN;
         amazonRequest.IdTypeSpecified = true;

         // Dodaj żądanie do poszukiwania
         itemLookup.Request = new ItemLookupRequest[] { amazonRequest };

         if (this.Page.IsAsync)
         {
            ecs.ItemLookupCompleted += new ItemLookupCompletedEventHandler(ItemLookupCompleted);
            ecs.ItemLookupAsync(itemLookup);
         }
         else
         {
            // Wykonaj poszukiwanie i pobierz obiekt z odpowiedzią
            ItemLookupResponse amazonResponse = ecs.ItemLookup(itemLookup);
            ProcessAmazonData(amazonResponse);
         }

      }
      catch (Exception ex)
      {
         labError.Text = ex.Message;
         return;
      }
   }

   void ItemLookupCompleted(object sender, ItemLookupCompletedEventArgs e)
   {
      ItemLookupResponse amazonResponse = e.Result;
      ProcessAmazonData(amazonResponse);
   }


   private void ProcessAmazonData(ItemLookupResponse amazonResponse)
   {
      // Jeśli obiekt z odpowiedzią jest pusty, wyświetl komunikat o błędzie i wyjdź
      if (amazonResponse == null)
      {
         labError.Text = "Błąd Amazona - nie uzyskano odpowiedzi!";
         return;
      }

      // Teraz przeszukaj model obiektu w celu odnalezienia
      // obiektu z odpowiedzią, aby uzyskać dane o książce
      Items[] itemsArray = amazonResponse.Items;

      // Sprawdź, czy wystąpiły błędy i jeśli tak, zatrzymaj się
      if (itemsArray == null)
      {
         labError.Text = "Błąd Amazona - pusta odpowiedź!";
         return;
      }
      if (itemsArray[0].Request.Errors != null)
      {
         labError.Text = itemsArray[0].Request.Errors[0].Message;
         return;
      }

      // Na koniec można pobrać uzyskane dane o książce
      Item book = amazonResponse.Items[0].Item[0];
      if (book != null)
      {
         // Skonfiguruj kontrolki w oparciu o dane o książce
         imgBook.ImageUrl = book.MediumImage.URL;
         hypTitle.Text = book.ItemAttributes.Title;
         hypTitle.NavigateUrl = book.DetailPageURL;

         // Powiąż kontrolkę Repeater z tablicą recenzji (jeżeli recenzje istnieją)
         CustomerReviews customerReviews = book.CustomerReviews;
         if (customerReviews != null)
         {
            Review[] reviewArray = customerReviews.Review;
            rptReviews.DataSource = reviewArray;
            rptReviews.DataBind();
         }
      }
   }

   /// <summary>
   /// Określa szukany numer isbn
   /// </summary>
   public string ISBN
   {
      get { return _isbn; }
      set { _isbn = value; }
   }

   /// <summary>
   /// Funkcja obsługi przycisku wyświetlającego i ukrywającego recenzje
   /// </summary>
   protected void lnkReviews_Click(object sender, EventArgs e)
   {
      if (lnkReviews.Text == "Pokaż recenzje")
      {
         panReviews.Visible = true;
         lnkReviews.Text = "Ukryj recenzje";
      }
      else
      {
         panReviews.Visible = false;
         lnkReviews.Text = "Pokaż recenzje";
      }

   }
}
