<?php


namespace App\Services;


use CodeIgniter\Config\BaseService;

use App\Services\PresupuestoService;


class PresupuestoClienteService extends BaseService
{
    public static function obtenerInterior($data)
    {

        $rotativa = [];
        $plana = [];
        // no se busca en plana cuando es estándar (no Premium)
        if ($data['isHq'])
            $plana = PresupuestoClienteService::obtenerPresupuestoClienteInterior($data);
        if (!$data['excluirRotativa'] && !$data['isHq'])
            $rotativa = PresupuestoClienteService::obtenerPresupuestoClienteInteriorRotativa($data);

        $total_plana = -1;
        $hay_plana = false;
        if ($data['isColor']) {
            if (count($plana) > 0) {
                if ($data['datosPedido']->paginas == $data['paginas_color']) {
                    if (count($plana[1]) > 2)
                        $total_plana += floatval($plana[1]['total_impresion']);
                    else
                        return -1;
                } else {
                    if (count($plana[0]) > 2 && count($plana[1]) > 2) {
                        $total_plana = 0.0;
                        foreach ($plana as $linea) {
                            if (count($linea) > 0)
                                $total_plana += floatval($linea['total_impresion']);
                        }
                    }
                }
            }
        } else {
            foreach ($plana as $linea) {
                if (count($linea) > 0)
                    if ($linea['tipo_linea'] == 'lp_bn' || $linea['tipo_linea'] == 'lp_bnhq') {
                        $total_plana = 0.0;
                        $total_plana = floatval($linea['total_impresion']);
                    }
            }
        }

        $total_rotativa = -1;
        if (!$data['excluirRotativa'] && count($rotativa) > 0 && $rotativa['num_formas']['posicion_formas'] != 'n/a') {
            $total_rotativa = floatval($rotativa['total_impresion']);
        }
        if ($total_plana < 0 && $total_rotativa < 0)
            return [];
        else {
            if ($total_plana > $total_rotativa)
                return $plana;
            else
                return [$rotativa];
        }
    }

    public static function obtenerCubierta($data, $return_raw=false)
    {

        $uso = $data['uso'];
        $tipo_impresion_id = $data['tipo_impresion_id'];
        $datosPedido = $data['datosPedido'];
        $papel_generico = $data['papel_generico'];
        $gramaje = $data['gramaje'];
        $isColor = $data['isColor'];
        $isHq = $data['isHq'];
        $cliente_id = $data['cliente_id'];
        $lomoRedondo = $data['lomoRedondo'];

        $lineas_cubierta = [];

        for ($i = 0; $i < 2; $i++) {

            $lineas = PresupuestoService::obtenerComparadorPlana([
                'uso' => $uso,
                'tipo_impresion_id' => $tipo_impresion_id,
                'datosPedido' => $datosPedido,
                'papel_generico' => $papel_generico,
                'gramaje' => $gramaje,
                'isColor' => $isColor,
                'isHq' => $isHq,
                'cliente_id' => $cliente_id,
                'a_favor_fibra' => $i,
                'lomoRedondo' => $lomoRedondo
            ]);

            if (count($lineas) > 0) {
                $lineas_cubierta = array_merge($lineas_cubierta, $lineas);
            }
        }
        if (count($lineas_cubierta) > 0) {

            if($return_raw){
                $lineas_cubierta = array_values(array_unique($lineas_cubierta, SORT_REGULAR));
                
                return[
                    'cubierta' => $lineas_cubierta
                ];
            }

            usort(
                $lineas_cubierta,
                function ($a, $b) {
                    $result = 0;
                    if (floatval($a['fields']['total_impresion']) > floatval($b['fields']['total_impresion']))
                        $result = 1;
                    else if (floatval($a['fields']['total_impresion']) < floatval($b['fields']['total_impresion']))
                        $result = -1;
                    return $result;
                }
            );
            $lineas_cubierta = $lineas_cubierta[0]['fields'];
            $lineas_cubierta['tipo_linea'] = 'lp_cubierta';
        }
        return $lineas_cubierta;
    }

