package oracle.search.plugin.genie;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import oracle.search.sdk.crawler.CrawlerPlugin;
import oracle.search.sdk.crawler.CrawlerPluginManager;
import oracle.search.sdk.crawler.CrawlingThreadService;
import oracle.search.sdk.crawler.DataSourceService;
import oracle.search.sdk.crawler.DocumentMetadata;
import oracle.search.sdk.crawler.GeneralService;
import oracle.search.sdk.crawler.Logger;
import oracle.search.sdk.crawler.ParameterInfo;
import oracle.search.sdk.crawler.ParameterValues;
import oracle.search.sdk.crawler.PluginException;
import oracle.search.sdk.crawler.QueueService;

public class GenieCrawlerPluginManager implements CrawlerPluginManager {

	private String s_pluginDescription = "Plugin for crawling Genie source";
	private String s_pluginName = "Genie Crawler Plugin";
	private String s_pluginVersion = "11.1.1.0.0";

	private static String s_paramName1 = "Parameter 1"; 
	private static String s_paramName2 = "Parameter 2";
	private static String s_paramName3 = "Parameter 3";
	
	private static String s_paramDesc1 = "Parameter Desc 1"; 
	private static String s_paramDesc2 = "Parameter Desc 2";
	private static String s_paramDesc3 = "Parameter Desc 3";
	
	private static ParameterInfo[] s_parameterList = new ParameterInfo[3]; 

	private String m_paramValue1 = "";
	private String m_paramValue2 = "";
	private String m_paramValue3 = "";

	private QueueService m_queueService = null;
	private DataSourceService m_dataSourceService = null;
	private GeneralService m_generalService = null;
	private boolean m_forceRecrawl = false;
	private Logger m_log = null;
	private ParameterValues m_params = null;
	private Date m_lastCrawlTime = null;

    static {
   	    s_parameterList[0] = new ParameterInfo(s_paramName1, s_paramDesc1, null, false);
   	    s_parameterList[1] = new ParameterInfo(s_paramName2, s_paramDesc2, null, false);
   	    s_parameterList[2] = new ParameterInfo(s_paramName3, s_paramDesc3, null, false);
	}
	
	public void init(ParameterValues params, boolean forceRecrawl, Date lastCrawlTime,
			GeneralService generalMgr, int threadCount) throws PluginException {
		
		
        this.m_log = generalMgr.getLoggingService();
        this.m_queueService = generalMgr.getQueueService();
        this.m_dataSourceService = generalMgr.getDataSourceService();
        this.m_generalService = generalMgr;
        this.m_forceRecrawl = forceRecrawl;
        this.m_params = params;
        this.m_lastCrawlTime = lastCrawlTime;
        
        
		validateParams();
		
		
		if (forceRecrawl){ 
			m_dataSourceService.deleteAll();
			loadURLsFromRepository();
		}
		
		else if (isLastCrawlCompleted()){
			loadURLsFromRepository();
		}
		
		else { 
			resumePreviousCrawling();
		}
	}

	private void resumePreviousCrawling() {
		
	}

	private boolean isLastCrawlCompleted() {
		
		return m_queueService.isQueueEmpty();
	}

	private void loadURLsFromRepository() {
		
		
			Object documentFromRepository = new Object();
			
			String displayURL = createDisplayURL(documentFromRepository);
			
			DocumentMetadata dm = m_generalService.newDocumentMetadata();
			
			dm.setDisplayURL(displayURL);
			this.m_queueService.enqueue(dm);
	}

	private String createDisplayURL(Object documentFromRepository) {
		return "";
	}

	private void validateParams() throws PluginException {
		m_paramValue1 = m_params.getParameterValue(s_paramName1);
		if (m_paramValue1==null){ 
			throw new PluginException("Parameter "+s_paramName1+" is invalid");
		}
		m_paramValue2 = m_params.getParameterValue(s_paramName2);
		m_paramValue3 = m_params.getParameterValue(s_paramName3);
	}

	public String getBaseAPIVersion() {
		
		return CrawlerPluginManager.VERSION;
	}

	public int getDefaultAccessPolicy() {
		
		return CrawlerPluginManager.POLICY_DOCUMENT_LEVEL_ACL;
	}

	public String getPluginDescription() {
		
		return s_pluginDescription;
	}

	public String getPluginName() {
		
		return s_pluginName;
	}

	public List getPluginParameters() {
		
		List paramList = new ArrayList();
		for (int i = 0; i < s_parameterList.length; i++)
			paramList.add(s_parameterList[i]);
		return paramList;
	}

	public String getPluginVersion() {
		
		return s_pluginVersion;
	}

	public void cleanup() throws PluginException {
		
		m_queueService.removeUrlNotInQueue();
	}

	public CrawlerPlugin getCrawlerPlugin(CrawlingThreadService cts) {
		
		return new GenieCrawlerPlugin(m_generalService, cts, m_forceRecrawl, m_lastCrawlTime, m_paramValue1, m_paramValue2, m_paramValue3);
	}

}
