package com.x.call.util;


import com.x.call.manager.ruleEngine.StatusMessage;

import java.io.*;
import java.util.*;

import org.kie.api.runtime.rule.AccumulateFunction;

public class RetryOldestCallTimeAccumulateFunction implements AccumulateFunction {


    private static final Comparator<StatusMessage> callTimeComparator = new Comparator<StatusMessage>() {
        @Override
        public int compare(StatusMessage s1, StatusMessage s2) {
            if(s1.getCallTime().before(s2.getCallTime())){
            	return -1;
            }else if(s1.getCallTime().after(s2.getCallTime())){
            	return 1;
            }
        	return 0;
        }
    };

    @Override
    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
    }

    @Override
    public void writeExternal(ObjectOutput out) throws IOException {
    }

    /* (non-Javadoc)
     * @see org.kie.api.runtime.rule.AccumulateFunction#createContext()
     */
    @Override
    public Serializable createContext() {
        return new ArrayList<StatusMessage>();
    }


    /* (non-Javadoc)
     * @see org.kie.api.runtime.rule.AccumulateFunction#init(java.lang.Object)
     */
    @Override
    public void init(Serializable context) throws Exception {
        @SuppressWarnings("unchecked")
		List<StatusMessage> data = (List<StatusMessage>) context;
        data.clear();
    }


    /* (non-Javadoc)
     * @see org.kie.api.runtime.rule.AccumulateFunction#accumulate(java.lang.Object, java.lang.Object)
     */
    @SuppressWarnings("unchecked")
    @Override
    public void accumulate(Serializable context, Object value) {
		List<StatusMessage> data = (List<StatusMessage>) context;
        data.addAll((List<StatusMessage>) value);
    }


    /* (non-Javadoc)
     * @see org.kie.api.runtime.rule.AccumulateFunction#reverse(java.lang.Object, java.lang.Object)
     */
    @Override
    public void reverse(Serializable context, Object value) throws Exception {
    }


    /* (non-Javadoc)
     * @see org.kie.api.runtime.rule.AccumulateFunction#getResult(java.lang.Object)
     */
    @Override
    public Object getResult(Serializable context) throws Exception {
        @SuppressWarnings("unchecked")
		List<StatusMessage> data = (List<StatusMessage>) context;
        if (data.size() > 1) {
            Collections.sort(data, callTimeComparator);
        }
        return data.get(0);
    }


    /**
     * (non-Javadoc)
     *
     * @see org.kie.api.runtime.rule.AccumulateFunction#supportsReverse()
     */
    @Override
    public boolean supportsReverse() {
        return false;
    }


    /**
     * {@inheritDoc}
     */
    @Override
    public Class<?> getResultType() {
        return StatusMessage.class;
    }


}