using System;
using System.Data;
using System.Data.Common;

/// <summary>
/// Ogólny opis klasy BookDA
/// </summary>
public class BookDA: AbstractDA 
{
   protected override string SelectStatement
   {
      get {
         return "SELECT ISBN,Title,PublisherName,Books.PublisherId,YearPublished,BriefDescription FROM Books INNER JOIN Publishers ON Books.PublisherId=Publishers.PublisherId";
      }
   }

   /// <summary>
   /// Zwraca całą określoną stronę danych
   /// </summary>
   public DataTable GetAll(int startRowIndex, int rowsToRetrieve)
   {
      // użyj procedury składowanej w celu pobrania wyłącznie potrzebnych danych
      string storedProc = "GetAllBooksByPage";

      // utwórz tabelę parametrów
      DbParameter[] parameters = new DbParameter[] {
		   MakeParameter("@startRowIndex", startRowIndex, DbType.Int32),
         MakeParameter("@rowsToRetrieve", rowsToRetrieve, DbType.Int32)
	   };

      // zwróć wynik
      return GetDataTable(storedProc, CommandType.StoredProcedure, parameters);
   }

   /// <summary>
   /// Zwraca całą określoną stronę danych
   /// </summary>
   public DataTable GetAll(string sortExpression)
   {
      string sql = SelectStatement;
      if (sortExpression.Length > 0)
         sql += " ORDER BY " + sortExpression;
      return GetDataTable(sql, null);
   }


   /// <summary>
   /// Zwraca łączną liczbę rekordów z książkami
   /// </summary>
   /// <returns></returns>
   public int CountBooks()
   {
      string sql = "SELECT COUNT(*) FROM Books";

      return (int)RunScalar(sql, null);
   }

   /// <summary>
   /// Zwraca tabelę danych zawierającą informacje o tabeli z książką o danym isbn.
   /// Zbiór danych będzie zawierać 0 albo 1 wiersz danych.
   /// </summary>
   public DataTable GetBooksByIsbn(string isbn)
   {
      // utwórz sparametryzowaną instrukcję zapytania
      string sql = SelectStatement + " WHERE ISBN=@isbn";

      // utwórz tabelę parametrów
      DbParameter[] parameters = new DbParameter[] {
			MakeParameter("@isbn", isbn, DbType.String)
															};
      // zwróć wynik
      return GetDataTable(sql, parameters);
   }

   /// <summary>
   /// Aktualizuje wybrane wartości książki
   /// </summary>
   public void UpdateBook(string isbn, string title, int publisherId, int yearPublished, string briefDescription)
   {
      string sql = "UPDATE Books SET Title=@Title,PublisherId=@PublisherId,";
      sql += "YearPublished=@YearPublished,BriefDescription=@BriefDescription";
      sql += " WHERE ISBN=@isbn";

      // utwórz tabelę parametrów
      DbParameter[] parameters = new DbParameter[] {
		   MakeParameter("@isbn", isbn, DbType.String),
         MakeParameter("@Title", title, DbType.String),
         MakeParameter("@PublisherId", publisherId, DbType.Int32),
         MakeParameter("@YearPublished", yearPublished, DbType.Int32),
         MakeParameter("@BriefDescription", briefDescription, DbType.String)
														   };
      // wykonaj określone polecenie
      RunNonQuery(sql, parameters);
   }

   /// <summary>
   /// Zwraca tabelę danych zawierającą informacje o tabeli z książką o danym identyfikatorze.
   /// Zbiór danych będzie zawierać 0 albo 1 wiersz danych.
   /// </summary>
   public DataTable GetBooksByPublisher(int id)
   {
      // utwórz sparametryzowaną instrukcję zapytania
      string sql = SelectStatement + " WHERE Books.PublisherId=@id";

      // utwórz tabelę parametrów
      DbParameter[] parameters = new DbParameter[] {
		   MakeParameter("@id", id, DbType.Int32)
														   };
      // zwróć wynik
      return GetDataTable(sql, parameters);
   }
}
