/*
 * Copyright  1999-2004 The Apache Software Foundation.
 *
 *  Licensed 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.
 *
 */

package org.apache.savan.subscription;

import org.apache.axiom.soap.SOAPEnvelope;
import org.apache.axis2.context.ServiceContext;
import org.apache.savan.SavanException;
import org.apache.savan.SavanMessageContext;
import org.apache.savan.publication.client.PublicationClient;
import org.apache.savan.storage.SubscriberStore;
import org.apache.savan.subscribers.Subscriber;
import org.apache.savan.util.CommonUtil;

/**
 * Abstractly defines subscription methods.
 * Each protocol may extend this to add its own work.
 */
public abstract class SubscriptionProcessor {
	
	public abstract void init (SavanMessageContext smc) throws SavanException;
	
	public void unsubscribe(SavanMessageContext endSubscriptionMessage)  throws SavanException {
		String subscriberID = getSubscriberID (endSubscriptionMessage);
		if (subscriberID==null) {
			String message = "Cannot find the subscriber ID";
			throw new SavanException (message);
		}
		
		SubscriberStore store = endSubscriptionMessage.getSubscriberStore();
		if (store==null)
			throw new SavanException ("AbstractSubscriber store not found");
		
		store.delete (subscriberID);
	}

	public void renewSubscription(SavanMessageContext renewMessage)  throws SavanException {
		SubscriberStore store = renewMessage.getSubscriberStore();
		if (store==null)
			throw new SavanException ("AbstractSubscriber store not found");
			
		ExpirationBean bean = getExpirationBean(renewMessage);
		Subscriber subscriber = (Subscriber) store.retrieve(bean.getSubscriberID());
		if (subscriber==null) {
			throw new SavanException ("Given subscriber is not present");
		}
		
		subscriber.renewSubscription(bean);
	}

	public void subscribe(SavanMessageContext subscriptionMessage) throws SavanException {
		SubscriberStore store = subscriptionMessage.getSubscriberStore();
		if (store==null)
			throw new SavanException ("AbstractSubscriber store not found");
			
		if (store==null)
			throw new SavanException ("Sabscriber store not found");
		
		Subscriber subscriber = getSubscriberFromMessage (subscriptionMessage);
		store.store (subscriber);
	}
	
	public void endSubscription(String subscriberID,String reason,ServiceContext serviceContext)  throws SavanException {
		
		SubscriberStore store =CommonUtil.getSubscriberStore(serviceContext.getAxisService());
		if (store==null) {
			//TODO do something
		}
		
		Subscriber subscriber = store.retrieve(subscriberID);
//		doProtocolSpecificEndSubscription(subscriber,reason,serviceContext.getConfigurationContext());
		
		store.delete(subscriberID);
	}
	
	public void publish(SavanMessageContext publishMessage) throws SavanException{
		//TODO handle Topics
		SOAPEnvelope requestEnvelope = publishMessage.getEnvelope();
		ServiceContext serviceContext = publishMessage.getMessageContext().getServiceContext();
		PublicationClient client = new PublicationClient(serviceContext.getConfigurationContext());
		client.sendPublication(requestEnvelope.getBody().getFirstElement(),serviceContext.getAxisService(),null);
	}
	
	
	
	public abstract void pauseSubscription (SavanMessageContext pauseSubscriptionMessage) throws SavanException;
	
	public abstract void resumeSubscription (SavanMessageContext resumeSubscriptionMessage) throws SavanException;
	
	public abstract Subscriber getSubscriberFromMessage (SavanMessageContext smc) throws SavanException;
	
	public abstract ExpirationBean getExpirationBean (SavanMessageContext renewMessage) throws SavanException;
	
	public abstract String getSubscriberID (SavanMessageContext smc) throws SavanException;
	

}
