﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NUnit.Framework;
using DotCMIS;
using DotCMIS.Client.Impl;
using DotCMIS.Client;

namespace DotCMISUnitTest
{
    [TestFixture]
    class GetChildrenTest
    {
        private static int numOfDocuments = 250;

        [Test]
        public void TestPaging()
        {
            Dictionary<string, string> parameters = new Dictionary<string, string>();

            string baseUrlAtom = "http://localhost:8080/inmemory/atom";
            //string baseUrlAtom = "http://cmis.alfresco.com/cmisatom";
           
            string baseUrlWS = "http://localhost:8080/inmemory/services";

            parameters[SessionParameter.BindingType] = BindingType.AtomPub;
            parameters[SessionParameter.AtomPubUrl] = baseUrlAtom;
            parameters[SessionParameter.User] = "admin";
            parameters[SessionParameter.Password] = "admin";

            SessionFactory factory = SessionFactory.NewInstance();
            ISession session = factory.GetRepositories(parameters)[0].CreateSession();

            IOperationContext oc = session.CreateOperationContext();
            oc.MaxItemsPerPage = 100;

            IFolder folder = createData(session);
            //IFolder folder = session.GetObjectByPath(@"/childrenTestFolder") as IFolder;

            int counter = 0;
            foreach (ICmisObject child in folder.GetChildren(oc))
            {
                Console.WriteLine("!" + counter + " " + child.Name);
                counter++;
            }

            Assert.AreEqual(numOfDocuments, counter);

            counter = 0;
            foreach (ICmisObject child in folder.GetChildren(oc).GetPage(150))
            {
                Console.WriteLine("#" + counter + " " + child.Name);
                counter++;
            }

            Assert.AreEqual(150, counter);

            counter = 0;
            foreach (ICmisObject child in folder.GetChildren(oc).SkipTo(20).GetPage(180))
            {
                Console.WriteLine("*" + counter + " " + child.Name);
                counter++;
            }

            Assert.AreEqual(180, counter);

            folder.DeleteTree(true, null, true);
        }


        private IFolder createData(ISession session)
        {
            Dictionary<string, object> properties = new Dictionary<string, object>();
            properties[PropertyIds.Name] = "childrenTestFolder";
            properties[PropertyIds.ObjectTypeId] = "cmis:folder";

            IFolder folder = session.GetRootFolder().CreateFolder(properties);

            for (int i = 0; i < numOfDocuments; i++)
            {
                Dictionary<string, object> docProps = new Dictionary<string, object>();
                docProps[PropertyIds.Name] = "doc" + i;
                docProps[PropertyIds.ObjectTypeId] = "cmis:document";

                folder.CreateDocument(docProps, null, null);

            }

            return folder;
        }
    }
}
