using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Castle.ActiveRecord;
using Castle.ActiveRecord.Framework.Config;
using Castle.ActiveRecord.Framework;
using System.Collections;
using System.Reflection;



namespace FirstExample
{
    class Program
    {
        static void Main( string[] args )
        {
            // 1. Utworzenie konfiguracji

            // Sposób 1.
            //Hashtable properties = new Hashtable();
            //properties.Add("hibernate.connection.driver_class", "NHibernate.Driver.SqlClientDriver");
            //properties.Add("hibernate.dialect", "NHibernate.Dialect.MsSql2005Dialect");
            //properties.Add("hibernate.connection.provider", "NHibernate.Connection.DriverConnectionProvider");
            //properties.Add("hibernate.connection.connection_string", "Data Source=.;Initial Catalog=KursPBD;Integrated Security=SSPI");
            //InPlaceConfigurationSource source = new InPlaceConfigurationSource();
            //source.Add(typeof(ActiveRecordBase), properties);

            // Sposób 2.
            //XmlConfigurationSource source = new XmlConfigurationSource( "NHibernate.xml" );

            // Sposób 3. (tutaj potrzebna jest konfiguracja aplikacji)
            IConfigurationSource source = ActiveRecordSectionHandler.Instance;


            // 2. Inicjalizacja

            // Sposób 1.
            ActiveRecordStarter.Initialize( source, typeof( Osoba ) );

            // Sposób 2.
            //ActiveRecordStarter.Initialize( Assembly.GetAssembly( typeof( Program ) ), source );
            //ActiveRecordStarter.Initialize( Assembly.Load( "FirstExample" ), source );


            // 3. Tworzenie/usunięcie schematu
            ActiveRecordStarter.DropSchema();
            ActiveRecordStarter.CreateSchema();

            // 4. Tworzenie i zapisanie obiektu (bez nadania ID)
            var o1 = new Osoba
            {
                Imie = "Jan01",
                Nazwisko = "Kowalski01"
            };
            // podglądamy jakie jest ID
            o1.SaveAndFlush();
            // ponownie podglądamy jakie jest ID

            // 5. Tworzenie i zapisanie drugiego obiektu (z nadaniem ID)
            var o2 = new Osoba
            {
                ID = 100,
                Imie = "Jan01",
                Nazwisko = "Kowalski01"
            };
            o2.Create();

            // 6. Wypisanie zawartości
            foreach ( var o in Osoba.FindAll() )
                Console.WriteLine( o.ToString() );

            Console.ReadLine();
        }
    }
}
