<?php

namespace App\Services;

use DOMDocument;
use App\Libraries\SafekatFtpClient;
use CodeIgniter\Config\BaseService;
use App\Models\Pedidos\PedidoModel;
use App\Models\Presupuestos\PresupuestoModel;

class PedidoXMLService extends BaseService
{

    public static function get_pedido_presupuesto(int $pedido_id)
    {
        $data_xml = [];
        $pedidoModel  = model(PedidoModel::class);
        $presupuestoModel  = model(PresupuestoModel::class);
        $data_xml['pedido_cliente_presupuesto'] =  $pedidoModel->getPedidoClientePresupuesto($pedido_id);
        $data_xml['pedido_presupuesto_direcciones'] =  $pedidoModel->getPedidoPresupuestoDirecciones($pedido_id);
        $data_xml['pedido_presupuesto_lineas'] =  $pedidoModel->getPedidoPresupuestoLineas($pedido_id);
        $servicios =  $presupuestoModel->getServiciosPresupuesto($data_xml['pedido_cliente_presupuesto']->presupuestoId);
        $data_xml['servicios'] = $servicios;
        $data_xml['preimpresion'] = PedidoXMLService::parse_servicio_preimpresion($servicios['preimpresion']);
        $data_xml["acabado"] = PedidoXMLService::parse_servicio_acabado($servicios['acabado']);
        $data_xml["binding"] = PedidoXMLService::get_binding_code($data_xml['pedido_cliente_presupuesto']->codigoTipoImpresion,$data_xml['pedido_cliente_presupuesto']->solapas);
        return $data_xml;
        
    }
    protected static function parse_servicio_acabado(array $data_xml_servicios_acabado)
    {
        $xml_element = [];
        $service_xml_key_value = [
            "ShrinkWrapping" => fn($nombre) => str_contains($nombre,"retractilado"),
            "Finish" => fn($nombre) => str_contains($nombre,"brillo"),
            "PlakeneT" =>fn($nombre) => str_contains($nombre,"plakene traslúcido"),];
        foreach($data_xml_servicios_acabado as $servicio_acabado)
        {
            $service_name = strtolower($servicio_acabado->nombre);
            foreach ($service_xml_key_value as $key => $value) {
                $xml_element[$key] =  $value($service_name) ? 1 : 0 ;
            }

        }
        return $xml_element;
    }
    protected static function parse_servicio_preimpresion(array $data_xml_servicios_preimpresion)
    {
        $xml_element = [];
        $service_xml_key_value = [
            "Urgent" => fn($nombre) => str_contains($nombre,"Pedido urgente"),
            "Prototype" => fn($nombre) => str_contains($nombre,"Prototipo"),
            "Layout" =>fn($nombre) => str_contains($nombre,"Maquetación"),
            "Correction" =>fn($nombre) => str_contains($nombre,"Corrección ortográfica"),
            // "Review" =>fn($nombre) => str_contains($nombre,"Revisión Profesional de archivo"),
            "Design" =>fn($nombre) => str_contains($nombre,'Diseño de Cubierta'),
        ];
        foreach($data_xml_servicios_preimpresion as $servicio_pre)
        {
            $service_name = $servicio_pre->nombre;
            foreach ($service_xml_key_value as $key => $value) {
                    $value_service = $value($service_name) ? 1 : 0 ;
                    if( $value_service){
                        $xml_element[$key] = $servicio_pre->precio ;
                    }else if(!isset($xml_element[$key])){
                        $xml_element[$key] = $value_service;
                    }
            }
        }
        return $xml_element;
    }
    public static function generate_xml($pedido_id)
    {
        $papel_formato_ancho = 0;
        $papel_formato_alto = 0;
        $data = PedidoXMLService::get_pedido_presupuesto($pedido_id);
        $xml = new DOMDocument('1.0', 'utf-8');
        $xml_order_el = $xml->createElement('Order');
        $xml_header_el = $xml->createElement('Header');
        $offset_pedido_id = env('XML_OFFSET_CUSTOMER_ID',1000000) + $data["pedido_cliente_presupuesto"]->pedidoId;
        $xml_header_el->appendChild($xml->createElement('CustomerCode', $data["pedido_cliente_presupuesto"]->presupuestoClienteId));
        $xml_header_el->appendChild($xml->createElement('CodeNode', env('NODE_CODE_XML','SFK')));
        $xml_header_el->appendChild($xml->createElement('ExternId', $offset_pedido_id));
        $xml_header_el->appendChild($xml->createElement('NumProducts', 1));
        $xml_header_el->appendChild($xml->createElement('Date', now_db()));
        $xml_order_el->appendChild($xml_header_el);
        $xml_products_el = $xml->createElement('Products');
        $xml_product_el = $xml->createElement('Product');
        $xml_product_el->appendChild($xml->createElement('ItemId', $offset_pedido_id));
        $xml_product_el->appendChild($xml->createElement('Quantity', $data["pedido_cliente_presupuesto"]->tirada));
        $xml_product_el->appendChild($xml->createElement('Title', $data["pedido_cliente_presupuesto"]->titulo));
        $xml_product_el->appendChild($xml->createElement('Pages', $data["pedido_cliente_presupuesto"]->paginas));
        $xml_product_el->appendChild($xml->createElement('Reprint', $data["pedido_cliente_presupuesto"]->inc_rei ?? 0));

        if ($data["pedido_cliente_presupuesto"]->papel_formato_personalizado) {
            $papel_formato_ancho = $data["pedido_cliente_presupuesto"]->papelAnchoPersonalidado;
            $papel_formato_alto = $data["pedido_cliente_presupuesto"]->papelAltoPersonalidado;
        } else {
            $papel_formato_ancho = $data["pedido_cliente_presupuesto"]->lgPapelFormatoAncho;
            $papel_formato_alto = $data["pedido_cliente_presupuesto"]->lgPapelFormatoAlto;
        }
        $xml_product_el->appendChild($xml->createElement('Width', $papel_formato_ancho));
        $xml_product_el->appendChild($xml->createElement('Height', $papel_formato_alto));
        $presupuestoLineaTipoCubierta = null;
        $xml_presupuesto_lineas_el = $xml->createElement('Lines');
        ## Iterate throught presupuesto_lineas
        foreach ($data["pedido_presupuesto_lineas"] as $row) {

            if (str_contains($row->tipo, "rot") || str_contains($row->tipo, "bn") || str_contains($row->tipo, "color")) {
                $colorInterior = PedidoXMLService::get_color_interior($row);
                $xmlInside = $xml->createElement('Inside');
                $xmlInside->appendChild($xml->createElement('TypeOfPrint', $colorInterior));
                $xmlInside->appendChild($xml->createElement('HQ', str_contains($row->tipo, 'hq') ? 1 : 0));
                $xmlInside->appendChild($xml->createElement('Pages', $row->paginas));
                $xmlInside->appendChild($xml->createElement('Paper', $row->papelCode));
                $xmlInside->appendChild($xml->createElement('Weight', $row->gramaje));
                $xml_presupuesto_lineas_el->appendChild($xmlInside);
            } else if (str_contains($row->tipo, "lp_cubierta") ) {//|| str_contains($row->tipo, "sobrecubierta")
                //? If both exists presupuestoLineaTipoCubierta is override by sobreCubierta making null and not adding
                $papelCubiertaCode = $row->papelCode;
                $papelCubiertaGramaje = $row->gramaje;
                $presupuestoLineaTipoCubierta = $row->tipo == "lp_cubierta" ? $row : null;
            }
        }
        $xml_product_el->appendChild($xml_presupuesto_lineas_el);
        if ($presupuestoLineaTipoCubierta) {
            $containsTarifaAcabadoBrillo = isset($data['acabado']['Finish']) ? true : false;
            if ($containsTarifaAcabadoBrillo) {
                $acabado = "brillo";
            } else {
                $acabado = "mate";
            }
            $xmlCover = $xml->createElement('Cover');
            $xmlCover->appendChild($xml->createElement('Sides',  $presupuestoLineaTipoCubierta->paginas / 2)); 
            $xmlCover->appendChild($xml->createElement('Paper', $presupuestoLineaTipoCubierta->papelCode)); 
            $xmlCover->appendChild($xml->createElement('Weight', $presupuestoLineaTipoCubierta->gramaje));
            $xmlCover->appendChild($xml->createElement('Flaps', $data["pedido_cliente_presupuesto"]->solapas));
            $xmlCover->appendChild($xml->createElement('WidthFlaps', $data["pedido_cliente_presupuesto"]->solapas_ancho));
            $xmlCover->appendChild($xml->createElement('Finish', $acabado));
            $xml_product_el->appendChild($xmlCover);
        }
        $xml_product_el->appendChild($xml->createElement('Binding', $data['binding']));
        $xml_services_el = $xml->createElement('Services');
        $xml_services_el->appendChild($xml->createElement('Bookmark', $data["pedido_cliente_presupuesto"]->marcapaginas));
        foreach ($data['preimpresion'] as $key => $value) {
            $xml_services_el->appendChild($xml->createElement($key, $value));
        }
        foreach ($data['acabado'] as $key => $value) {
            $xml_services_el->appendChild($xml->createElement($key, $value));
        }

        $xml_product_el->appendChild($xml_services_el);
        
        $xml_envios_el = $xml->createElement('Shipments');
        foreach ($data["pedido_presupuesto_direcciones"] as $pedido_presupuesto_direccion) {
            $xml_envio_el = $xml->createElement('Shipment');
            $xml_envio_el->appendChild($xml->createElement('Qty', $pedido_presupuesto_direccion->cantidad));
            $xml_envio_el->appendChild($xml->createElement('Price', $pedido_presupuesto_direccion->precio));
            $xml_envio_el->appendChild($xml->createElement('Attention', $pedido_presupuesto_direccion->att));
            $xml_envio_el->appendChild($xml->createElement('Email', $pedido_presupuesto_direccion->email));
            $xml_envio_el->appendChild($xml->createElement('Address', $pedido_presupuesto_direccion->direccion));
            $xml_envio_el->appendChild($xml->createElement('Province', $pedido_presupuesto_direccion->provincia));
            $xml_envio_el->appendChild($xml->createElement('City', $pedido_presupuesto_direccion->municipio));
            $xml_envio_el->appendChild($xml->createElement('Zip', $pedido_presupuesto_direccion->cp));
            $xml_envio_el->appendChild($xml->createElement('CountryCode', $pedido_presupuesto_direccion->paisCode3));
            $xml_envio_el->appendChild($xml->createElement('Telephone', $pedido_presupuesto_direccion->telefono));
            $xml_envios_el->appendChild($xml_envio_el);
        }
        $xml_product_el->appendChild($xml_envios_el);
        $xml_product_el->appendChild($xml->createElement('Comments', $data["pedido_cliente_presupuesto"]->comentarios_safekat));
        $xml_product_el->appendChild($xml->createElement('CommentsClient', $data["pedido_cliente_presupuesto"]->comentarios_cliente));
        $xml_products_el->appendChild($xml_product_el);
        $xml_order_el->appendChild($xml_products_el);
        $xml->appendChild($xml_order_el);
        $file_has_suffix = hash('sha512',$offset_pedido_id);
        $file_name = PedidoXMLService::generate_xml_file_name($file_has_suffix);
        $ftp = new SafekatFtpClient();
        $ftp->uploadXML($xml->saveXML(),$file_name);
        return $data;
    }
    protected static function generate_xml_file_name(string $hash) : string
    {
        return implode("",["SafekatNew_",$hash,".xml"]);
    }
    protected static function get_binding_code(string $tipo_impresion_nombre,bool $solapas) : ?string
    {
        $solapa = $solapas ? '1' : '0';
        $key = implode("_",[$tipo_impresion_nombre,$solapa]);
        $xml_mapping_binding = 
        [
            "libroFresadoTapaBlanda_0" => 'RF',
            "libroFresadoTapaBlanda_1" => 'RFS',
            "libroCosidoTapaBlanda_0" => 'RCHV',
            "libroCosidoTapaBlanda_1" => 'RCHVS',
            "libroGrapado_0" => 'CC2',
            "libroGrapado_1" => 'CC2S',
            "libroCosidoTapaDura_0" => 'TDC',
            "libroCosidoTapaDura_1" => 'TDC',
            "libroFresadoTapaDura_0" => 'RDF',
            "libroFresadoTapaDura_1" => 'RDF',
            "libroEspiralTapaBlanda_0" => 'ESP', 
            "libroEspiralTapaBlanda_1" => 'ESP',
            "libroWireoTapaBlanda_0" => 'WIO', 
            "libroWireoTapaBlanda_1" => 'WIO', 
        ];
        return $xml_mapping_binding[$key] ?? null;
    }
    protected static function get_color_interior($pre_linea): ?string
    {
        $color_interior = null;
        $bn_tipo_array = ['lp_bn', 'lp_bnhq', 'lp_rot_bn'];
        $color_tipo_array = ['lp_color', 'lp_color_hq', 'lp_rot_color'];

        if (in_array($pre_linea->tipo, $bn_tipo_array)) {
            $color_interior = "bn";
        };
        if (in_array($pre_linea->tipo, $color_tipo_array)) {
            $color_interior = "color";
        };
        return $color_interior;
    }
}
