using System;
using System.Threading;
using Thrift.Protocol;
using ZMQ;
using ZmqServer;
using ZmqClient;

namespace ZmqServer
{
	class MainClass
	{
		public static void Main (string[] args)
		{
			new Thread(Server.serve).Start();
			Client.work();
		}
		
		static class Server{
			public static void serve(){
				StorageHandler s=new StorageHandler();
				Storage.Processor p=new Storage.Processor(s);
				
				ZMQ.Context c=new ZMQ.Context();
				
				TZmqServer tzs=new TZmqServer(p,c,"tcp://127.0.0.1:9090",ZMQ.SocketType.PAIR);
				tzs.Serve();
			}
			
			class StorageHandler:Storage.Iface{
				int val=0;
				
				public void incr(int amount){
					val+=amount;
					Console.WriteLine("incr({0})",amount);
				}
				
				public int get(){
					return val;
				} 
			}
		}
		
		static class Client{
			public static void work()
			{
				Context ctx=new Context();
				TZmqClient tzc=new TZmqClient(ctx,"tcp://127.0.0.1:9090",SocketType.PAIR);
				TBinaryProtocol p=new TBinaryProtocol(tzc);
				
				Storage.Client client=new Storage.Client(p);
				tzc.Open();
				
				Console.WriteLine(client.@get());
				client.incr(1);
				client.incr(41);
				Console.WriteLine(client.@get());
			}
		}
	}
}