package gZFS;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Hashtable;

public class zreplicas {
	public Hashtable<String,zProperties> zProperties = new Hashtable<String, zProperties>();
	public Hashtable<String,zProperties> zSchedulerProperties = new Hashtable<String, zProperties>();

	private Hashtable<Object, Object> cronMinute = new Hashtable<Object, Object>();
	private Hashtable<Object, Object> cronHour= new Hashtable<Object, Object>();
	private Hashtable<Object, Object> cronMonth= new Hashtable<Object, Object>();
	private Hashtable<Object, Object> cronDayOfMonth = new Hashtable<Object, Object>();
	private Hashtable<Object, Object> cronDayOfWeek = new Hashtable<Object, Object>();
	
	zreplicas(){
		String valueForHash = null;
		for (int i=1;i<61;i++){
			
			if ( i<10){
				valueForHash="0"+String.valueOf(i);
			}else{
				valueForHash=String.valueOf(i);
			}
			cronMinute.put(String.valueOf(i), valueForHash);
			if ( i ==1){
				cronMinute.put("*", "All");
			}else{
				cronMinute.put("*/"+i, "Every "+valueForHash+" Minutes");	
			}
		}
		
		for (int i=0;i<24;i++){
			if ( i<10){
				valueForHash="0"+String.valueOf(i);
			}else{
				valueForHash=String.valueOf(i);
			}
			cronHour.put(String.valueOf(i), valueForHash);
			if ( i ==1){
				cronHour.put("*", "All");
			}else{
				cronHour.put("*/"+i, "Every "+valueForHash+" Hours");	
			}
		}
		
		cronMonth.put("01", "January");
		cronMonth.put("02", "February");
		cronMonth.put("03", "March");
		cronMonth.put("04", "April");
		cronMonth.put("05", "May");
		cronMonth.put("06", "June");
		cronMonth.put("07", "July");
		cronMonth.put("08", "August");
		cronMonth.put("09", "September");
		cronMonth.put("10", "October");
		cronMonth.put("11", "November");
		cronMonth.put("12", "December");
		cronMonth.put("*", "All");
		
		cronDayOfWeek.put("0", "Sunday");
		cronDayOfWeek.put("1", "Monday");
		cronDayOfWeek.put("2", "Tuesday");
		cronDayOfWeek.put("3", "Wednesday");
		cronDayOfWeek.put("4", "Thursday");
		cronDayOfWeek.put("5", "Friday");
		cronDayOfWeek.put("6", "Saturday");
		cronDayOfWeek.put("*", "All");
		
		
		for (int i=1;i<31;i++){
			if ( i<10){
				valueForHash="0"+String.valueOf(i);
			}else{
				valueForHash=String.valueOf(i);
			}
			cronDayOfMonth.put(String.valueOf(i), valueForHash);
			if ( i ==1){
				cronDayOfMonth.put("*", "All");
			}else{
				cronDayOfMonth.put("*/"+i, "Every "+valueForHash+" Days");	
			}
		}

		Hashtable<Object, Object> permitValueNameVolFS = new Hashtable<Object, Object>();
		zProperties zPropertyNameVolFS = new zProperties();
		permitValueNameVolFS.clear();
		zPropertyNameVolFS.setNameProperty("name");
		zPropertyNameVolFS.setLabelProperty("Name Volume/FileSystem replicated");
		zPropertyNameVolFS.setType("noupdateable");
		zPropertyNameVolFS.setValue("");
		zPropertyNameVolFS.setPermitValue(null);
		zPropertyNameVolFS.setMultivalues(null);
		zSchedulerProperties.put("name", zPropertyNameVolFS);
		
		Hashtable<Object, Object> permitValueFileConf = new Hashtable<Object, Object>();
		zProperties zPropertyFileConf = new zProperties();
		permitValueFileConf.clear();
		zPropertyFileConf.setNameProperty("fileconf");
		zPropertyFileConf.setLabelProperty("Configuration File");
		zPropertyFileConf.setType("noupdateable");
		zPropertyFileConf.setValue("");
		zPropertyFileConf.setPermitValue(null);
		zPropertyFileConf.setMultivalues(null);
		zSchedulerProperties.put("fileconf", zPropertyFileConf);

		Hashtable<Object, Object> permitValueNameReplica = new Hashtable<Object, Object>();
		zProperties zPropertyNameReplica = new zProperties();
		permitValueNameReplica.clear();
		zPropertyNameReplica.setNameProperty("namereplica");
		zPropertyNameReplica.setLabelProperty("Replica Name");
		zPropertyNameReplica.setType("noupdateable");
		zPropertyNameReplica.setValue("");
		zPropertyNameReplica.setPermitValue(null);
		zPropertyNameReplica.setMultivalues(null);
		zSchedulerProperties.put("namereplica", zPropertyNameReplica);

		Hashtable<Object, Object> permitValueNbReplicas = new Hashtable<Object, Object>();
		zProperties zPropertyNbReplicas = new zProperties();
		permitValueNbReplicas.clear();
		zPropertyNbReplicas.setNameProperty("nbreplica");
		zPropertyNbReplicas.setLabelProperty("Number replicas to keep");
		zPropertyNbReplicas.setType("freeentry");
		zPropertyNbReplicas.setValue("");
		zPropertyNbReplicas.setPermitValue(null);
		zPropertyNbReplicas.setMultivalues(null);
		zSchedulerProperties.put("nbreplica", zPropertyNbReplicas);
		
		Hashtable<Object, Object> permitValueLastSnapshotReplicated = new Hashtable<Object, Object>();
		zProperties zPropertyLastSnapshotReplicated = new zProperties();
		permitValueLastSnapshotReplicated.clear();
		zPropertyLastSnapshotReplicated.setNameProperty("lastsnapshotreplicated");
		zPropertyLastSnapshotReplicated.setLabelProperty("Last Snapshot Replicated");
		zPropertyLastSnapshotReplicated.setType("noupdateable");
		zPropertyLastSnapshotReplicated.setValue("");
		zPropertyLastSnapshotReplicated.setPermitValue(null);
		zPropertyLastSnapshotReplicated.setMultivalues(null);
		zSchedulerProperties.put("lastsnapshotreplicated", zPropertyLastSnapshotReplicated);

		Hashtable<Object, Object> permitValueMinutesOfSReplicas = new Hashtable<Object, Object>();
		zProperties zPropertyMinutesOfSReplicas = new zProperties();
		permitValueMinutesOfSReplicas.clear();
		zPropertyMinutesOfSReplicas.setNameProperty("minutesofreplicas");
		zPropertyMinutesOfSReplicas.setLabelProperty("Minutes of replication [0-60]");
		zPropertyMinutesOfSReplicas.setType("nofreeentry");
		zPropertyMinutesOfSReplicas.setValue("");
		zPropertyMinutesOfSReplicas.setPermitValue(cronMinute);
		zPropertyMinutesOfSReplicas.setMultivalues(null);
		zSchedulerProperties.put("minutesofreplicas", zPropertyMinutesOfSReplicas);

		Hashtable<Object, Object> permitValueReplicaServer = new Hashtable<Object, Object>();
		zProperties zPropertyReplicaServer = new zProperties();
		permitValueReplicaServer.clear();
		zPropertyReplicaServer.setNameProperty("server");
		zPropertyReplicaServer.setLabelProperty("Server For Replication");
		zPropertyReplicaServer.setType("nofreeentry");
		zPropertyReplicaServer.setValue("");
		zPropertyReplicaServer.setPermitValue(null);
		zPropertyReplicaServer.setMultivalues(null);
		zSchedulerProperties.put("server", zPropertyReplicaServer);
		
		Hashtable<Object, Object> permitValueReplicaPool = new Hashtable<Object, Object>();
		zProperties zPropertyReplicaPool = new zProperties();
		permitValueReplicaPool.clear();
		zPropertyReplicaPool.setNameProperty("replicapool");
		zPropertyReplicaPool.setLabelProperty("Pool For Replication");
		zPropertyReplicaPool.setType("nofreeentry");
		zPropertyReplicaPool.setValue("");
		zPropertyReplicaPool.setPermitValue(null);
		zPropertyReplicaPool.setMultivalues(null);
		zSchedulerProperties.put("replicapool", zPropertyReplicaPool);
		
		
		Hashtable<Object, Object> permitValueReplicasHours = new Hashtable<Object, Object>();
		zProperties zPropertyReplicasHours = new zProperties();
		permitValueReplicasHours.clear();
		zPropertyReplicasHours.setNameProperty("hoursofreplicas");
		zPropertyReplicasHours.setLabelProperty("Hour of replication [0-23]");
		zPropertyReplicasHours.setType("nofreeentry");
		zPropertyReplicasHours.setValue("");
		zPropertyReplicasHours.setPermitValue(cronHour);
		zPropertyReplicasHours.setMultivalues(null);
		zSchedulerProperties.put("hoursofreplicas", zPropertyReplicasHours);

		Hashtable<Object, Object> permitValueDayOfWeekReplicas = new Hashtable<Object, Object>();
		zProperties zPropertyDayOfWeekReplicas = new zProperties();
		permitValueDayOfWeekReplicas.clear();
		zPropertyDayOfWeekReplicas.setNameProperty("dayofweekreplicas");
		zPropertyDayOfWeekReplicas.setLabelProperty("Day of week of Replication [0-6] 0 for Sunday");
		zPropertyDayOfWeekReplicas.setType("nofreeentry");
		zPropertyDayOfWeekReplicas.setValue("");
		zPropertyDayOfWeekReplicas.setPermitValue(cronDayOfWeek);
		zPropertyDayOfWeekReplicas.setMultivalues(null);
		zSchedulerProperties.put("dayofweekreplicas", zPropertyDayOfWeekReplicas);

		Hashtable<Object, Object> permitValueDayOfMonthReplicas = new Hashtable<Object, Object>();
		zProperties zPropertyDayOfMonthReplicas = new zProperties();
		permitValueDayOfMonthReplicas.clear();
		zPropertyDayOfMonthReplicas.setNameProperty("dayofmonthreplicas");
		zPropertyDayOfMonthReplicas.setLabelProperty("Day of Month of Snapshots [1-30]");
		zPropertyDayOfMonthReplicas.setType("nofreeentry");
		zPropertyDayOfMonthReplicas.setValue("");
		zPropertyDayOfMonthReplicas.setPermitValue(cronDayOfMonth);
		zPropertyDayOfMonthReplicas.setMultivalues(null);
		zSchedulerProperties.put("dayofmonthreplicas", zPropertyDayOfMonthReplicas);

		Hashtable<Object, Object> permitValueMonthReplicas = new Hashtable<Object, Object>();
		zProperties zPropertyMonthReplicas = new zProperties();
		permitValueMonthReplicas.clear();
		zPropertyMonthReplicas.setNameProperty("monthreplicas");
		zPropertyMonthReplicas.setLabelProperty("Month");
		zPropertyMonthReplicas.setType("nofreeentry");
		zPropertyMonthReplicas.setValue("");
		zPropertyMonthReplicas.setPermitValue(cronMonth);
		zPropertyMonthReplicas.setMultivalues(null);
		zSchedulerProperties.put("monthreplicas", zPropertyMonthReplicas);

		/*Hashtable<Object, Object> permitValueFreqSnapshots = new Hashtable<Object, Object>();
		zProperties zPropertyFreqSnapshots = new zProperties();
		permitValueFreqSnapshots.clear();
		zPropertyFreqSnapshots.setNameProperty("frequency");
		zPropertyFreqSnapshots.setLabelProperty("Frequency");
		zPropertyFreqSnapshots.setType("internaluse");
		zPropertyFreqSnapshots.setValue("");
		zPropertyFreqSnapshots.setPermitValue(null);
		zSchedulerProperties.put("frequency", zPropertyFreqSnapshots);*/


	}