    public static function obtenerSobrecubierta($data, $return_raw=false)
    {

        $uso = $data['uso'];
        $tipo_impresion_id = $data['tipo_impresion_id'];
        $datosPedido = $data['datosPedido'];
        $papel_generico = $data['papel_generico'];
        $gramaje = $data['gramaje'];
        $isColor = $data['isColor'];
        $isHq = $data['isHq'];
        $cliente_id = $data['cliente_id'];
        $paginas_color = $data['paginas_color'];

        $lineas_sobrecubierta = [];

        for ($i = 0; $i < 2; $i++) {

            $lineas = PresupuestoService::obtenerComparadorPlana([
                'uso' => $uso,
                'tipo_impresion_id' => $tipo_impresion_id,
                'datosPedido' => $datosPedido,
                'papel_generico' => $papel_generico,
                'gramaje' => $gramaje,
                'isColor' => $isColor,
                'isHq' => $isHq,
                'cliente_id' => $cliente_id,
                'a_favor_fibra' => $i
            ]);

            if (count($lineas) > 0) {
                $lineas_sobrecubierta = array_merge($lineas_sobrecubierta, $lineas);
            }
        }
        if (count($lineas_sobrecubierta) > 0) {

            if($return_raw){
                $lineas_sobrecubierta = array_values(array_unique($lineas_sobrecubierta, SORT_REGULAR));
                
                return[
                    'sobrecubierta' => $lineas_sobrecubierta
                ];
            }

            usort(
                $lineas_sobrecubierta,
                function ($a, $b) {
                    $result = 0;
                    if (floatval($a['fields']['total_impresion']) > floatval($b['fields']['total_impresion']))
                        $result = 1;
                    else if (floatval($a['fields']['total_impresion']) < floatval($b['fields']['total_impresion']))
                        $result = -1;
                    return $result;
                }
            );
            $lineas_sobrecubierta = $lineas_sobrecubierta[0]['fields'];
            $lineas_sobrecubierta['tipo_linea'] = 'lp_sobrecubierta';
        }
        return $lineas_sobrecubierta;
    }

    public static function obtenerGuardas($data, $return_raw=false)
    {

        $uso = $data['uso'];
        $tipo_impresion_id = $data['tipo_impresion_id'];
        $datosPedido = $data['datosPedido'];
        $papel_generico = $data['papel_generico'];
        $gramaje = $data['gramaje'];
        $isColor = $data['isColor'];
        $isHq = $data['isHq'];
        $cliente_id = $data['cliente_id'];

        $lineas_guardas = [];

        for ($i = 0; $i < 2; $i++) {

            $lineas = PresupuestoService::obtenerComparadorPlana([
                'uso' => $uso,
                'tipo_impresion_id' => $tipo_impresion_id,
                'datosPedido' => $datosPedido,
                'papel_generico' => $papel_generico,
                'gramaje' => $gramaje,
                'isColor' => $isColor,
                'isHq' => $isHq,
                'cliente_id' => $cliente_id,
                'a_favor_fibra' => $i
            ]);

            if (count($lineas) > 0) {
                $lineas_guardas = array_merge($lineas_guardas, $lineas);
            }
        }
        if (count($lineas_guardas) > 0) {

            if($return_raw){
                $lineas_guardas = array_values(array_unique($lineas_guardas, SORT_REGULAR));
                
                return[
                    'guardas' => $lineas_guardas
                ];
            }

            usort(
                $lineas_guardas,
                function ($a, $b) {
                    $result = 0;
                    if (floatval($a['fields']['total_impresion']) > floatval($b['fields']['total_impresion']))
                        $result = 1;
                    else if (floatval($a['fields']['total_impresion']) < floatval($b['fields']['total_impresion']))
                        $result = -1;
                    return $result;
                }
            );
            $lineas_guardas = $lineas_guardas[0]['fields'];
            $lineas_guardas['tipo_linea'] = 'lp_guardas';
        }
        return $lineas_guardas;
    }

