/*
 * 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;


}