	public void formatCronValue(String frequency, String DaySnapshot){
		String cronValue ="";

		if (frequency.contains("Hours")){
			this.zSchedulerProperties.get("minutesofsnaphots").setValue("*");
			this.zSchedulerProperties.get("hoursofsnaphots").setValue("*/"+frequency.replaceAll("Every", "").replaceAll("Hours", ""));
			this.zSchedulerProperties.get("dayofmonthsnapshots").setValue("*");
			this.zSchedulerProperties.get("monthsnapshots").setValue("*");
			this.zSchedulerProperties.get("dayofweeksnapshots").setValue("*");

		}else{
			this.zSchedulerProperties.get("hour").setValue(this.zSchedulerProperties.get("time").getValue().split(":")[0]);
			this.zSchedulerProperties.get("minutes").setValue(this.zSchedulerProperties.get("time").getValue().split(":")[1]);
			if (frequency.contains("Days")){
				this.zSchedulerProperties.get("dayofmonthsnapshots").setValue("*/"+frequency.replaceAll("Every", "").replaceAll("Days", ""));
				this.zSchedulerProperties.get("monthsnapshots").setValue("*");
				this.zSchedulerProperties.get("dayofweeksnapshots").setValue("*");

			}else{
				if (frequency.contains("Months")){
					this.zSchedulerProperties.get("dayofmonthsnapshots").setValue(this.zSchedulerProperties.get("dayofmonthsnapshots").getValue());
					this.zSchedulerProperties.get("monthsnapshots").setValue("*/"+frequency.replaceAll("Every", "").replaceAll("Months", ""));
					this.zSchedulerProperties.get("dayofweeksnapshots").setValue("*");

				}else{
					if (frequency.contains("Hour")){
						this.zSchedulerProperties.get("minutes").setValue("*");
						this.zSchedulerProperties.get("hours").setValue("*/"+frequency.replaceAll("Every", "").replaceAll("Hour", ""));
						this.zSchedulerProperties.get("dayofmonthsnapshots").setValue("*");
						this.zSchedulerProperties.get("monthsnapshots").setValue("*");
						this.zSchedulerProperties.get("dayofweeksnapshots").setValue("*");
					}else{
						if (frequency.contains("Day")){
							this.zSchedulerProperties.get("dayofmonthsnapshots").setValue("*/"+frequency.replaceAll("Every", "").replaceAll("Day", ""));
							this.zSchedulerProperties.get("monthsnapshots").setValue("*");
							this.zSchedulerProperties.get("dayofweeksnapshots").setValue("*");
						}else{
							if (frequency.contains("Month")){
								this.zSchedulerProperties.get("dayofmonthsnapshots").setValue(this.zSchedulerProperties.get("dayofmonthsnapshots").getValue());
								this.zSchedulerProperties.get("monthsnapshots").setValue("*/"+frequency.replaceAll("Every", "").replaceAll("Month", ""));
								this.zSchedulerProperties.get("dayofweeksnapshots").setValue("*");
							}
						}
					}
				}
			}
		}
	}

	public static int getIntDayOfWeek(String dayOfWeek)  
	{  
		try   
		{   
			DateFormat formatter ;   
			Date date ;   
			formatter = new SimpleDateFormat("EEE");  
			date = (Date)formatter.parse(dayOfWeek);    
			GregorianCalendar g = new GregorianCalendar();  
			g.setTime(date);  
			return g.get(Calendar.DAY_OF_WEEK);  
		}   
		catch (ParseException e)  
		{  
			System.out.println("Exception :"+e);    
		}    
		return 0;  
	}
	
	
	
	
	
}