    /**
     * Obtiene las lineas de plana en el presupuesto de cliente
     * Selecciona entre las más económicas
     * Parámetros:
     * - uso: en este caso esta variable está fija a 'interior'
     * - tipo: tipo de impresión
     * - datosPedido: datos del pedido
     *      * paginas: número de páginas
     *      * tirada: número de ejemplares
     *      * merma: merma
     *      * ancho: ancho del libro
     *      * alto: alto del libro
     *      * isCosido: si está cosido
     * - cliente_id: id del cliente
     * - papel_generico: papel genérico (array con id y nombre)
     * - isColor: si es a color
     * - isHq: si es alta calidad
     * - paginas_color: número de páginas a color
     */
    public static function obtenerPresupuestoClienteInterior($data, $return_raw = false)
    {

        $uso = $data['uso'];
        $tipo_impresion_id = $data['tipo_impresion_id'];
        $datosPedido = $data['datosPedido'];
        $paginas_color = $data['paginas_color'];
        if ($data['papelInteriorDiferente'] == false)
            $papel_generico = $data['papel_generico'];
        else {
            $papel_generico = $data['papel_generico']['negro'];
            if($paginas_color>0)
                $papel_generico_color = $data['papel_generico']['color'];
        }
        if ($data['papelInteriorDiferente'] == false)
            $gramaje = $data['gramaje'];
        else {
            $gramaje = $data['gramaje']['negro'];
            if($paginas_color>0)
                $gramaje_color = $data['gramaje']['color'];
        }
        $isColor = $data['isColor'];
        $isHq = $data['isHq'];
        $cliente_id = $data['cliente_id'];
        

        $paginas_negro = $datosPedido->paginas - $paginas_color;

        $linea_negro_plana = [];
        $linea_color_plana = [];

        // Negro
        if ($datosPedido->paginas > $paginas_color) {

            $datosPedido_negro = clone $datosPedido;
            $datosPedido_negro->paginas = $paginas_negro;
            for ($i = 0; $i < 2; $i++) {

                $lineas = PresupuestoService::obtenerComparadorPlana([
                    'uso' => $uso,
                    'tipo_impresion_id' => $tipo_impresion_id,
                    'datosPedido' => $datosPedido_negro,
                    'papel_generico' => $papel_generico,
                    'gramaje' => $gramaje,
                    'isColor' => false,
                    'isHq' => $isHq,
                    'cliente_id' => $cliente_id,
                    'a_favor_fibra' => $i
                ]);

                if (count($lineas) > 0) {
                    $linea_negro_plana = array_merge($linea_color_plana, $lineas);
                }
            }
            if (count($linea_negro_plana) > 0) {

                /*if($return_raw){
                    $linea_negro_plana = array_values(array_unique($linea_color_plana, SORT_REGULAR));
                    
                    return[
                        'negro' => $linea_negro_plana
                    ];
                }*/

                usort(
                    $linea_negro_plana,
                    function ($a, $b) {
                        $result = 0;
                        if (floatval($a['fields']['total_impresion']) > floatval($b['fields']['total_impresion']))
                            $result = 1;
                        else if (floatval($a['fields']['total_impresion']) < floatval($b['fields']['total_impresion']))
                            $result = -1;
                        return $result;
                    }
                );
            }
        }

        // Color
        if ($paginas_color > 0) {

            $datosPedido_color = clone $datosPedido;
            $datosPedido_color->paginas = $paginas_color;
            for ($i = 0; $i < 2; $i++) {

                if ($data['papelInteriorDiferente'] == true) {
                    $papel_generico = $papel_generico_color;
                    $gramaje = $gramaje_color;
                }
                $lineas = PresupuestoService::obtenerComparadorPlana([
                    'uso' => $uso,
                    'tipo_impresion_id' => $tipo_impresion_id,
                    'datosPedido' => $datosPedido_color,
                    'papel_generico' => $papel_generico,
                    'gramaje' => $gramaje,
                    'isColor' => true,
                    'isHq' => $isHq,
                    'cliente_id' => $cliente_id,
                    'a_favor_fibra' => $i
                ]);

                if (count($lineas) > 0) {
                    $linea_color_plana = array_merge($linea_color_plana, $lineas);
                }
            }
            if (count($linea_color_plana) > 0) {

                /*if($return_raw){
                    $linea_color_plana = array_values(array_unique($linea_color_plana, SORT_REGULAR));
                    
                    return[
                        'color' => $linea_color_plana
                    ];
                }*/

                usort(
                    $linea_color_plana,
                    function ($a, $b) {
                        $result = 0;
                        if (floatval($a['fields']['total_impresion']) > floatval($b['fields']['total_impresion']))
                            $result = 1;
                        else if (floatval($a['fields']['total_impresion']) < floatval($b['fields']['total_impresion']))
                            $result = -1;
                        return $result;
                    }
                );
            }
        }


        if($return_raw){
            $linea_negro_plana = array_values(array_unique($linea_negro_plana, SORT_REGULAR));
            $linea_color_plana = array_values(array_unique($linea_color_plana, SORT_REGULAR));
            
            return[
                'negro' => $linea_negro_plana,
                'color' => $linea_color_plana
            ];
        }
        // Si hay negro y color, y se hace con el mismo papel, hay que buscar la combinación 
        // más económica con la misma máquna
        if (
            $paginas_negro > 0 && $paginas_color > 0 && $data['papelInteriorDiferente'] == 0 &&
            count($linea_negro_plana) > 0 && count($linea_color_plana) > 0
        ) {
            $mejor_combinacion = null;
            $coste_menor = PHP_INT_MAX;
            // Iteramos ambos arrays
            foreach ($linea_color_plana as $color_item) {
                foreach ($linea_negro_plana as $negro_item) {
                    // Comparar si tienen el mismo 'maquina_id'
                    if ($color_item['fields']['maquina_id'] == $negro_item['fields']['maquina_id']) {
                        // Sumar los 'total_impresion' de ambas líneas
                        $costo_total = $color_item['fields']['total_impresion'] + $negro_item['fields']['total_impresion'];

                        // Verificar si es la combinación más barata hasta ahora
                        if ($costo_total < $coste_menor) {
                            $coste_menor = $costo_total;
                            $mejor_combinacion = [
                                'maquina_id' => $color_item['fields']['maquina_id'],
                                'costo_total' => $costo_total,
                                'color_item' => $color_item,
                                'negro_item' => $negro_item,
                            ];
                        }
                    }
                }

                // Retornar la mejor combinación encontrada
                if ($mejor_combinacion !== null) {
                    return [$mejor_combinacion['negro_item']['fields'], $mejor_combinacion['color_item']['fields']];
                } else {
                    return [];
                }
            }
        } else {
            if (count($linea_negro_plana) > 0) {
                $linea_negro_plana = $linea_negro_plana[0]['fields'];
                $linea_negro_plana['tipo_linea'] = $isHq ? 'lp_bnhq' : 'lp_bn';
            }
            if (count($linea_color_plana) > 0) {
                $linea_color_plana = $linea_color_plana[0]['fields'];
                $linea_color_plana['tipo_linea'] = $isHq ? 'lp_colorhq' : 'lp_color';
            }
        }

        return [$linea_negro_plana, $linea_color_plana];
    }

