using System;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class TreeEventHandling : System.Web.UI.Page
{
   protected void Page_Load(object sender, EventArgs e)
   {
      if (!IsPostBack)
      {
         // wypełnianie drzewa danymi
         FillTree();

         // zaczynamy od wszystkich węzłów zwiniętych
         treeMain.CollapseAll();
      }
   }

   /// <summary>
   /// Metoda pomocnicza do wypełniania drzewa danymi
   /// </summary>
   private void FillTree()
   {
      // pobranie wszystkich grup i ich przeglądanie
      string[] groups = ProductCatalog.GetGroups();
      foreach (string grp in groups)
      {
         // tworzenie węzła dla grupy
         TreeNode groupNode = new TreeNode(grp);
         // dla każdej grupy, pobranie podnaglówków i przetwarzanie ich
         string[] subheadings =
            ProductCatalog.GetSubHeadingsByGroup(grp);
         foreach (string sub in subheadings)
         {
            // tworzenie węzła dla podnagłówka
            TreeNode subheadingNode = new TreeNode(sub);

            // dla każdego podnagłówka, pobranie produktówi ich przetworzenie
            Product[] products =
                ProductCatalog.GetProductObjectsBySubHeading(sub);
            foreach (Product prod in products)
            {
               // utworzenie nowego węzła produktu w drzewie
               TreeNode productNode = new TreeNode(prod.Name);

               // ustawienie właściwości value węzła na id produktu
               productNode.Value = prod.Id.ToString();

               // dodanie węzła produktu do jego węzła rodzica
               subheadingNode.ChildNodes.Add(productNode);
            }
            // dodanie węzła podnagłówka do jego węzła rodzica
            groupNode.ChildNodes.Add(subheadingNode);
         }
         // dodanie węzła grupy do jego węzła rodzica
         treeMain.Nodes.Add(groupNode);
      }
   }

   /// <summary>
   /// Obsługuje zdarzenie wyboru węzła drzewa
   /// </summary>
   protected void treeMain_SelectedNodeChanged(object sender, EventArgs e)
   {
      // pobranie zaznaczonego węzła drzewa
      TreeNode node = treeMain.SelectedNode;

      // przetwarzanie tylko węzłów liści
      if (node.ChildNodes.Count == 0)
      {
         // pobieranie identyfikatora produktu umieszczonego w węźle
         int id = Convert.ToInt32(node.Value);

         // pobranie produktu na podstawie identyfikatora
         Product prod = ProductCatalog.GetProductById(id);
         
         // jeżeli jest to prawidłowy identyfikator, wyświetlenie szczegółów
         if (prod != null)
         {
            txtId.Text = prod.Id.ToString();
            txtIsbn.Text = prod.Isbn;
            txtName.Text = prod.Name;
            txtPrice.Text = String.Format("{0:c}", prod.Price);
         }
      }
   }

   /// <summary>
   /// Obsługa zdarzenia kliknięcia przycisku zakupu
   /// </summary>
   protected void btnPurchase_Click(object sender, EventArgs e)
   {
      // obsługa braku zaznaczonych produktów
      if (treeMain.CheckedNodes.Count <= 0)
         labChoose.Text = "Nie zaznaczyłeś żadnego produktu do kupienia";
      else
      {
         labChoose.Text = "Zostały wybrane następujące produkty:";
         double total = 0.0;
         bulSelected.Items.Clear();

         // przeglądanie zaznaczonych węzłów
         foreach (TreeNode node in treeMain.CheckedNodes)
         {
            // pobieranie informacji o produkcie w węźle
            int id = Convert.ToInt32(node.Value);
            Product prod = ProductCatalog.GetProductById(id);

            // jeżeli jest to prawidłowy produkt, dodanie go do listy i podsumowania
            if (prod != null)
            {               
               string s = prod.Name;
               s += "(" + String.Format("{0:c}", prod.Price) + ")";
               ListItem item = new ListItem(s);
               bulSelected.Items.Add(item);
               total += prod.Price;
            }
         }
         labTotal.Text = "Całkowita cena zakupu: ";
         labTotal.Text += String.Format("{0:c}", total);
      }
   }
}
