package sungroup.p2p.Campaign;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.Collection;
import java.util.HashSet;
import jungroup.p2p.Logger.Console;

public class Campaign 
{
	private Collection<SubCampaign> subCampaigns;
	private String _campaignName;
	private int _campID;
	/* Campaign Status Active to be matched when serving Content
	* on Application Startup Campaign may be active
	* but paused by Admin Service
	*/
	private boolean _active;
	
	public Campaign(int campID, String campaignName)
	{
		subCampaigns=new HashSet<SubCampaign>();
		_campID=campID;
		_campaignName=campaignName;
	}
	
	public String toString()
	{
		return _campaignName;
	}
	
	public int getCampaignID()
	{
		return _campID;
	}	
	
    /* loadCampaign
     * Called by Campaign Manager
     * read the campaign name from campaign.txt and
     * load Sub Campaigns in the collection 
     * FILE STRUCTURE (comma separated-'subcampaign.txt') 
     * <CampaignID>, <SubCampaignId>, <SubCampaignName>, <Active(1-Active,0-InActive)>,
     */
	public void loadCampaign(String subCampaignPath, String subCampaignFilePath)
	{	
		try {
			String line;
	        BufferedReader bf = new BufferedReader(new InputStreamReader(new FileInputStream(subCampaignPath)));
	        while((line = bf.readLine())!= null)
	        {
	        	if (line.length()>0) {
	        		String []arr = line.split(",");
	        		int campID=Integer.parseInt(arr[0]);
		        	int subCampaignId=Integer.parseInt(arr[1]);
	        		String subCampName=arr[2];
	        		boolean active=arr[3].equalsIgnoreCase("1");
		        	if (campID==_campID && 
		        		getSubCampaign(subCampName)==null &&		//Sub Campaign Does Not Exist in Collection 
		        		getSubCampaignByID(subCampaignId)==null &&	//Sub Campaign by ID Does Not Exists in Collection
		        		subCampName.length()>0 && 					//New Sub Campaign Name is Valid		        		
		        		active)										//New Sub Campaign is Active 
		        	{	
			        	SubCampaign newSubCamp = new SubCampaign(subCampaignId,subCampName,this);
			        	newSubCamp.loadSubCampaign(subCampaignFilePath);
			        	if (newSubCamp.getSharedFiles()>0) {
		   	        		Console.Write("Sub Campaign Loaded : " + subCampName);
			        		subCampaigns.add(newSubCamp);
			        	}
		        	}
	        	}
	        }
		} catch (Exception e) {
        	Console.Write("Failed to Load Campaign File "+e.toString());			
		}
	}
	
    /* Get Sub Campaign Object by Name */
    public SubCampaign getSubCampaign(String subcampaignName) {
    	SubCampaign retValue=null;
    	for (SubCampaign subcamp:subCampaigns) {
    		if (subcamp.toString().equalsIgnoreCase(subcampaignName))
    		{
    			retValue=subcamp;
    			break;
    		}        		
    	}	 
    	return retValue;
    }

    /* Get Sub Campaign Object by ID */
    public SubCampaign getSubCampaignByID(int id) {
    	SubCampaign retValue=null;
    	for (SubCampaign subcamp:subCampaigns) {
    		if (subcamp.getID()==id)
    		{
    			retValue=subcamp;
    			break;
    		}        		
    	}	 
    	return retValue;
    }

	public int getSharedFiles()
	{
		int i=0;
		for (SubCampaign subCamp:subCampaigns)
			i+=subCamp.getSharedFiles();			
		//read the 
		return i;
	}
	
	public int getFileSize()
	{
		int i=0;
		for (SubCampaign subCamp:subCampaigns)
			i+=subCamp.getFileSize();			
		//read the 
		return i;
	}
	
	public SearchResult searchFiles(String fileName)
	{
		SearchResult sResult=new SearchResult();
		for (SubCampaign subCamp:subCampaigns) 
		{
			SearchResult result = subCamp.searchFiles(fileName);
			sResult.Add(result);
		}
		return sResult;		
	}
	
	public void setActive(boolean flag) {
		_active=flag;
	}
	
	public boolean IsActive() {
		return _active;
	}
	
	public CampFile getCampFileByIndex(int nFileIndex) 
	{
		for (SubCampaign subCamp:subCampaigns)
		{
			CampFile file= subCamp.getCampFileByIndex(nFileIndex);
			if (file!=null) return file;
		}			
		return null;
	}	
	
	public CampFile getCampFileBySHA1(String sha1) 
	{
		for (SubCampaign subCamp:subCampaigns)
		{
			CampFile file= subCamp.getCampFileBySHA1(sha1);
			if (file!=null) return file;
		}			
		return null;
	}	
}
