/*
 * Created on Nov 20, 2008
 * Created by Paul Gardner
 * 
 * Copyright (C) Azureus Software, Inc, 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.
 */


package com.aelitis.azureus.core.cnetwork;

import com.aelitis.azureus.core.vuzefile.VuzeFile;

public interface 
ContentNetwork 
{
	public static final long	CONTENT_NETWORK_UNKNOWN		= -1;
	
	public static final long	CONTENT_NETWORK_VUZE		= 1;
	
		/**
		 * You should normally NOT refer explicitly to this constant without consideration
		 * as we don't want network-specific code proliferating
		 */
	
	public static final long	CONTENT_NETWORK_RFN			= 2;
	
	public static final long	CONTENT_NETWORK_VHDNL		= 3;


	public static final int		SERVICE_SEARCH				= 1;	// String - query text
	public static final int		SERVICE_XSEARCH				= 2;	// String - query text; Boolean - toSubscribe
	public static final int		SERVICE_RPC					= 3;
	public static final int		SERVICE_RELAY_RPC			= 4;
	public static final int		SERVICE_AUTH_RPC			= 5;
	public static final int		SERVICE_BIG_BROWSE			= 6;
	public static final int		SERVICE_PUBLISH				= 7;
	public static final int		SERVICE_WELCOME				= 8;
	public static final int		SERVICE_PUBLISH_NEW			= 9;
	public static final int		SERVICE_PUBLISH_ABOUT		= 10;
	public static final int		SERVICE_CONTENT_DETAILS		= 11;	// String - hash; String (can be null) - client ref
	public static final int		SERVICE_COMMENT				= 12;	// String - hash
	public static final int		SERVICE_PROFILE				= 13;	// String - login_id; String - client ref
	public static final int		SERVICE_TORRENT_DOWNLOAD	= 14;	// String - hash; String (can be null) - client ref
	public static final int		SERVICE_SITE				= 15;
	public static final int		SERVICE_SUPPORT				= 16;
	public static final int		SERVICE_FAQ					= 17;
	public static final int		SERVICE_FAQ_TOPIC			= 18;	// String - topic entry
	public static final int		SERVICE_BLOG				= 19;
	public static final int		SERVICE_FORUMS				= 20;
	public static final int		SERVICE_WIKI				= 21;
	public static final int		SERVICE_LOGIN				= 22;	// String - message (can be null)
	public static final int		SERVICE_LOGOUT				= 23;
	public static final int		SERVICE_REGISTER			= 24;
	public static final int		SERVICE_MY_PROFILE			= 25;
	public static final int		SERVICE_MY_ACCOUNT			= 26;
	public static final int		SERVICE_SITE_RELATIVE		= 27;	// String - relative URL
	public static final int		SERVICE_ADD_FRIEND			= 28;	// String - bg colour
	public static final int		SERVICE_SUBSCRIPTION		= 29;	// String - subscription ID
	public static final int		SERVICE_GET_ICON			= 30;	
	public static final int		SERVICE_AUTHORIZE			= 31;	
	public static final int		SERVICE_PREPLAYBACK  		= 32;
	public static final int		SERVICE_POSTPLAYBACK  		= 33;
	public static final int		SERVICE_SIDEBAR_CLOSE  		= 34;
	public static final int		SERVICE_ABOUT				= 35;
	public static final int		SERVICE_IDENTIFY			= 36;	
	public static final int		SERVICE_EXT_SITE_RELATIVE		= 37;	// String - relative URL

		// content network properties
	
	public static final int		PROPERTY_SITE_HOST			= 1;	// String
	public static final int		PROPERTY_REMOVEABLE			= 2;	// Boolean
	public static final int		PROPERTY_ORDER				= 3;	// String (Tux prefers to Integer)

		// persistent (and local) properties
	
	public static final String	PP_AUTH_PAGE_SHOWN			= "auth_shown";			// Boolean, default false
	public static final String	PP_IS_CUSTOMIZATION			= "is_cust";			// Boolean, default false
	public static final String	PP_ACTIVE			        = "active";				// Boolean
	public static final String	PP_SHOW_IN_MENU       		= "in_menu";			// Boolean
	public static final String	PP_SOURCE_REF				= "source_ref"; 		// String

	
		/**
		 * Returns one of the above CONTENT_NETWORK constants
		 * @return
		 */
	
	public long
	getID();
	
	public String
	getName();
	
	public Object
	getProperty(
		int			property );
	
	public boolean
	isStartupNetwork();
	
	public void
	setStartupNetwork(
		boolean		is_startup );
	
		/**
		 * Test if the network supports a particular service
		 * @param service_type
		 * @return
		 */
	
	public boolean
	isServiceSupported(
		int			service_type );
	
		/**
		 * Returns the base URL of the service. If not parameterised then this is sufficient to
		 * invoke the service
		 * @param service_type
		 * @return
		 */
	
	public String
	getServiceURL(
		int			service_type );
	
		/**
		 * Generic parameterised service method
		 * @param service_type
		 * @param params
		 * @return
		 */
	
	public String
	getServiceURL(
		int			service_type,
		Object[]	params );
	
		/**
		 * search service helper method
		 * @param query
		 * @return
		 */
	
	public String
	getSearchService(
		String		query );
	
	
	public String
	getXSearchService(
		String		query,
		boolean		to_subscribe );
	
	public String
	getContentDetailsService(
		String		hash,
		String		client_ref );
	
	public String
	getCommentService(
		String		hash );
	
	public String
	getProfileService(
		String		login_id,
		String		client_ref );
	
	public String
	getTorrentDownloadService(
		String		hash,
		String		client_ref );
	
		/**
		 * @param topic The topic number or a pre-defined topic constant found in <code>FAQTopics</code>
		 */

	public String
	getFAQTopicService(
		String		topic );
	
	public String
	getLoginService(
		String		message );
	
	public String
	getSiteRelativeURL(
		String		relative_url,
		boolean		append_suffix );
	
	public String
	getExternalSiteRelativeURL(
		String		relative_url,
		boolean		append_suffix );
	
	public String
	getAddFriendURL(
		String		bg_colour );
	
	public String
	getSubscriptionURL(
		String		subs_id );
	
		/**
		 * I'd rather this function we embedded into the ContentNetwork service getting logic, but for
		 * the moment expose it for simplicity
		 * @param url_in			base URL onto which the suffix should be appended
		 * @param for_post			whether this is for an HTTP 'POST' operation, in which case the parameter
		 * 							separator is always an '&' (for 'GET' the first param uses a '?' sep)
		 * @param include_azid		whether or not we should include the azid in the suffix
		 * @return
		 */
	public String
	appendURLSuffix(
		String		url_in,
		boolean		for_post,
		boolean		include_azid );
	
		/**
		 * export to vuze file
		 * @return
		 */
	
	public VuzeFile
	getVuzeFile();
	
		/**
		 * Sets a locally persistent property. Name should be from the PP_ names above so keep track
		 * of what attributes exist
		 * 
		 * @param name	PP_ constant
		 * @param value	must be bencodable!
		 */
	
	public void
	setPersistentProperty(
		String		name,
		Object		value );
	
	public Object
	getPersistentProperty(
		String		name );
	
	public void
	addPersistentPropertyChangeListener(
		ContentNetworkPropertyChangeListener	listener );
	
	public void
	removePersistentPropertyChangeListener(
		ContentNetworkPropertyChangeListener	listener );
	
		/**
		 * Set a non-persistent property of the content network
		 * @param key
		 * @param value
		 */
	
	public void
	setTransientProperty(
		Object		key,
		Object		value );
	
	public Object
	getTransientProperty(
		Object		key );
	
	public void
	remove();
}
