/**
 * VersionBasedArchivalStrategy.java
 * Created Sep 10, 2007
 * Copyright (c) Tandberg Television 2007
 */
package com.tandbergtv.workflow.driver.template;

import static com.tandbergtv.workflow.core.ProcessStatus.BRANCHED;
import static com.tandbergtv.workflow.core.ProcessStatus.BUSY;
import static com.tandbergtv.workflow.core.ProcessStatus.CREATED;
import static com.tandbergtv.workflow.core.ProcessStatus.ERROR;
import static com.tandbergtv.workflow.core.ProcessStatus.PAUSED;
import static com.tandbergtv.workflow.core.ProcessStatus.QUEUED;
import static com.tandbergtv.workflow.core.ProcessStatus.RUNNING;

import org.apache.log4j.Logger;

import com.tandbergtv.workflow.core.WorkflowTemplate;
import com.tandbergtv.workflow.driver.DriverException;
import com.tandbergtv.workflow.driver.service.IProcessSearchService;
import com.tandbergtv.workflow.driver.service.ITemplateLoaderService;

/**
 * Deletes previous versions of templates that do not have any executable processes. If a template
 * of version N exists, then any templtes with version N - 1 or lesser will be removed.
 * 
 * @author Sahil Verma
 */
public class VersionBasedArchivalStrategy implements IArchivalStrategy {

	private static final Logger logger = Logger.getLogger(VersionBasedArchivalStrategy.class);
	
	private ITemplateLoaderService loader;
	
	private IProcessSearchService search;
	
	/**
	 * Creates a {@link VersionBasedArchivalStrategy}
	 */
	public VersionBasedArchivalStrategy(ITemplateLoaderService loader, IProcessSearchService search) {
		this.loader = loader;
		this.search = search;
	}

	/* (non-Javadoc)
	 * @see com.tandbergtv.workflow.driver.template.IArchivalStrategy#archive()
	 */
	public void archive() {
		for (WorkflowTemplate template : loader.getLatestTemplates())
			archive(template);
	}

	/* (non-Javadoc)
	 * @see com.tandbergtv.workflow.driver.template.IArchivalStrategy#archive(com.tandbergtv.workflow.core.WorkflowTemplate)
	 */
	public void archive(WorkflowTemplate template) {
		logger.info("Trying to delete older versions of template " + template);
		
		for (WorkflowTemplate previous : loader.getPreviousVersions(template)) {
			int count = search.count(previous, PAUSED, BUSY, RUNNING, CREATED, QUEUED, ERROR, BRANCHED);
			logger.info("Found " + count + " process(es) of template " + previous);
			
			try {
				if (count == 0)
					loader.delete(previous);
			} catch (DriverException e) {
				logger.warn("Failed to delete older versions of template " + template, e);
			}
		}
	}
}
