package utils;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

import org.apache.commons.lang.StringUtils;

public class CommonFunctions {

	/// <summary>
	/// Check if a String in ONLY number
	/// </summary>
	/// <param name="theValue">String to check</param>
	/// <returns></returns>
	public static Boolean IsInteger(String theValue)
	{
		int res;
		try {
			int i = Integer.parseInt(theValue);
			return true;
		} catch (Exception ex) {
			return false;
		}		
	}

	/// <summary>
	/// Controlla se la data fornita è esatta
	/// </summary>
	/// <param name="day">Giorno</param>
	/// <param name="month">Mese</param>
	/// <param name="year">Anno</param>
	/// <returns>False se la data è invalida</returns>
	public static boolean IsDate( int day, int month, int year ) 
	{
		boolean isDate = true;
		try 
		{
			  Calendar calendar = GregorianCalendar.getInstance();
			    calendar.set(Calendar.DAY_OF_MONTH, day);
			    calendar.set(Calendar.MONTH, month);
			    calendar.set(Calendar.YEAR, year);
			    calendar.set(Calendar.MILLISECOND, 0);
			    calendar.set(Calendar.SECOND, 0);
			    calendar.set(Calendar.MINUTE, 0);
			    calendar.set(Calendar.HOUR_OF_DAY, 0);
		}
		catch (Exception ex)
		{
			isDate = false;
		} 
		return isDate;
	} 

	/// <summary>
	/// Check if a String in a double
	/// </summary>
	/// <param name="theValue">String to check</param>
	/// <returns></returns>
	public static boolean Double(String theValue)
	{
		double res;
		try {
			Double.parseDouble(theValue);
			return true;
		} catch(Exception ex) {
			return false;
		}
	}

	//public static StatoSezione OrOperation( StatoSezione op1, StatoSezione op2 )
	//{
	//  if( op1 == StatoSezione.StatoRosso || op2 == StatoSezione.StatoRosso )
	//    return StatoSezione.StatoRosso;

	//  if( op1 == StatoSezione.StatoGiallo || op2 == StatoSezione.StatoGiallo )
	//    return StatoSezione.StatoGiallo;

	//  return StatoSezione.StatoVerde;
	//}

	public static String NumToLet(BigDecimal numero)
	{
		// Stringa da restituire
		String lettere = "";
		// conversione in Stringa lunga 21 caratteri comunque
		String snumero = String.format("%21s",numero.toString());
		// verifica se numero troppo lungo (forma esponenziale)
		int i = snumero.indexOf("E");
		if (i != -1)
			throw new NumberFormatException("Numero troppo lungo per essere convertito");
		// verifica dei decimali
		BigDecimal decimali =numero.subtract(numero.setScale(0, RoundingMode.DOWN));
		if (decimali.compareTo(BigDecimal.ZERO) > 0)
		{
			// se ci sono vengono letti e separati
			snumero = decimali.toString().substring(2);
			lettere = (NumToLet(numero.setScale(0, RoundingMode.DOWN)) + " e " +
				NumToLet(BigDecimal.valueOf(Double.valueOf(snumero))));
		}
		else
		{
			// verifica se zero
			if (numero.compareTo(BigDecimal.ZERO)==0)
				lettere = "zero";
			else
			{
				// formattazione a 21 caratteri per avere comunque tutti i gruppi
				snumero = StringUtils.leftPad(snumero,21,"0");
				String terzina;
				byte groups = 0;
				// per ogni gruppo estraggo e risolvo la terzina ed il gruppo
				for (i = 0; i <= 18; i += 3)
				{
					groups += 1;
					terzina = snumero.substring(i, 3);
					if (Integer.parseInt(terzina) > 0)
						lettere += RisolviTerzina(terzina) + GrpToParola(groups, (Integer.parseInt(terzina) == 1));
				}
			}
		}
		return lettere;
	}

	// versione per Euro (max 2 decimali, non convertiti in lettere)
	public static String EurToLet(Double numero)
	{
		DecimalFormat df = new DecimalFormat("0.00");
		
		return df.format(numero).replace('.','/');
	}

	private static String ToProper(String Stringa)
	{
		return Stringa.substring(0, 1).toUpperCase() + Stringa.substring(1).toUpperCase();
	}

	// traduce una terzina di cifre in lettere
	private static String RisolviTerzina(String cifre)
	{
		// caso particolare
		if (Integer.parseInt(cifre) == 1)
			return "";
		else
		{
			byte cifra1 = Byte.parseByte(cifre.substring(0, 1));
			byte cifra2 = Byte.parseByte(cifre.substring(1,1));
			byte cifra3 = Byte.parseByte(cifre.substring(2,1));
			String lettere = "";
			String depo = "cento";
  
			// prima cifra
			if (cifra1 == 1) 
				lettere = depo;
			if (cifra1 > 1)
				lettere = NumToParola(cifra1) + depo;

			// seconda cifra: test per troncare l'ultima vocale
			if( cifra2 > 0 ) depo = NumToParola((byte)(cifra2 * 10));

			if ((cifra2 > 1) & ((cifra3 == 1) | (cifra3 == 8)))
				lettere += depo.substring(0, depo.length() - 1);
			else if ((cifra2 > 1) & (cifra3 > 1))
				lettere += depo;

			else if (cifra2 > 0)
			{
				lettere += NumToParola((byte)(cifra2 * 10 + cifra3));
				cifra3 = 0; // in quanto già elaborata
			}
  
			// terza cifra
			if (cifra3 > 0)
				lettere += NumToParola(cifra3);

			return ToProper(lettere);
		}
	}

	// restituisce la parola corrispondente alla cifra
	private static String NumToParola(byte cifra)
	{
		if (cifra <= 19)
			return (new String[] {
														 "uno","due","tre","quattro","cinque","sei","sette","otto",
														 "nove","dieci","undici","dodici","tredici","quattordici",
														 "quindici","sedici","diciassette","diciotto","diciannove"
													 }
				)[cifra-1];
		else
			return (new String[] {
														 "venti","trenta","quaranta","cinquanta","sessanta","settanta",
														 "ottanta","novanta"
													 }
				)[cifra/10-2];
	}

	// restituisce la parola corrispondente al gruppo
	private static String GrpToParola(byte grp, Boolean uno)
	{
		if (uno)
			return (new String[] {
														 "Unmiliardodimiliardi","Unmilionedimiliardi","Millemiliardi",
														 "Unmiliardo","Unmilione","Mille","Uno"
													 }
				)[grp-1];
		else
			return (new String[] {
														 "miliardidimiliardi","milionidimiliardi","milamiliardi",
														 "miliardi","milioni","mila",""
													 }
				)[grp-1];
	}

}
