<?php
/**
 * Created by PhpStorm.
 * User: svycar
 * Date: 4/4/18
 * Time: 13:54
 */

namespace Shara\Reportes;


use DOMDocument;
use Exception;
use Shara\Util\FormGenerales;

class DatosReporte
{

    public static function getInfoTributaria(DOMDocument $documento)
    {
        $resp = null;
        try {
            $infoTri = $documento->getElementsByTagName('infoTributaria')->item(0);

            if ($infoTri != null) {

                $aux = array();

                if ($infoTri->childNodes->length) {
                    foreach ($infoTri->childNodes as $i) {
                        if ($i->nodeName != '#text')
                            $aux[$i->nodeName] = $i->nodeValue;
                    }
                }
                $resp = array('error' => false, 'infotri' => $aux);

            } else {
                $resp = array('error' => true, 'mensaje' => 'infoTributaria es nulo');
            }
        } catch (Exception $ex) {
            $resp = array('error' => true, 'mensaje' => $ex->getMessage());
        }
        return $resp;
    }

    public static function getInfoComprobante(DOMDocument $documento, $infoComprobante)
    {
        $resp = null;
        try {

            $info = $documento->getElementsByTagName($infoComprobante)->item(0);

            if ($info != null) {

                $aux = array();

                if ($info->childNodes->length) {
                    foreach ($info->childNodes as $i) {
                        if ($i->nodeName != '#text' && $i->nodeName != 'pagos' && $i->nodeName != 'totalConImpuestos')
                            $aux[$i->nodeName] = $i->nodeValue;
                    }
                }
                $resp = array('error' => false, 'infodoc' => $aux);

            } else {
                $resp = array('error' => true, 'mensaje' => $infoComprobante . ' es nulo');
            }
        } catch (Exception $ex) {
            $resp = array('error' => true, 'mensaje' => $ex->getMessage());
        }
        return $resp;
    }

    public static function getDetalleFactura(DOMDocument $documento)
    {
        $resp = null;
        try {

            $info = $documento->getElementsByTagName('detalle');

            if ($info->length) {
                foreach ($info as $name) {
                    $detalle = array();
                    if ($name->childNodes->length) {
                        foreach ($name->childNodes as $i) {
                            if ($i->nodeName != '#text' && $i->nodeName != 'impuestos') {
                                $detalle[$i->nodeName] = $i->nodeValue;
                            }
                        }
                    }
                    $detalles[] = $detalle;
                }

                $resp = array('error' => false, 'detalle' => $detalles);
            } else {
                $resp = array('error' => true, 'mensaje' => 'detalle de la factura es nulo o no se encontro');
            }

        } catch (Exception $ex) {
            $resp = array('error' => true, 'mensaje' => $ex->getMessage());
        }
        return $resp;
    }

    public static function getDestinatariosGuia(DOMDocument $documento)
    {
        $resp = null;
        try {

            $info = $documento->getElementsByTagName('destinatario');

            if ($info->length) {
                foreach ($info as $name) {
                    $destinatario = array();
                    if ($name->childNodes->length) {
                        foreach ($name->childNodes as $i) {
                            //if ($i->nodeName != '#text' && $i->nodeName != 'detalles') {
                            if ($i->nodeName != '#text') {
                                $destinatario[$i->nodeName] = $i->nodeValue;
                                if ($i->nodeName === 'detalles') {
                                    $detalle = $i->getElementsByTagName('detalle');
                                    if ($detalle->length) {
                                        $detalles = array();
                                        foreach ($detalle as $nameaux) {
                                            if ($nameaux->childNodes->length) {
                                                foreach ($nameaux->childNodes as $j) {
                                                    //if ($i->nodeName != '#text' && $i->nodeName != 'detalles') {
                                                    if ($j->nodeName != '#text') {
                                                        $detalleaux[$j->nodeName] = $j->nodeValue;
                                                    }
                                                }
                                                $detalles[] = $detalleaux;
                                            }
                                        }
                                        $destinatario['detalles'] = $detalles;
                                    }
                                }
                            }
                        }
                    }
                    $destinatarios[] = $destinatario;
                }

                $resp = array('error' => false, 'destinatario' => $destinatarios);
            } else {
                $resp = array('error' => true, 'mensaje' => 'destinatarios de la guia es nulo o no se encontro');
            }

        } catch (Exception $ex) {
            $resp = array('error' => true, 'mensaje' => $ex->getMessage());
        }
        return $resp;
    }

