import javax.swing.*;
import java.util.Vector;

public class Funcoes {


	//////////////////////////////////////////////////////////////////////////////////////////////////////
	//   CCCCCC  GGGGGG  CCCCCC
	//   C       G    G  C
	//   C       G       C
	//   C       G GGGG  C
	//   C       G    G  C 
	//   C       G    G  C
	//   CCCCCC  GGGGGG  CCCCCC
	//////////////////////////////////////////////////////////////////////////////////////////////////////
		
	public static boolean checaCGC(String nCGC) {
		
		/*
		
		Algoritmo do Cálculo dos Dígitos verificadores para CGC


		Exemplo:
		
			57.006.264/0001-70		
			
			Calcular o primeiro dígito verificador
			
				Multiplicar da direita para a esquerda:
			
				Soma =	5*5 + 4*7 + 3*0 + 2*0 +  9*6 + 8*2 + 7*6 + 6*4 + 5*0 + 4*0 + 3*0 + 2*1
			
				Soma = 191
	
				soma / 11

				191 / 11 = 17
			
				Resto = 4
	
				Se resto = 0 ou 1 então DV1 = 0
							
				Se resto <> 0 ou 1 então DV1 = 11 - resto => (11 - 4) = DV1 = 7
			

			Calcular o segundo dígito verificador (o primeiro DV entra no cálculo)

				Multiplicar da direita para a esquerda:
			
				Soma =	6*5 + 5*7 + 4*0 + 3*0 +  2*6 + 9*2 + 8*6 + 7*4 + 6*0 + 5*0 + 4*0 + 3*1 + 2*7
			
				Soma = 188
	
				soma / 11

				188 / 11 = 17
			
				Resto = 1
	
				Se resto = 0 ou 1 então DV2 = 0
							
				Se resto <> 0 ou 1 então DV2 = 11 - resto
				
				DV2 = 0
					
		*/
		///////////////////////////////////////////////////////////////////////////////////////
		
		// Se o tamanho do CGC estiver correto
		
		if (nCGC.length() == 14)
		{				
			int num [] = new int[14];
			
			// dígitos verificadores
			int dv1, dv2;
			
			// auxiliares no cálculo
			int soma, resto;
		  
		  // guarda os números em um vetor de inteiros para cálculos posteriores
			for (int i = 0; i < 14; i++) num [i] = Integer.parseInt(nCGC.substring(i,i+1));
			
			// calcula o primeiro dígito verificador
			
			soma = 5*num[0] + 4*num[1] + 3*num[2] + 2*num[3] +  9*num[4] + 8*num[5] + 7*num[6] + 6*num[7] + 5*num[8] + 4*num[9] + 3*num[10] + 2*num[11];

			resto = soma % 11;
			
			if ((resto == 0) || (resto == 1)) dv1 = 0;
				else dv1 = 11 - resto;
			
			// verifica se o primeiro dígito verificador está correto
			if (dv1 == num[12])
			{				
				// calcula o segundo dígito verificador
			
				soma = 6*num[0] + 5*num[1] + 4*num[2] + 3*num[3] +  2*num[4] + 9*num[5] + 8*num[6] + 7*num[7] + 6*num[8] + 5*num[9] + 4*num[10] + 3*num[11] + 2*num[12];
				
				resto = soma % 11;
			
				if ((resto == 0) || (resto == 1)) dv2 = 0;
					else dv2 = 11 - resto;

				if (dv2 == num[13]) return true;
				else return false;
				
			}
			else return false;
			
		}
		else return false;
	}
	
	//////////////////////////////////////////////////////////////////////////////////////////////////////
	//   CCCCCC  PPPPPP  FFFFFF
	//   C       P    P  F
	//   C       P    P  F
	//   C       PPPPPP  FFFFFF
	//   C       P       F 
	//   C       P       F
	//   CCCCCC  P       F
	//////////////////////////////////////////////////////////////////////////////////////////////////////
	
	public static boolean checaCPF(String nCPF) {
		
		/*
		
		Algoritmo do Cálculo dos Dígitos verificadores para CPF


		Exemplo:
		
			785.184.909-87
			
			Calcular o primeiro dígito verificador
			
				Multiplicar da direita para a esquerda:
			
				Soma =	10*7 + 9*8 + 8*5 + 7*1 +  6*8 + 5*4 + 4*9 + 3*0 + 2*9
			
				Soma = 311
	
				Soma / 11

				311 / 11 = 28
			
				Resto = 3
	
				Se Resto > 9 DV1 = 0
							
				Se <= 9 DV1 = 11 - Resto => (11 - 3) = DV1 = 8
			

			Calcular o segundo dígito verificador (o primeiro DV entra no cálculo)

				Multiplicar da direita para a esquerda:
			
				Soma =	11*7 + 10*8 + 9*5 + 8*1 +  7*8 + 6*4 + 5*9 + 4*0 + 3*9 + 2*8
			
				Soma = 378
	
				Soma / 11

				378 / 11 = 34
			
				Resto = 4
	
				Se Resto > 9 DV2 = 0
							
				Se <= 9 DV2 = 11 - Resto => (11 - 4) = DV2 = 7				
					
		*/
		///////////////////////////////////////////////////////////////////////////////////////
		
		// Se o tamanho do CPF estiver correto
		
		if (nCPF.length() == 11)
		{				
			int num [] = new int[11];
			
			// dígitos verificadores
			int dv1, dv2;
			
			// auxiliares no cálculo
			int soma, resto;
		  
		  // guarda os números em um vetor de inteiros para cálculos posteriores
			for (int i = 0; i < 11; i++) num [i] = Integer.parseInt(nCPF.substring(i,i+1));
			
			// calcula o primeiro dígito verificador
			
	  	soma = 10*num[0] + 9*num[1] + 8*num[2] + 7*num[3] + 6*num[4] + 5*num[5] + 4*num[6] + 3*num[7] + 2*num[8];

			resto = soma % 11;
			
			if (resto > 9) dv1 = 0;
				else dv1 = 11 - resto;
			
			// verifica se o primeiro dígito verificador está correto
			if (dv1 == num[9])
			{				
				// calcula o segundo dígito verificador
			
				soma = 11*num[0] + 10*num[1] + 9*num[2] + 8*num[3] + 7*num[4] + 6*num[5] + 5*num[6] + 4*num[7] + 3*num[8] + 2*num[9];
				
				resto = soma % 11;
			
				if (resto > 9) dv2 = 0;
					else dv2 = 11 - resto;
			
				if (dv2 == num[10]) return true;
				else return false;
				
			}
			else return false;
			
		}
		else return false;
	}

	