<?php

namespace Daniv04\HaciendaPackage\Services\Validators;

use Daniv04\HaciendaPackage\Rules\ServiceDetailRequired;

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

        return array_merge(
            parent::rules($data),
            [
                //Specific rules for Electronic Purchase Invoice
                //Encabezado
                'Encabezado.CodigoActividadReceptor' => ['required', 'string', 'size:6'],
                //Emisor 
                'Emisor.Identificacion.Tipo' => ['required', 'string'],
                'Emisor.Ubicacion' => ['nullable', 'array'],
                'Emisor.OtrasSenasExtranjero' => ['required_if:Emisor.Identificacion.Tipo,05', 'string', 'min:5', 'max:300'],
                'Emisor.CorreoElectronico' => ['nullable', 'array', 'max:4'],
                //Receptor

                'Receptor.OtrasSenasExtranjero' => ['prohibited'],


                //DetalleServicio
                'DetalleServicio.LineaDetalle.*.PartidaArancelaria' => ['prohibited'],
                'DetalleServicio.LineaDetalle.*.IVACobradoFabrica' => ['prohibited'],
                'DetalleServicio.LineaDetalle.*.ImpuestoAsumidoEmisorFabrica' => ['prohibited'],
                'DetalleServicio.LineaDetalle.*.Impuesto.*.DatosImpuestoEspecifico' => ['prohibited'],
                'DetalleServicio.LineaDetalle.*.Impuesto.*.DatosImpuestoEspecifico.CantidadUnidadMedida' => ['prohibited'],
                'DetalleServicio.LineaDetalle.*.Impuesto.*.DatosImpuestoEspecifico.Proporcion' => ['prohibited'],
                'DetalleServicio.LineaDetalle.*.Impuesto.*.DatosImpuestoEspecifico.Porcentaje' => ['prohibited'],
                'DetalleServicio.LineaDetalle.*.Impuesto.*.DatosImpuestoEspecifico.VolumenUnidadConsumo' => ['prohibited'],
                'DetalleServicio.LineaDetalle.*.Impuesto.*.DatosImpuestoEspecifico.ImpuestoUnidad' => ['prohibited'],

                //ResumenFactura
                'ResumenFactura.TotalIVADevuelto' => ['prohibited'],

                //informacion referencia
                'InformacionReferencia.*.TipoDocIR' => ['required_with:InformacionReferencia', 'string', 'in:01,02,03,04,05,06,07,08,09,10,11,12,14,15,16,17,18,99'],

            ]
        );
    }

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


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

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