    public static function getImpuestosRetencion(DOMDocument $documento)
    {
        $resp = null;
        try {

            $info = $documento->getElementsByTagName('docSustento');

            $numDocSustento ="";
            $codDocSustento="";
            $fechaEmisionDocSustento="";
            if ($info->length) {
                foreach ($info as $name) {
                    $impuesto = array();
                    if ($name->childNodes->length) {
                        foreach ($name->childNodes as $i) {
                            if ($i->nodeName != '#text' && $i->nodeName != 'docsSustento') {
                                if($i->nodeName === 'numDocSustento')
                                    $numDocSustento  = $i->nodeValue;
                                else if($i->nodeName === 'codDocSustento')
                                    $codDocSustento  = $i->nodeValue;
                                else if($i->nodeName === 'fechaEmisionDocSustento')
                                    $fechaEmisionDocSustento  = $i->nodeValue;
                            }
                        }
                    }
                }
            }

            $info = $documento->getElementsByTagName('retencion');

            if ($info->length) {
                foreach ($info as $name) {
                    $impuesto = array();
                    if ($name->childNodes->length) {
                        foreach ($name->childNodes as $i) {
                            if ($i->nodeName != '#text' && $i->nodeName != 'retenciones') {
                                $impuesto['numDocSustento'] = $numDocSustento;
                                $impuesto['fechaEmisionDocSustento'] = $fechaEmisionDocSustento;
                                $impuesto['codDocSustento'] = $codDocSustento;
                                $impuesto[$i->nodeName] = $i->nodeValue;
                            }
                        }
                    }
                    if($impuesto["codigo"] === '1')
                        $impuesto["codigo"] = 'RENTA';
                    if($impuesto["codigo"] === '2')
                        $impuesto["codigo"] = 'IVA';
                    if($impuesto["codDocSustento"] === '01')
                        $impuesto["codDocSustento"] = 'FACTURA';
                    if($impuesto["codDocSustento"] === '03')
                        $impuesto["codDocSustento"] = 'LIQ. COMPRA';

                    $impuestos[] = $impuesto;
                }

                $resp = array('error' => false, 'impuestos' => $impuestos);
            } else {
                $resp = array('error' => true, 'mensaje' => 'impuestos de la retencion es nulo o no se encontro');
            }

        } catch (Exception $ex) {
            $resp = array('error' => true, 'mensaje' => $ex->getMessage());
        }
        return $resp;
    }


    public static function getPagos(DOMDocument $documento)
    {
        $resp = null;
        try {

            $info = $documento->getElementsByTagName('pago');

            if ($info->length) {
                foreach ($info as $name) {
                    $pago = array();
                    if ($name->childNodes->length) {
                        foreach ($name->childNodes as $i) {
                            if ($i->nodeName != '#text') {
                                if ($i->nodeName === 'formaPago')
                                    $nodeValue = FormGenerales::obtenerDetalleFormaPago($i->nodeValue);
                                else
                                    $nodeValue = $i->nodeValue;
                                $pago[$i->nodeName] = $nodeValue;
                            }
                        }
                    }
                    $pagos[] = $pago;
                }

                $resp = array('error' => false, 'pagos' => $pagos);
            } else {
                $resp = array('error' => true, 'mensaje' => 'informacion pagos es nulo o no se encontro');
            }

        } catch (Exception $ex) {
            $resp = array('error' => true, 'mensaje' => $ex->getMessage());
        }
        return $resp;
    }

