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

namespace Quering2Example
{
    public class NaLitereQuery : ActiveRecordBaseQuery
    {
        public string Litera { get; set; }
        public int MaxResults { get; set; }

        public NaLitereQuery()
            : base( typeof( Osoba ) )
        {
            MaxResults = 2;
        }

        protected override IQuery CreateQuery( ISession session )
        {
            if ( this.Litera != null )
            {
                string hql = "from Osoba o where o.ImieNazwisko like '"+Litera+"%'";
                IQuery q = session.CreateQuery( hql );
                q.SetMaxResults( this.MaxResults );
                return q;
            }
            else
                throw new Exception( "Litera musi być określona" );
        }

        protected override object InternalExecute( ISession session )
        {
            IQuery q = CreateQuery( session );
            return SupportingUtils.BuildArray( typeof( Osoba ), q.List() );
        }
    }

    class Program
    {
        static void Main( string[] args )
        {
            IConfigurationSource source = ActiveRecordSectionHandler.Instance;
            ActiveRecordStarter.Initialize( Assembly.GetAssembly( typeof( Program ) ), source );
            ActiveRecordStarter.DropSchema();
            ActiveRecordStarter.CreateSchema();

            var j1 = new Jednostka { Nazwa = "Wrocław" };
            var j2 = new Jednostka { Nazwa = "Kraków" };
            var j3 = new Jednostka { Nazwa = "Warszawa" };
            var j4 = new Jednostka { Nazwa = "Moskwa" };
            var j5 = new Jednostka { Nazwa = "Nowy Jork" };
            var j6 = new Jednostka { Nazwa = "Londyn" };

            var o1 = new Osoba { ImieNazwisko = "Jan Kowalski" };
            var o2 = new Osoba { ImieNazwisko = "Marian Wolny" };
            var o3 = new Osoba { ImieNazwisko = "Janina Zapotoczna" };
            var o4 = new Osoba { ImieNazwisko = "Alfred Nowak" };
            var o5 = new Osoba { ImieNazwisko = "Alicja Cicha" };
            var o6 = new Osoba { ImieNazwisko = "Maja Klin" };

            j1.L_Osoba.Add( o1 ); j1.L_Osoba.Add( o2 );
            j2.L_Osoba.Add( o3 ); j2.L_Osoba.Add( o4 );
            j3.L_Osoba.Add( o5 ); j3.L_Osoba.Add( o6 );

            j1.Save(); j2.Save(); j3.Save(); j4.Save(); j5.Save(); j6.Save();

            for ( int i=0; i<500; ++i )
                ( new Osoba { ImieNazwisko = "Iwan Ponyriow"+i.ToString(), Jednostka = j4 } ).Save();
            for ( int i=0; i<500; ++i )
                ( new Osoba { ImieNazwisko = "John Preston"+i.ToString(), Jednostka = j5 } ).Save();
            for ( int i=0; i<500; ++i )
                ( new Osoba { ImieNazwisko = "Sherlock Holmes"+i.ToString(), Jednostka = j6 } ).Save();


            NaLitereQuery q = new NaLitereQuery();
            q.Litera = "A";
            q.MaxResults = 5;
            var lista = (Osoba[])Osoba.ExecuteQuery( q );
            foreach ( var o in lista )
                Console.WriteLine( o.ImieNazwisko );
            Console.ReadLine();
        }
    }
}
