<?php

namespace App\Helpers;

class IdentityValidator
{
    /**
     * Validar Cédula o RUC ecuatoriano
     */
    public static function validate($number)
    {
        if (empty($number)) {
            return false;
        }

        $len = strlen($number);

        if ($len === 10) {
            return self::validateCedula($number);
        } elseif ($len === 13) {
            return self::validateRuc($number);
        }

        return false;
    }

    /**
     * Algoritmo de validación de Cédula (Módulo 10)
     */
    public static function validateCedula($cedula)
    {
        if (strlen($cedula) !== 10) {
            return false;
        }
        if (! is_numeric($cedula)) {
            return false;
        }

        $provincia = (int) substr($cedula, 0, 2);
        if ($provincia < 1 || $provincia > 24) {
            // Permitir provincia 30 para extranjeros residentes
            if ($provincia !== 30) {
                return false;
            }
        }

        $tercerDigito = (int) $cedula[2];
        if ($tercerDigito >= 6) {
            return false;
        }

        $coeficientes = [2, 1, 2, 1, 2, 1, 2, 1, 2];
        $total = 0;

        for ($i = 0; $i < 9; $i++) {
            $valor = (int) $cedula[$i] * $coeficientes[$i];
            if ($valor >= 10) {
                $valor -= 9;
            }
            $total += $valor;
        }

        $verificador = (int) $cedula[9];
        $decenaSuperior = ceil($total / 10) * 10;
        $digitoCalculado = (int) ($decenaSuperior - $total);
        if ($digitoCalculado === 10) {
            $digitoCalculado = 0;
        }

        return $digitoCalculado === $verificador;
    }

    /**
     * Algoritmo de validación de RUC (Módulo 11 para Sociedades/Públicas, Módulo 10 para Personas)
     */
    public static function validateRuc($ruc)
    {
        if (strlen($ruc) !== 13) {
            return false;
        }
        if (! is_numeric($ruc)) {
            return false;
        }
        if (substr($ruc, 10, 3) === '000') {
            return false;
        }

        $tercerDigito = (int) $ruc[2];

        if ($tercerDigito < 6) {
            // Persona Natural (Módulo 10)
            return self::validateCedula(substr($ruc, 0, 10)) && substr($ruc, 10, 3) !== '000';
        } elseif ($tercerDigito === 6) {
            // Entidad Pública (Módulo 11)
            $coeficientes = [3, 2, 7, 6, 5, 4, 3, 2];
            $total = 0;
            for ($i = 0; $i < 8; $i++) {
                $total += (int) $ruc[$i] * $coeficientes[$i];
            }
            $verificador = (int) $ruc[8];
            $residuo = $total % 11;
            $digitoCalculado = ($residuo === 0) ? 0 : (11 - $residuo);

            return $digitoCalculado === $verificador;
        } elseif ($tercerDigito === 9) {
            // Sociedad Privada (Módulo 11)
            $coeficientes = [4, 3, 2, 7, 6, 5, 4, 3, 2];
            $total = 0;
            for ($i = 0; $i < 9; $i++) {
                $total += (int) $ruc[$i] * $coeficientes[$i];
            }
            $verificador = (int) $ruc[9];
            $residuo = $total % 11;
            $digitoCalculado = ($residuo === 0) ? 0 : (11 - $residuo);

            return $digitoCalculado === $verificador;
        }

        return false;
    }
}
