﻿/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements.  See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License.  You may obtain a copy of the License at
*
*      http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

using System;
using System.Collections;
using System.Collections.Generic;
using Apache.Geode.Client;

namespace Apache.Geode.Examples.FunctionExecution
{
  class Program
  {
    static void Main(string[] args)
    {
      var cacheFactory = new CacheFactory()
          .Set("log-level", "none");
      var cache = cacheFactory.Create();

      var poolFactory = cache.GetPoolFactory()
          .AddLocator("localhost", 10334);
      poolFactory.Create("pool");

      var regionFactory = cache.CreateRegionFactory(RegionShortcut.PROXY)
          .SetPoolName("pool");
      var region = regionFactory.Create<object, object>("partition_region");

      Console.WriteLine("Storing id and username in the region");

      string rtimmonsKey = "rtimmons";
      string rtimmonsValue = "Robert Timmons";
      string scharlesKey = "scharles";
      string scharlesValue = "Sylvia Charles";

      region.Put(rtimmonsKey, rtimmonsValue, null);
      region.Put(scharlesKey, scharlesValue, null);

      Console.WriteLine("Getting the user info from the region");
      var user1 = region.Get(rtimmonsKey, null);
      var user2 = region.Get(scharlesKey, null);

      Console.WriteLine(rtimmonsKey + " = " + user1);
      Console.WriteLine(scharlesKey + " = " + user2);

      ArrayList keyArgs = new ArrayList();
      keyArgs.Add(rtimmonsKey);
      keyArgs.Add(scharlesKey);

      var exc = Client.FunctionService<object>.OnRegion<object, object>(region);

      Client.IResultCollector<object> rc = exc.WithArgs<object>(keyArgs).Execute("ExampleMultiGetFunction");

      ICollection<object> res = rc.GetResult();

      Console.WriteLine("Function Execution Results:");
      Console.WriteLine("   Count = {0}", res.Count);

      foreach (List<object> item in res)
      {
        foreach (object item2 in item)
        {
          Console.WriteLine("   value = {0}", item2.ToString());
        }
      }

      cache.Close();
    }
  }
}
