<?php
 
namespace Daniv04\HaciendaPackage\Rules;
 
use Closure;
use Illuminate\Contracts\Validation\ValidationRule;
 
class ValidateId implements ValidationRule
{
    protected ?string $type;

    public function __construct(?string $type)
    {
        $this->type = $type;
    }
    
    /**
     * validate identification number based on type
     * 
     * @param string $attribute The attribute name
     * @param mixed $value Identification number
     * @param Closure $fail Callback 
     */
    public function validate(string $attribute, mixed $value, Closure $fail): void
    {
        // Si el tipo es null, permitir que otras reglas lo validen
        if ($this->type === null) {
            return;
        }

        $number = (string) $value;
        $type = $this->type;
        
        switch ($type) {
            case '01': // Cédula Física
                if (!preg_match('/^[1-9]\d{8}$/', $number)) {
                    $fail('La cédula física debe tener exactamente 9 dígitos numéricos y sin 0 al inicio.');
                }
                break;
                
            case '02': // Cédula Jurídica
                if (!preg_match('/^\d{10}$/', $number)) {
                    $fail('La cédula jurídica debe tener exactamente 10 dígitos numéricos.');
                }
                break;
                
            case '03': // DIMEX
                if (!preg_match('/^[1-9]\d{10,11}$/', $number)) {
                    $fail('El DIMEX debe tener entre 11 y 12 dígitos numéricos.');
                }
                break;
                
            case '04': // NITE
                if (!preg_match('/^\d{10}$/', $number)) {
                    $fail('El NITE debe tener exactamente 10 dígitos numéricos.');
                }
                break;
            case '05':
                if(!preg_match('/^[a-zA-Z0-9\s-]{1,20}$/', $number)) {
                    $fail('El número de identificación del extranjero no domiciliario no es válido.');
                }
                break;
            case '06':
                if(!preg_match('/^[a-zA-Z0-9\s-]{1,20}$/', $number)) {
                    $fail('El número de identificación del no contribuyente no es válido.');
                }
                break;
        }
    }
}