package common.utility;

import java.util.regex.Pattern;

public class CodiceFiscale {

	public static final int CF_OK = 0;
	public static final int CF_LENGTH_ERR = 1;
	public static final int CF_INVALID_CHAR = 2;
	public static final int CF_INVALID_CHECKCODE = 3;
	
//	public static int ControllaCF(String cf) {
//		int i,j;
//		int appoNum, tempNum, sommaNumero;
//		String checkDigit;
//		
//		if (cf==null)
//			return CF_LENGTH_ERR;
//		
//		cf = cf.trim();
//		
//		if (cf.length()!=16 || cf.length()!=11)
//			return CF_LENGTH_ERR;
//		
//		
//		if (cf.length()==16) {
//			//Controllo maschera formato
//            
//            // CCC NNN AA M GG L VVV K
//            // XXX XXX 99 X 99 X XXX X
//			if (isAlpha(cf.substring(0,6)) && isNumeric(cf.substring(6,8)) && 
//				isAlpha(cf.substring(8,9)) && isNumeric(cf.substring(9,11)) &&
//				isAlpha(cf.substring(11,12)) && isNumeric(cf.substring(12, 15)) &&
//				isAlpha(cf.substring(15,16))) {
//				tempNum = 0;
//				i = 1;
//				do {
//					appoNum = "B1A0KKPPLLC2QQD3RRE4VVOOSSF5TTG6UUH7MMI8NNJ9WWZZYYXX".indexOf(cf.substring(i,i+1));
//					tempNum = tempNum + ((appoNum-1) & 0x7FFE) / 2;
//					i++;
//					if (i>15)
//						break;
//					
//					appoNum = "A0B1C2D3E4F5G6H7I8J9KKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ".indexOf(cf.substring(i,i+1));
//					tempNum = tempNum + ((appoNum-1) & 0x7FFE) / 2;
//					i++;
//					
//				} while (false);
//				
//				tempNum = tempNum % 26;
//				checkDigit = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".substring(tempNum, tempNum+1);
//				
//				if (!checkDigit.equals(cf.substring(15))) {
//					return CF_INVALID_CHECKCODE;
//				}
//			}
//		}
//		
//	}
//	
//	private static boolean isAlpha (String str) {
//		return Pattern.matches(".*[a-zA-Z]+.*[a-zA-Z]", str);
//	}
//	
//	private static boolean isNumeric (String str) {
//		return str.matches("^[0-9]+$");
//	}
	
	public static int ControllaCF(String cf) {
		
		if (cf.length()==16) {
			int i, s, c;
		    String cf2;
		    int setdisp[] = {1, 0, 5, 7, 9, 13, 15, 17, 19, 21, 2, 4, 18, 20,
		        11, 3, 6, 8, 12, 14, 16, 10, 22, 25, 24, 23 };
	
		    if( cf.length() != 16 )
		        return CF_LENGTH_ERR;
		    
		    cf2 = cf.toUpperCase();
		    for( i=0; i<16; i++ ){
		        c = cf2.charAt(i);
		        if( ! ( c>='0' && c<='9' || c>='A' && c<='Z' ) )
		            return CF_INVALID_CHAR;
		    }
		    s = 0;
		    for( i=1; i<=13; i+=2 ){
		        c = cf2.charAt(i);
		        if( c>='0' && c<='9' )
		            s = s + c - '0';
		        else
		            s = s + c - 'A';
		    }
		    for( i=0; i<=14; i+=2 ){
		        c = cf2.charAt(i);
		        if( c>='0' && c<='9' )     c = c - '0' + 'A';
		        s = s + setdisp[c - 'A'];
		    }
		    if( s%26 + 'A' != cf2.charAt(15) )
		        return CF_INVALID_CHECKCODE;
		    return CF_OK;
		} else if (cf.length()==11 ) {
			
			int i, c, s;
			if( cf.length() == 0 )  return CF_LENGTH_ERR;

			for( i=0; i<11; i++ ){
				if( cf.charAt(i) < '0' || cf.charAt(i) > '9' )
					return CF_INVALID_CHAR;
			}
			s = 0;
			for( i=0; i<=9; i+=2 )
				s += cf.charAt(i) - '0';
			for( i=1; i<=9; i+=2 ){
				c = 2*( cf.charAt(i) - '0' );
				if( c > 9 )  c = c - 9;
				s += c;
			}
			if( ( 10 - s%10 )%10 != cf.charAt(10) - '0' )
				return CF_INVALID_CHECKCODE;
			
			return CF_OK;
			
		} else
			return CF_LENGTH_ERR;
	}
}