import { AbstractControl, ValidationErrors, ValidatorFn } from '@angular/forms';

export class GenericValidator {
    constructor() {}

    static isValidCpf(): ValidatorFn {
        return (control: AbstractControl): ValidationErrors | null => {
            const cpf = control.value;
            if (cpf) {
                let numbers, digits, sum, i, result, equalDigits;
                equalDigits = 1;
                if (cpf.length < 11) {
                    return { cpfNotValid: true };
                }

                for (i = 0; i < cpf.length - 1; i++) {
                    if (cpf.charAt(i) !== cpf.charAt(i + 1)) {
                        equalDigits = 0;
                        break;
                    }
                }

                if (!equalDigits) {
                    numbers = cpf.substring(0, 9);
                    digits = cpf.substring(9);
                    sum = 0;
                    for (i = 10; i > 1; i--) {
                        sum += Number(numbers.charAt(10 - i)) * i;
                    }

                    result = sum % 11 < 2 ? 0 : 11 - (sum % 11);

                    if (result !== Number(digits.charAt(0))) {
                        return { cpfNotValid: true };
                    }
                    numbers = cpf.substring(0, 10);
                    sum = 0;

                    for (i = 11; i > 1; i--) {
                        sum += Number(numbers.charAt(11 - i)) * i;
                    }
                    result = sum % 11 < 2 ? 0 : 11 - (sum % 11);

                    if (result !== Number(digits.charAt(1))) {
                        return { cpfNotValid: true };
                    }
                    return null;
                } else {
                    return { cpfNotValid: true };
                }
            }
            return null;
        };
    }
}



// export class CpfCnpjValidator {
//     static validateCpf(control: AbstractControl): ValidationErrors | null {
//       const cpf = control.value;
//       console.log('Validating CPF:', cpf);
//       if (!cpf) return null;
  
//       const cleanCpf = cpf.replace(/\D/g, '');
  
//       // Verifica se o CPF tem 11 dígitos, senão retorna null
//       if (cleanCpf.length !== 11) return null;
  
//       let sum = 0;
//       let remainder;
  
//       // Validação do primeiro dígito verificador
//       for (let i = 1; i <= 9; i++) {
//         sum += parseInt(cleanCpf.substring(i - 1, i)) * (11 - i);
//       }
  
//       remainder = (sum * 10) % 11;
//       if (remainder === 10 || remainder === 11) remainder = 0;
//       if (remainder !== parseInt(cleanCpf.substring(9, 10))) return { invalidCpf: true };
  
//       // Validação do segundo dígito verificador
//       sum = 0;
//       for (let i = 1; i <= 10; i++) {
//         sum += parseInt(cleanCpf.substring(i - 1, i)) * (12 - i);
//       }
  
//       remainder = (sum * 10) % 11;
//       if (remainder === 10 || remainder === 11) remainder = 0;
//       if (remainder !== parseInt(cleanCpf.substring(10, 11))) return { invalidCpf: true };
  
//       return null;
//     }
  


//   static validateCnpj(control: AbstractControl): ValidationErrors | null {
//     const cnpj = control.value;
//     if (!cnpj) return null;


//     const cleanCnpj = cnpj.replace(/\D/g, '');
//     if (cleanCnpj.length !== 14) return { invalidCnpj: true };

//     let length = cleanCnpj.length - 2;
//     let numbers = cleanCnpj.substring(0, length);
//     const digits = cleanCnpj.substring(length);
//     let sum = 0;
//     let pos = length - 7;
    
//     for (let i = length; i >= 1; i--) {
//       sum += parseInt(numbers.charAt(length - i)) * pos--;
//       if (pos < 2) pos = 9;
//     }

//     let result = sum % 11 < 2 ? 0 : 11 - sum % 11;
//     if (result !== parseInt(digits.charAt(0))) return { invalidCnpj: true };

//     length = length + 1;
//     numbers = cleanCnpj.substring(0, length);
//     sum = 0;
//     pos = length - 7;
    
//     for (let i = length; i >= 1; i--) {
//       sum += parseInt(numbers.charAt(length - i)) * pos--;
//       if (pos < 2) pos = 9;
//     }

//     result = sum % 11 < 2 ? 0 : 11 - sum % 11;
//     if (result !== parseInt(digits.charAt(1))) return { invalidCnpj: true };

//     return null;
//   }
// }