    public static function getServiciosEncuadernacionDefault($data)
    {

        $tipo_impresion_id = $data['tipo_impresion_id'] ?? -1;
        $tirada = $data['tirada'] ?? -1;
        $paginas = $data['paginas'] ?? -1;
        $ancho = $data['ancho'] ?? -1;
        $alto = $data['alto'] ?? -1;
        $POD = $data['POD'] ?? -1;
        $solapas = $data['solapas'] ?? -1;
        $paginasCuadernillo = $data['paginasCuadernillo'] ?? null;

        $model = model('App\Models\Presupuestos\PresupuestoEncuadernacionesModel');
        $values = $model->initPresupuesto($tipo_impresion_id, $solapas, $tirada, $paginas, $ancho, $alto, $POD, $paginasCuadernillo);
        return $values;
    }

    public static function getServiciosManipuladoDefault($data)
    {

        $tipo_impresion_id = $data['tipo_impresion_id'] ?? -1;
        $tirada = $data['tirada'] ?? -1;
        $POD = $data['POD'] ?? -1;
        $solapas = $data['solapas'] ?? -1;
        
        $model = model('App\Models\Presupuestos\PresupuestoManipuladosModel');
        $values = $model->initPresupuesto($tipo_impresion_id, $solapas, $tirada, $POD);
        return $values;
    }

