package it.dedagroup.test;

import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class VerificaChiave {
	
	public static boolean verificaChiave(String chiaveRicevuta, String chiaveConfigurazione) {
		final SimpleDateFormat sdf = new SimpleDateFormat("YYYYMMdd");
		String timeStamp = sdf.format(System.currentTimeMillis());
		String hash = sha256(chiaveConfigurazione + timeStamp);

		if (hash.equals(chiaveRicevuta)) {
			return true;
		}
		
		Calendar cal = Calendar.getInstance();
		cal.setTime(new Date());
		int hour = cal.get(Calendar.HOUR_OF_DAY);
		if(hour >= 23 || hour <= 1){
			//controllo la chiave sul giorno successivo, potrei essere in prossimita' della mezzanotte
			Calendar c = Calendar.getInstance();
			c.add(Calendar.DATE, 1);
			timeStamp = sdf.format(c.getTime());
			String hashGiornoSuccessivo = sha256(chiaveConfigurazione + timeStamp);
			
			if (hashGiornoSuccessivo.equals(chiaveRicevuta)) {
				return true;
			}
			
			//controllo la chiave sul giorno precedente, potrei essere in prossimita' della mezzanotte
			c = Calendar.getInstance();
			c.add(Calendar.DATE, -1);
			timeStamp = sdf.format(c.getTime());
			String hashGiornoPrecedente = sha256(chiaveConfigurazione + timeStamp);
			
			if (hashGiornoPrecedente.equals(chiaveRicevuta)) {
				return true;
			}
		}
		
		return false;
	}
	
	private static String sha256(String base) {
		try {
			MessageDigest digest = MessageDigest.getInstance("SHA-256");
			byte[] hash = digest.digest(base.getBytes(StandardCharsets.UTF_8));
			StringBuilder hexString = new StringBuilder();

			for (byte hash1 : hash) {
				String hex = Integer.toHexString(0xff & hash1);
				if (hex.length() == 1) {
					hexString.append('0');
				}
				hexString.append(hex);
			}
			return hexString.toString();
		} catch (Exception ex) {
			throw new RuntimeException(ex);
		}
	}
	
	public static String generaChiave(String chiave) {
		String timeStamp = new SimpleDateFormat("YYYYMMdd").format(System.currentTimeMillis());
		String hash = sha256(chiave + timeStamp);
		return hash;
	}
}
