/**
         * Facilitate testing of data layer
         */
        public static void Main(string[] args)
        {
            // FOR PROTOTYPE DEMO, START WITH EMPTY DB

            var db              = new DbObj();
            var db2             = new DbObj();
            var accGateway      = new AccountGateway(db);
            var metadataGateway = new MetadataGateway(db2);

            string       email = "*****@*****.**";
            ObjectId     objId;
            AccountModel acc;

            while (true)
            {
                Console.WriteLine("\nSelect an operation:");
                Console.WriteLine("0.  Exit.");
                Console.WriteLine("1.  Create 4 new users.");
                Console.WriteLine("2.  View all users.");
                Console.WriteLine("3.  Update a user's name.");
                Console.WriteLine("4.  Delete a user's account.");
                Console.WriteLine("5.  View name & password of a user.");
                Console.WriteLine("6.  Create sample file and folders.");
                Console.WriteLine("7.  View content of user's root folder.");
                string cmd = Console.ReadLine();

                switch (cmd)
                {
                case "0":
                    Console.WriteLine("\nExit ok.");
                    return;

                case "1":
                    // CREATE
                    objId = ObjectId.GenerateNewId();
                    accGateway.Insert(new AccountModel(objId, "Ng Cai Feng", "Mr",
                                                       "*****@*****.**", "password1", DateTime.Now, true, "", "Bio"));
                    objId = ObjectId.GenerateNewId();
                    accGateway.Insert(new AccountModel(objId, "Chua Xiang Wei, Jerahmeel", "Mr",
                                                       "*****@*****.**", "password2", DateTime.Now, true, "", "Bio"));
                    objId = ObjectId.GenerateNewId();
                    accGateway.Insert(new AccountModel(objId, "Ryan Chia Dong Yi", "Mr",
                                                       "*****@*****.**", "password3", DateTime.Now, true, "", "Bio"));
                    objId = ObjectId.GenerateNewId();
                    accGateway.Insert(new AccountModel(objId, "Lim Jing Pei", "Ms",
                                                       "*****@*****.**", "password4", DateTime.Now, true, "", "Bio"));
                    accGateway.Save();

                    break;

                case "2":
                    // READ all accounts
                    var readResults = accGateway.SelectAll().GetEnumerator();

                    while (readResults.MoveNext())
                    {
                        Console.WriteLine(readResults.Current?.Email + " " + readResults.Current?.Name);
                    }

                    break;

                case "3":
                    // UPDATE account by email
                    Console.WriteLine("Enter the email of the user whose name you want to update:");
                    email = Console.ReadLine();
                    Console.WriteLine("Enter the new name:");
                    String name = Console.ReadLine();

                    acc = accGateway.SelectByEmail(email);
                    if (acc != null)
                    {
                        acc.Name = name;

                        accGateway.Update(acc);
                        accGateway.Save();
                    }
                    else
                    {
                        Console.WriteLine("Email not found.");
                    }

                    break;

                case "4":
                    // DELETE account by email
                    Console.WriteLine("Enter the email of the user to delete:");
                    email = Console.ReadLine();

                    acc = accGateway.SelectByEmail(email);
                    if (acc != null)
                    {
                        accGateway.Delete(acc);
                        accGateway.Save();
                    }
                    else
                    {
                        Console.WriteLine("Email not found.");
                    }

                    break;

                case "5":
                    // SELECT ACCOUNT MODEL BY EMAIL
                    Console.WriteLine("Enter the email of the user you want to view:");
                    email = Console.ReadLine();

                    acc = accGateway.SelectByEmail(email);
                    if (acc != null)
                    {
                        Console.WriteLine("Name of " + email + ": " + acc.Name);
                        Console.WriteLine("Password of " + email + ": " + acc.Password);
                    }
                    else
                    {
                        Console.WriteLine("Email not found.");
                    }

                    break;

                case "6":
                    // CREATE FILES AND FOLDERS

                    AccessControlsModel        acModel1 = new AccessControlsModel("*****@*****.**", true, true);
                    AccessControlsModel        acModel2 = new AccessControlsModel("*****@*****.**", true, true);
                    List <AccessControlsModel> acList   = new List <AccessControlsModel>();
                    acList.Add(acModel1); acList.Add(acModel2);

                    ObjectId userRootId = ObjectId.GenerateNewId();
                    ObjectId folderAId  = ObjectId.GenerateNewId();
                    ObjectId folderBId  = ObjectId.GenerateNewId();
                    ObjectId folderCId  = ObjectId.GenerateNewId();

                    // userRoot
                    metadataGateway.Insert(new MetadataModel(userRootId, email, email, 0, DateTime.Now, "", "", acList));
                    // folderA in root
                    metadataGateway.Insert(new MetadataModel(folderAId, email, "FolderA", 0, DateTime.Now, "", userRootId.ToString(), acList));
                    // fileA in folderA
                    metadataGateway.Insert(new MetadataModel(ObjectId.GenerateNewId(), email, "FileA", 1, DateTime.Now, "", folderAId.ToString(), acList));
                    // fileB in folderA
                    metadataGateway.Insert(new MetadataModel(ObjectId.GenerateNewId(), email, "FileB", 1, DateTime.Now, "", folderAId.ToString(), acList));
                    // fileC in folderA
                    metadataGateway.Insert(new MetadataModel(ObjectId.GenerateNewId(), email, "FileC", 1, DateTime.Now, "", folderAId.ToString(), acList));
                    // folderB in folderA
                    metadataGateway.Insert(new MetadataModel(folderBId, email, "FolderB", 0, DateTime.Now, "", folderAId.ToString(), acList));
                    // fileD in folderB
                    metadataGateway.Insert(new MetadataModel(ObjectId.GenerateNewId(), email, "FileD", 1, DateTime.Now, "", folderBId.ToString(), acList));
                    // folderC in root
                    metadataGateway.Insert(new MetadataModel(folderCId, email, "FolderC", 0, DateTime.Now, "", userRootId.ToString(), acList));
                    // fileE in folderC
                    metadataGateway.Insert(new MetadataModel(ObjectId.GenerateNewId(), email, "FileE", 1, DateTime.Now, "", folderCId.ToString(), acList));
                    // fileF in root
                    metadataGateway.Insert(new MetadataModel(ObjectId.GenerateNewId(), email, "FileF", 1, DateTime.Now, "", userRootId.ToString(), acList));
                    // fileG in root
                    metadataGateway.Insert(new MetadataModel(ObjectId.GenerateNewId(), email, "FileG", 1, DateTime.Now, "", userRootId.ToString(), acList));

                    metadataGateway.Save();

                    break;

                case "7":
                    // View content of user's root folder

                    Console.WriteLine("Enter the email of the user:"******"\nTop level files and folders:\n");
                        var contentEnumerator = content.GetEnumerator();
                        while (contentEnumerator.MoveNext())
                        {
                            Console.WriteLine(contentEnumerator.Current?.name);
                        }
                    }
                    else
                    {
                        Console.WriteLine("Email not found.");
                    }

                    break;

                default:
                    Console.WriteLine("Invalid command.");
                    break;
                }
            }
        }