    public static function getServiciosManipulado($data)
    {

        $tarifa_id = $data['tarifa_id'] ?? -1;
        $tirada = $data['tirada'] ?? -1;
        $POD = $data['POD'] ?? -1;

        $model = model('App\Models\Presupuestos\PresupuestoManipuladosModel');
        $values = $model->getPrecioTarifa($tarifa_id, $tirada, $POD);
        return $values;
    }

    public static function getServiciosPreimpresion($data)
    {

        $tarifa_id = $data['tarifa_id'] ?? -1;

        $model = model('App\Models\Presupuestos\PresupuestoPreimpresionesModel');
        $values = $model->getPrecioTarifa($tarifa_id);
        return $values;
    }


    public static function getServiciosExtra($data)
    {

        $tarifa_id = $data['tarifa_id'] ?? -1;

        $model = model('App\Models\Presupuestos\PresupuestoServiciosExtraModel');
        $values = $model->getPrecioTarifa($tarifa_id);
        return $values;
    }

    public static function getServiciosAcabados($data)
    {

        $tarifa_id = $data['tarifa_id'] ?? -1;
        $tirada = $data['tirada'] ?? -1;
        $POD = $data['POD'] ?? -1;

        $model = model('App\Models\Presupuestos\PresupuestoAcabadosModel');
        $values = $model->getPrecioTarifa($tarifa_id, $tirada, -1, $POD); // proveedor más barato
        return $values;
    }

    /**
     * Obtiene las lineas de rotativa en el presupuesto de cliente
     * Selecciona entre las más económicas
     * Parámetros:
     * - uso: en este caso esta variable está fija a 'interior'
     * - tipo: tipo de impresión
     * - datosPedido: datos del pedido
     *      * paginas: número de páginas
     *      * tirada: número de ejemplares
     *      * merma: merma
     *      * ancho: ancho del libro
     *      * alto: alto del libro
     *      * isCosido: si está cosido
     * - cliente_id: id del cliente
     * - papel_generico: papel genérico (array con id y nombre)
     * - isColor: si es a color
     * - isHq: si es alta calidad
     * - paginas_color: número de páginas a color
     */
    public static function obtenerPresupuestoClienteInteriorRotativa($data, $return_raw = false)
    {
        $datosPedido = $data['datosPedido'];
        $papel_generico = $data['papel_generico'];
        $gramaje = $data['gramaje'];
        $cliente_id = $data['cliente_id'];
        $paginas_color = $data['paginas_color'];

        $paginas = (object) array(
            'negro' => $datosPedido->paginas - $paginas_color,
            'color' => $paginas_color
        );

        $linea_rotativa = [];

        for ($i = 0; $i < 2; $i++) {

            $datosPedido->a_favor_fibra = $i;

            $lineas = PresupuestoService::obtenerComparadorRotativa([
                'paginas' => $paginas,
                'datosPedido' => $datosPedido,
                'papel_generico' => $papel_generico,
                'gramaje' => $gramaje,
                'cliente_id' => $cliente_id,
                'datosTipolog' => null
            ]);

            if (count($lineas) > 0) {
                $linea_rotativa = array_merge($linea_rotativa, $lineas);
            }
        }

        $linea_rotativa = array_filter($linea_rotativa, function($item) {
            return count($item['fields']['num_formas']) > 1;
        });
        
        if (count($linea_rotativa) > 0) {

            if($return_raw){
                $linea_rotativa = array_values(array_unique($linea_rotativa, SORT_REGULAR));
                
                return[
                    'rotativa' => $linea_rotativa,
                ];
            }

            usort(
                $linea_rotativa,
                function ($a, $b) {
                    $result = 0;
                    if (floatval($a['fields']['total_impresion']) > floatval($b['fields']['total_impresion']))
                        $result = 1;
                    else if (floatval($a['fields']['total_impresion']) < floatval($b['fields']['total_impresion']))
                        $result = -1;
                    return $result;
                }
            );
            $linea_rotativa = $linea_rotativa[0]['fields'];
            $linea_rotativa['tipo_linea'] = $paginas_color > 0 ? 'lp_rot_color' : 'lp_rot_bn';
        }

        return $linea_rotativa;
    }
}
