package eu.dnetlib.data.collective.manager.ui;

import java.util.Arrays;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.Set;

import eu.dnetlib.data.collective.manager.nh.JobInfo.JOBSTATUS;

/**
 * @author jochen
 *
 */
public class UiConstants {

   	protected static Map<JOBSTATUS, String> jobStatusColorMap = new HashMap<JOBSTATUS, String>();
   	
	protected static final String[] storageTypes = {"REFRESH", "INCREMENTAL"};
	
	private static final String[] cronHourKeys = {"don't care", "daily", "nightly"};
	private static final String[] cronHourValues = {"*", "11", "2"};
	private static final Map<String, String> cronHourMap = new LinkedHashMap<String, String>();
	
	private static final String[] cronDayKeys = {"don't care", "business day", "weekend"};
	private static final String[] cronDayValues = {"*", "2-6", "7-1"};
	private static final Map<String, String> cronDayMap = new LinkedHashMap<String, String>();
	
  	private static final String[] intervalFactor = {"0", "1", "2", "3", "4", "5", "6"};
	
   	/**
   	 * array of interval keys : hour, day, week
   	 */
   	private static final String[] intervalTypeKeys = {"hour(s)", "day(s)", "week(s)"};
   	/**
   	 * array of interval values in minutes 60, 1440, 10080
   	 */
   	private static final String[] intervalTypeValues = {"60", "1440", "10080"};
	private static final Map<String, String> intervalTypeMap = new LinkedHashMap<String, String>();

   	
   	public void init(){
   		int index = 0;
   		for (String key: cronHourKeys){
   	   		cronHourMap.put(key, cronHourValues[index++]);
   		}
   		index = 0;
   		for (String key: cronDayKeys){
   	   		cronDayMap.put(key, cronDayValues[index++]);
   		}
   		index = 0;
   		for (String key: intervalTypeKeys){
   	   		intervalTypeMap.put(key, intervalTypeValues[index++]);
   		}

   		jobStatusColorMap.put(JOBSTATUS.IDLE, "color:green");
   		jobStatusColorMap.put(JOBSTATUS.STARTING, "color:orange");
   		jobStatusColorMap.put(JOBSTATUS.ONGOING, "color:orange");
   		jobStatusColorMap.put(JOBSTATUS.CANCELLING, "color:orange");
   		jobStatusColorMap.put(JOBSTATUS.FAILED, "color:red");
   	}
   	
   	public static String getJobStatusColor(JOBSTATUS aJobStatus){
   		return jobStatusColorMap.get(aJobStatus);
   	}

	public static boolean containsSchedulingIntervalType(String aValue){
		return intervalTypeMap.containsValue(aValue);
	}
		
	public static Set<String> getSchedulingCronDays(){
		return cronDayMap.keySet();
	}
	
	public static Set<String> getSchedulingCronHours(){
		return cronHourMap.keySet();
	}

	public static Set<String> getSchedulingIntervalTypes(){
		return intervalTypeMap.keySet();
	}
	
	public static String getValueOfSchedulingCronDay(String aKey){
		return cronDayMap.get(aKey);
	}
	
	public static String getValueOfSchedulingCronHour(String aKey){
		if (aKey.equals("don't care")){
			Random randomGenerator = new Random();
			return "" + randomGenerator.nextInt(24);
		}else{
			return cronHourMap.get(aKey);			
		}
	}
	
	public static String getValueOfSchedulingIntervalType(String aKey){
		return intervalTypeMap.get(aKey);
	}
	
	
	public static Set<String> getSchedulingIntervalFactors(){				
		return new LinkedHashSet<String>(Arrays.asList(intervalFactor));
	}
	
	
	public static int indexOfSchedulingCronDay(String aValue){
		if (cronDayMap.containsValue(aValue)){
			return Arrays.asList(cronDayValues).indexOf(aValue);
		}else{
			return -1;
		}
	}
	
	public static int indexOfSchedulingCronHour(String aValue){
		if (cronHourMap.containsValue(aValue)){
			return Arrays.asList(cronHourValues).indexOf(aValue);
		}else{
			return 0;
		}
	}
	
	public static int indexOfSchedulingIntervalFactor(String aValue){
		return Arrays.asList(intervalFactor).indexOf(aValue);
	}
	
	public static int indexOfSchedulingIntervalType(String aValue){
		if (intervalTypeMap.containsValue(aValue)){
			return Arrays.asList(intervalTypeValues).indexOf(aValue);
		}else{
			return -1;
		}
	}
	
	public static List<String> getStorageTypes() {
		return Arrays.asList(storageTypes);
	}
		


}
