export namespace CNJValidator {
    export interface ValidationResult {
        valid: boolean;
        error?: string;
        processo?: {
            numeroCNJ: string;
            numeroIdentificador: string;
            digitoVerificador: string;
            anoProcesso: string;
            codigoJustica: string;
            tribunal: string;
            comarca: string;
        };
    }

    export function validate(numeroCNJ: string): ValidationResult {
        const cleanCNJ = numeroCNJ.replace(/[.\-_]/g, '');

        if (cleanCNJ.length !== 20) {
            return { valid: false, error: 'Erro! O número CNJ deve ter 20 caracteres após remover os caracteres inválidos.' };
        }

        const numeroIdentificador = cleanCNJ.substring(0, 7);
        const digitoVerificador = cleanCNJ.substring(7, 9);
        const anoProcesso = cleanCNJ.substring(9, 13);
        const codigoJustica = cleanCNJ.substring(13, 14);
        const tribunal = cleanCNJ.substring(14, 16);
        const comarca = cleanCNJ.substring(16, 20);

        const operacaoDV = Number(numeroIdentificador) % 97;
        const operacao1 = Number(`${operacaoDV}${anoProcesso}${codigoJustica}${tribunal}`) % 97;
        const operacao2 = Number(`${operacao1}${comarca}${digitoVerificador}`) % 97;

        if (operacao2 !== 1) {
            return { valid: false, error: 'Erro! O número CNJ informado não é válido.' };
        }

        return {
            valid: true,
            processo: {
                numeroCNJ: cleanCNJ,
                numeroIdentificador,
                digitoVerificador,
                anoProcesso,
                codigoJustica,
                tribunal,
                comarca,
            },
        };
    }
}
