/*
 * Created on 21-Jan-2005
 * Created by Paul Gardner
 * Copyright (C) 2004, 2005, 2006 Aelitis, All Rights Reserved.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 * 
 * AELITIS, SAS au capital de 46,603.30 euros
 * 8 Allee Lenotre, La Grille Royale, 78600 Le Mesnil le Roi, France.
 *
 */

package com.aelitis.azureus.core.dht.transport.udp.impl;

import com.aelitis.azureus.core.dht.DHT;
import com.aelitis.azureus.core.dht.transport.*;
import com.aelitis.azureus.core.dht.transport.udp.*;

/**
 * @author parg
 *
 */

public class 
Test 
	implements DHTTransportRequestHandler
{
	public static void
	main(
		String[]	args )
	{
		new Test();
	}
	
	protected
	Test()
	{
		try{
			DHTTransport	udp1 = 
				DHTTransportFactory.createUDP(
					DHTTransportUDP.PROTOCOL_VERSION_MAIN, DHT.NW_MAIN, false,
					null, null, 6881, 5, 3, 5000, 50, 25, false, false, com.aelitis.azureus.core.dht.impl.Test.getLogger());
		
			udp1.setRequestHandler( this );
			
			DHTTransport	udp2 = DHTTransportFactory.createUDP( 
					DHTTransportUDP.PROTOCOL_VERSION_MAIN, DHT.NW_MAIN, false,
					null, null, 6882, 5, 3, 5000, 50, 25, false, false, com.aelitis.azureus.core.dht.impl.Test.getLogger());
		
			udp2.setRequestHandler( this );

			final DHTTransportUDPContact	c1 = (DHTTransportUDPContact)udp1.getLocalContact();
			
			for (int i=0;i<10;i++){
				
				final int f_i = i;
				
				c1.sendPing(
					new DHTTransportReplyHandlerAdapter()
					{
						public void
						pingReply(
							DHTTransportContact contact )
						{
							System.out.println( "ping reply: " + f_i );
						}
						
						public void
						failed(
							DHTTransportContact 	contact,
							Throwable				error )
						{
							System.out.println( "ping failed" );
						}
					});
			}
	
			c1.sendStore(
					new DHTTransportReplyHandlerAdapter()
					{
						public void
						storeReply(
							DHTTransportContact contact,
							byte[]				types )
						{
							System.out.println( "store reply" );
						}
						
						public void
						failed(
							DHTTransportContact 	contact,
							Throwable				error )
						{
							System.out.println( "store failed" );
						}
					},
					new byte[][]{ new byte[23] },
					new DHTTransportValue[][]{{
						new DHTTransportValue()
						{
							public boolean
							isLocal()
							{
								return( false );
							}
							
							public long
							getCreationTime()
							{
								return( 2 );
							}
							
							public byte[]
							getValue()
							{
								return( "sdsd".getBytes());
							}
							
							public int
							getVersion()
							{
								return( 0 );
							}
							
							public DHTTransportContact
							getOriginator()
							{
								return( c1 );
							}
							
							public int
							getFlags()
							{
								return(0);
							}
							
							public String
							getString()
							{
								return( new String(getValue()));
							}
						}
					}},
					false );
			
			c1.sendFindNode(
					new DHTTransportReplyHandlerAdapter()
					{
						public void
						findNodeReply(
							DHTTransportContact 	contact,
							DHTTransportContact[] 	contacts )
						{
							System.out.println( "findNode reply" );
						}
						
						public void
						failed(
							DHTTransportContact 	contact,
							Throwable 				e )
						{
							System.out.println( "findNode failed" );
						}
					},
					new byte[12]);
			
			System.out.println( "sending find value" );
			
			c1.sendFindValue(
					new DHTTransportReplyHandlerAdapter()
					{
						public void
						findValueReply(
							DHTTransportContact 	contact,
							DHTTransportContact[] 	contacts )
						{
							System.out.println( "findValue contacts reply" );
						}
						
						public void
						findValueReply(
							DHTTransportContact 	contact,
							DHTTransportValue[]		values,
							byte					diversification_type,
							boolean					more_to_come )
						{
							System.out.println( "findValue value reply" );
						}
						
						public void
						failed(
							DHTTransportContact 	contact,
							Throwable				error )
						{
							System.out.println( "findValue failed" );
						}
					},
					new byte[3], 1, (byte)0 );
			
			System.out.println( "sending complete" );

			Thread.sleep(1000000);
		}catch( Throwable e ){
			
			e.printStackTrace();
		}
	}
	
	public void
	pingRequest(
		DHTTransportContact contact )
	{
		System.out.println( "TransportHandler: ping" );
	}
		
	public void
	keyBlockRequest(
		DHTTransportContact contact,
		byte[]				key_block_request,
		byte[]				key_block_signature )
	{
		System.out.println( "TransportHandler: keyBlockRequest" );
	}
	
	public DHTTransportStoreReply
	storeRequest(
		DHTTransportContact 	contact, 
		final byte[][]			keys,
		DHTTransportValue[][]	value_sets )
	{
		System.out.println( "TransportHandler: store" );
		
		return( 
				new DHTTransportStoreReply()
				{
					public byte[]
		        	getDiversificationTypes()
					{
						return( new byte[keys.length] );
					}
		        	
		        	public boolean
		        	blocked()
		        	{
		        		return( false );
		        	}
		        	
		        	public byte[]
		        	getBlockRequest()
		        	{
		        		return( null );
		        	}
		        	
		        	public byte[]
		        	getBlockSignature()
		        	{
		        		return( null );
		        	}
				});
	}
	
	public DHTTransportContact[]
	findNodeRequest(
		DHTTransportContact contact, 
		byte[]				id )
	{
		System.out.println( "TransportHandler: findNode" );
		
		return(new DHTTransportContact[]{ contact });
	}
	
	public DHTTransportFindValueReply
	findValueRequest(
		final DHTTransportContact contact, 
		byte[]					key,
		int						max_values,
		byte					flags )
	{
		System.out.println( "TransportHandler: findValue" );
		
		return( 
				new DHTTransportFindValueReply()
				{
					public boolean
					hit()
					{
						return( false );
					}
					
					public byte
					getDiversificationType()
					{
						return( DHT.DT_NONE );
					}
					
					public DHTTransportValue[]
					getValues()
					{
						return( null );
					}
					
					public DHTTransportContact[]
					getContacts()
					{
						return( new DHTTransportContact[]{ contact } );
					}
					
					public boolean
					blocked()
					{
						return( false );
					}
					
					public byte[]
					getBlockedKey()
					{
						return( null );
					}
					
					public byte[]
					getBlockedSignature()
					{
						return( null );
					}
				});
	}

	public void
	contactImported(
		DHTTransportContact	contact )
	{
		
	}
	
	public void
	contactRemoved(
		DHTTransportContact	contact )
	{
	}

	public int
	getTransportEstimatedDHTSize()
	{
		return(0);
	}
	
	public void
	setTransportEstimatedDHTSize(
		int	size )
	{
	}
	
	public DHTTransportFullStats
	statsRequest(
		DHTTransportContact	contact )
	{
		return( null );
	}
}