    public static function getImpuestosFactura(DOMDocument $documento)
    {
        $resp = null;
        try {

            $info = $documento->getElementsByTagName('totalImpuesto');

            if ($info->length) {
                foreach ($info as $name) {
                    $impuesto = array();
                    if ($name->childNodes->length) {
                        foreach ($name->childNodes as $i) {
                            if ($i->nodeName != '#text') {
                                $impuesto[$i->nodeName] = $i->nodeValue;
                            }
                        }
                    }
                    $impuestos[] = $impuesto;
                }

                $resp = array('error' => false, 'impuestos' => $impuestos);
            } else {
                $resp = array('error' => true, 'mensaje' => 'informacion impuestos es nulo o no se encontro');
            }

        } catch (Exception $ex) {
            $resp = array('error' => true, 'mensaje' => $ex->getMessage());
        }
        return $resp;
    }

    public static function getInfoAdicional(DOMDocument $documento)
    {
        $resp = null;
        try {

            $info = $documento->getElementsByTagName('infoAdicional')->item(0);

            if ($info != null) {

                $aux = array();

                if ($info->childNodes->length) {
                    foreach ($info->childNodes as $i) {
                        if ($i->nodeName != '#text')
                            $aux[$i->getAttribute('nombre')] = $i->nodeValue;
                    }

                }
                $resp = array('error' => false, 'infoadici' => $aux);

            }
        } catch (Exception $ex) {
            $resp = array('error' => true, 'mensaje' => $ex->getMessage());
        }
        return $resp;
    }

    static function getAttachableNodeByAttributeName(\DOMElement $parent = null, string $elementTagName = null, string $attributeName = null, string $attributeValue = null)
    {
        $returnNode = null;

        $needleDOMNode = $parent->getElementsByTagName($elementTagName);

        $length = $needleDOMNode->length;
        //traverse through each existing given node object
        for ($i = $length; --$i >= 0;) {

            $needle = $needleDOMNode->item($i);

            //only one DOM node and no attributes specified?
            if (!$attributeName && !$attributeValue && 1 === $length) return $needle;
            //multiple nodes and attributes are specified
            elseif ($attributeName && $attributeValue && $needle->getAttribute($attributeName) === $attributeValue) return $needle;
        }

        return $returnNode;
    }

    public static function getDetalleReembolso(DOMDocument $documento)
    {
        $resp = null;
        try {



            $info = $documento->getElementsByTagName('reembolsoDetalle');

            if ($info->length) {
                foreach ($info as $name) {
                    $detalle = array();
                    if ($name->childNodes->length) {
                        foreach ($name->childNodes as $i) {
                            if ($i->nodeName != '#text') {
                                $detalle[$i->nodeName] = $i->nodeValue;

                                if($i->nodeName === 'detalleImpuestos'){

                                    $impuestos = self::getAttachableNodeByAttributeName($i, 'detalleImpuesto');

                                    foreach ($impuestos->childNodes as $j)
                                        if ($j->nodeName != '#text' && $j->nodeName != 'detalleImpuesto') {
                                            if($j->nodeName === 'codigo')
                                                $detalle[$j->nodeName] = 'IVA';
                                            else if($j->nodeName === 'codigoPorcentaje') {
                                                if ($j->nodeValue === '2')
                                                    $detalle[$j->nodeName] = '12 %';
                                                else if ($j->nodeValue === '0')
                                                    $detalle[$j->nodeName] = '0 %';
                                            }
                                            else
                                                $detalle[$j->nodeName] = $j->nodeValue;

                                        }
                                }
                            }
                        }
                    }
                    try{
                        $detalle['total'] = floatval($detalle['baseImponibleReembolso'])+floatval($detalle['impuestoReembolso']);

                    }
                    catch (Exception $ex){

                    }
                    $detalles[] = $detalle;
                }

                $resp = array('error' => false, 'detalle' => $detalles);
            } else {
                $resp = array('error' => true, 'mensaje' => 'detalle de reembolsos es nulo o no se encontro');
            }

        } catch (Exception $ex) {
            $resp = array('error' => true, 'mensaje' => $ex->getMessage());
        }
        return $resp;
    }


}
