<?php

namespace Daniv04\HaciendaPackage\Services\Validators;

use Daniv04\HaciendaPackage\Rules\ServiceDetailRequired;

class ElectronicInvoiceValidatorService extends BaseReceiptValidatorService
{
    public static function rules(array $data): array
    {

        return array_merge(
            parent::rules($data),
            [

                //Specific rules for Electronic Invoice
                //Encabezado
                'Encabezado.CondicionVenta' => ['required', 'string', 'in:01,02,03,04,05,06,07,08,10,12,13,14,15,99'],
                'Encabezado.CodigoActividadEmisor' => ['required', 'string', 'size:6'],
                'Encabezado.CodigoActividadReceptor' => ['nullable', 'string', 'size:6'],
                //Emisor
                'Emisor.Ubicacion' => ['required', 'array'],
                //Receptor
                'Receptor.Identificacion.Tipo' => ['required_with:Receptor.Identificacion', 'string', 'in:01,02,03,04,05'],

                //DetalleServicio
                'DetalleServicio' => ['sometimes', new ServiceDetailRequired(), 'array'],
                'DetalleServicio.LineaDetalle.*.PartidaArancelaria' => ['prohibited'],

                //Informacion referencia
                'InformacionReferencia' => ['nullable', 'array', 'max:10'],

            ]
        );
    }

     public static function after($validator, array $data) : void
     {
       parent::after($validator, $data);
       $validator->after(function ($v) use ($data) {
           self::validateIdentificacionTipoReceptor($v, $data);
           self::validateInformacionReferencia($v, $data);
       });
     }
    

    //validate IdentificacionTipo Receptor based on CondicionVenta
    public static function validateIdentificacionTipoReceptor($validator, array $data)
    {
        $condicionVenta = $data['Encabezado']['CondicionVenta'] ?? null;
        $tipoIdentificacion = $data['Receptor']['Identificacion']['Tipo'] ?? null;

        if ($condicionVenta === '12') {
            $allowTypes = ['01', '02', '03', '04', '05'];
            if (!in_array($tipoIdentificacion, $allowTypes)) {
                $validator->errors()->add(
                    'Receptor.Identificacion.Tipo',
                    'Para esta Condición de Venta, el Tipo de Identificación del Receptor debe ser: 01, 02, 03, 04, 05'
                );
            }
        } else {
            $allowTypes = ['01', '02', '03', '04'];
            if (!in_array($tipoIdentificacion, $allowTypes)) {
                $validator->errors()->add(
                    'Receptor.Identificacion.Tipo',
                    'El Tipo de Identificación del Receptor debe ser: 01, 02, 03, 04'
                );
            }
        }
    }

    /** 
     *Validate InformacionReferencia is required when any Exoneracion has TipoDocumentoEX1 = 11
     */
    protected static function validateInformacionReferencia($validator, array $data)
    {
        $lines = $data['DetalleServicio']['LineaDetalle'] ?? [];
        $hasExoneracionTipo11 = false;
        foreach ($lines as $line) {
            $impuestos = $line['Impuesto'] ?? [];

            if (!is_array($impuestos)) {
                continue;
            }
            foreach ($impuestos as $impuesto) {
                $exoneracion = $impuesto['Exoneracion'] ?? null;

                if ($exoneracion && isset($exoneracion['TipoDocumentoEX1']) && $exoneracion['TipoDocumentoEX1'] === '11') {
                    $hasExoneracionTipo11 = true;
                    break 2;
                }
            }
        }
        if ($hasExoneracionTipo11) {
            $informacionReferencia = $data['InformacionReferencia'] ?? null;

            if (empty($informacionReferencia) || !is_array($informacionReferencia) || count($informacionReferencia) === 0) {
                $validator->errors()->add(
                    'InformacionReferencia',
                    'El campo InformacionReferencia es obligatorio cuando existe una Exoneración con TipoDocumentoEX1 igual a 11 (Resolución de exoneración).'
                );
            }
        }
    }
}