using System;
using System.Data;
using System.Collections.Generic;
using System.Configuration;
using System.Web;
using System.Reflection;

public class FabriqueBusinessCompte 
{
	public FabriqueBusinessCompte() 
	{
		cacheDuration = 45;
	}

	#region Propriété CacheDuration
	private int cacheDuration;
	/// <summary>
	/// Fixe la durée en secondes de garde des données en Cache
	/// </summary>
	public int CacheDuration
	{
		get { return cacheDuration; }
		set { cacheDuration = value; }
	} 
	#endregion

	#region GetTable()
	/// <summary>
	/// Retrouve les données mise en Cache et les renouvelle si besoin
	/// </summary>
	/// <returns>compteDataTable contenant les enregistrements</returns>
	protected BanqueDataSet.COMPTEDataTable GetTable()
	{
		BanqueDataSet.COMPTEDataTable table;
		table = HttpContext.Current.Cache["table_compte"] as BanqueDataSet.COMPTEDataTable;
		if (table == null)
		{
			// les données ne sont plus en cache
			// il faut les renouveller
			BanqueDataSetTableAdapters.COMPTETableAdapter da = new BanqueDataSetTableAdapters.COMPTETableAdapter();
			table = da.GetData();

			// mise en cache 45 secondes
			HttpContext.Current.Cache.Add("table_compte",
				table,
				null,
				DateTime.Now.AddSeconds(cacheDuration),
				TimeSpan.Zero,
				System.Web.Caching.CacheItemPriority.Normal,
				null);
		}

		return table;
	} 
	#endregion

	#region GetAll()
	/// <summary>
	/// Renvoie les données sous forme d'une liste d'objets
	/// </summary>
	/// <returns>Liste d'objets métier</returns>
	public List<CompteBusinessObject> GetAll()
	{
		BanqueDataSet.COMPTEDataTable table = GetTable();
		
		// convertir la liste d'enregistrement
		// en liste d'objets métier
		List<CompteBusinessObject> liste = new List<CompteBusinessObject>();
		for (int i = 0; i < table.Rows.Count; i++)
		{
			CompteBusinessObject objet = new CompteBusinessObject();
			objet.Row = table[i];
			liste.Add(objet);
		}
		return liste;
	} 
	#endregion

	#region GetCount()
	/// <summary>
	/// Méthode utilitaire comptant le nombre d'objets
	/// </summary>
	/// <returns>Nombre d'objets</returns>
	public int GetCount()
	{
		return GetTable().Rows.Count;
	} 
	#endregion

	#region Update()
	/// <summary>
	/// Met à jour la base à partir d'un objet
	/// </summary>
	/// <param name="objet">Valeurs à mettre à jour</param>
	public void Update(CompteBusinessObject objet)
	{
		BanqueDataSetTableAdapters.COMPTETableAdapter da = new BanqueDataSetTableAdapters.COMPTETableAdapter();
		BanqueDataSet.COMPTEDataTable table = GetTable();

		// trouve la ligne et la met à jour à partir des données reçues
        BanqueDataSet.COMPTERow ligne = null; // table.FindByid_compte(objet.Id_compte);
		ligne.TITULAIRE = objet.Titulaire;
		ligne.SOLDE = objet.Solde;

		// met à jour la base
		da.Update(table);
	} 
	#endregion

	#region Insert()
	/// <summary>
	/// Ajoute un nouvel enregistrement.
	/// </summary>
	/// <param name="objet">Valeurs initiales à insérer dans la base</param>
	public void Insert(CompteBusinessObject objet)
	{
		BanqueDataSetTableAdapters.COMPTETableAdapter da = new BanqueDataSetTableAdapters.COMPTETableAdapter();
		BanqueDataSet.COMPTEDataTable table = GetTable();

		// créé une nouvelle ligne et lui donne les valeurs reçues
		BanqueDataSet.COMPTERow ligne = table.NewCOMPTERow();
		ligne.ID_COMPTE = objet.Id_compte;
		ligne.TITULAIRE = objet.Titulaire;
		ligne.SOLDE = objet.Solde;
		table.Rows.Add(ligne);

		// met à jour la base
		da.Update(table);

		// synchronise objet et ligne
		objet.Row = ligne;
	} 
	#endregion

	#region Delete()
	/// <summary>
	/// Supprime un enregistrement / objet
	/// </summary>
	/// <param name="objet">Enregistrement à supprimer</param>
	public void Delete(CompteBusinessObject objet)
	{
		BanqueDataSetTableAdapters.COMPTETableAdapter da = new BanqueDataSetTableAdapters.COMPTETableAdapter();
		BanqueDataSet.COMPTEDataTable table = GetTable();

		// créé une nouvelle ligne et lui donne les valeurs reçues
        BanqueDataSet.COMPTERow ligne = null; // table.FindByid_compte(objet.Id_compte);
		ligne.Delete();

		// met à jour la base
		da.Update(table);
	} 
	#endregion
}
